mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
[XTENSA] Remove non-rt signal handling
The non-rt signal handling was never really used, so we don't break anything. This patch also cleans up the signal stack-frame to make it independent from the processor configuration. It also improves the method used for controlling single-stepping. We now save and restore the 'icountlevel' register that controls single stepping and set or clear the saved state to enable or disable it. Signed-off-by: Chris Zankel <chris@zankel.net>
This commit is contained in:
@@ -39,6 +39,7 @@ int main(void)
|
|||||||
DEFINE(PT_LEND, offsetof (struct pt_regs, lend));
|
DEFINE(PT_LEND, offsetof (struct pt_regs, lend));
|
||||||
DEFINE(PT_LCOUNT, offsetof (struct pt_regs, lcount));
|
DEFINE(PT_LCOUNT, offsetof (struct pt_regs, lcount));
|
||||||
DEFINE(PT_SAR, offsetof (struct pt_regs, sar));
|
DEFINE(PT_SAR, offsetof (struct pt_regs, sar));
|
||||||
|
DEFINE(PT_ICOUNTLEVEL, offsetof (struct pt_regs, icountlevel));
|
||||||
DEFINE(PT_SYSCALL, offsetof (struct pt_regs, syscall));
|
DEFINE(PT_SYSCALL, offsetof (struct pt_regs, syscall));
|
||||||
DEFINE(PT_AREG, offsetof (struct pt_regs, areg[0]));
|
DEFINE(PT_AREG, offsetof (struct pt_regs, areg[0]));
|
||||||
DEFINE(PT_AREG0, offsetof (struct pt_regs, areg[0]));
|
DEFINE(PT_AREG0, offsetof (struct pt_regs, areg[0]));
|
||||||
|
|||||||
@@ -125,8 +125,9 @@ _user_exception:
|
|||||||
|
|
||||||
movi a2, 0
|
movi a2, 0
|
||||||
rsr a3, SAR
|
rsr a3, SAR
|
||||||
wsr a2, ICOUNTLEVEL
|
xsr a2, ICOUNTLEVEL
|
||||||
s32i a3, a1, PT_SAR
|
s32i a3, a1, PT_SAR
|
||||||
|
s32i a2, a1, PT_ICOUNTLEVEL
|
||||||
|
|
||||||
/* Rotate ws so that the current windowbase is at bit0. */
|
/* Rotate ws so that the current windowbase is at bit0. */
|
||||||
/* Assume ws = xxwww1yyyy. Rotate ws right, so that a2 = yyyyxxwww1 */
|
/* Assume ws = xxwww1yyyy. Rotate ws right, so that a2 = yyyyxxwww1 */
|
||||||
@@ -276,8 +277,9 @@ _kernel_exception:
|
|||||||
|
|
||||||
movi a2, 0
|
movi a2, 0
|
||||||
rsr a3, SAR
|
rsr a3, SAR
|
||||||
wsr a2, ICOUNTLEVEL
|
xsr a2, ICOUNTLEVEL
|
||||||
s32i a3, a1, PT_SAR
|
s32i a3, a1, PT_SAR
|
||||||
|
s32i a2, a1, PT_ICOUNTLEVEL
|
||||||
|
|
||||||
/* Rotate ws so that the current windowbase is at bit0. */
|
/* Rotate ws so that the current windowbase is at bit0. */
|
||||||
/* Assume ws = xxwww1yyyy. Rotate ws right, so that a2 = yyyyxxwww1 */
|
/* Assume ws = xxwww1yyyy. Rotate ws right, so that a2 = yyyyxxwww1 */
|
||||||
@@ -330,14 +332,16 @@ _kernel_exception:
|
|||||||
|
|
||||||
common_exception:
|
common_exception:
|
||||||
|
|
||||||
/* Save EXCVADDR, DEBUGCAUSE, and PC, and clear LCOUNT */
|
/* Save some registers, disable loops and clear the syscall flag. */
|
||||||
|
|
||||||
rsr a2, DEBUGCAUSE
|
rsr a2, DEBUGCAUSE
|
||||||
rsr a3, EPC_1
|
rsr a3, EPC_1
|
||||||
s32i a2, a1, PT_DEBUGCAUSE
|
s32i a2, a1, PT_DEBUGCAUSE
|
||||||
s32i a3, a1, PT_PC
|
s32i a3, a1, PT_PC
|
||||||
|
|
||||||
|
movi a2, -1
|
||||||
rsr a3, EXCVADDR
|
rsr a3, EXCVADDR
|
||||||
|
s32i a2, a1, PT_SYSCALL
|
||||||
movi a2, 0
|
movi a2, 0
|
||||||
s32i a3, a1, PT_EXCVADDR
|
s32i a3, a1, PT_EXCVADDR
|
||||||
xsr a2, LCOUNT
|
xsr a2, LCOUNT
|
||||||
@@ -450,27 +454,8 @@ common_exception_return:
|
|||||||
|
|
||||||
/* Restore the state of the task and return from the exception. */
|
/* Restore the state of the task and return from the exception. */
|
||||||
|
|
||||||
|
|
||||||
/* If we are returning from a user exception, and the process
|
|
||||||
* to run next has PT_SINGLESTEP set, we want to setup
|
|
||||||
* ICOUNT and ICOUNTLEVEL to step one instruction.
|
|
||||||
* PT_SINGLESTEP is set by sys_ptrace (ptrace.c)
|
|
||||||
*/
|
|
||||||
|
|
||||||
4: /* a2 holds GET_CURRENT(a2,a1) */
|
4: /* a2 holds GET_CURRENT(a2,a1) */
|
||||||
|
|
||||||
l32i a3, a2, TI_TASK
|
|
||||||
l32i a3, a3, TASK_PTRACE
|
|
||||||
bbci.l a3, PT_SINGLESTEP_BIT, 1f # jump if single-step flag is not set
|
|
||||||
|
|
||||||
movi a3, -2 # PT_SINGLESTEP flag is set,
|
|
||||||
movi a4, 1 # icountlevel of 1 means it won't
|
|
||||||
wsr a3, ICOUNT # start counting until after rfe
|
|
||||||
wsr a4, ICOUNTLEVEL # so setup icount & icountlevel.
|
|
||||||
isync
|
|
||||||
|
|
||||||
1:
|
|
||||||
|
|
||||||
#if XCHAL_EXTRA_SA_SIZE
|
#if XCHAL_EXTRA_SA_SIZE
|
||||||
|
|
||||||
/* For user exceptions, restore the extra state from the user's TCB. */
|
/* For user exceptions, restore the extra state from the user's TCB. */
|
||||||
@@ -665,6 +650,13 @@ common_exception_exit:
|
|||||||
wsr a3, LEND
|
wsr a3, LEND
|
||||||
wsr a2, LCOUNT
|
wsr a2, LCOUNT
|
||||||
|
|
||||||
|
/* We control single stepping through the ICOUNTLEVEL register. */
|
||||||
|
|
||||||
|
l32i a2, a1, PT_ICOUNTLEVEL
|
||||||
|
movi a3, -2
|
||||||
|
wsr a2, ICOUNTLEVEL
|
||||||
|
wsr a3, ICOUNT
|
||||||
|
|
||||||
/* Check if it was double exception. */
|
/* Check if it was double exception. */
|
||||||
|
|
||||||
l32i a0, a1, PT_DEPC
|
l32i a0, a1, PT_DEPC
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -64,6 +64,7 @@ typedef struct {
|
|||||||
# define COPROCESSOR_INFO_SIZE 8
|
# define COPROCESSOR_INFO_SIZE 8
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* XCHAL_HAVE_CP */
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
@@ -74,8 +75,11 @@ extern void save_coprocessor_registers(void*, int);
|
|||||||
# else
|
# else
|
||||||
# define release_coprocessors(task)
|
# define release_coprocessors(task)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
typedef unsigned char cp_state_t[XTENSA_CP_EXTRA_SIZE]
|
||||||
|
__attribute__ ((aligned (XTENSA_CP_EXTRA_ALIGN)));
|
||||||
|
|
||||||
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
|
|
||||||
#endif /* _XTENSA_COPROCESSOR_H */
|
#endif /* _XTENSA_COPROCESSOR_H */
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
#ifndef _XTENSA_ELF_H
|
#ifndef _XTENSA_ELF_H
|
||||||
#define _XTENSA_ELF_H
|
#define _XTENSA_ELF_H
|
||||||
|
|
||||||
#include <asm/variant/core.h>
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
/* Xtensa processor ELF architecture-magic number */
|
/* Xtensa processor ELF architecture-magic number */
|
||||||
@@ -49,7 +48,7 @@ typedef struct {
|
|||||||
elf_greg_t lcount;
|
elf_greg_t lcount;
|
||||||
elf_greg_t sar;
|
elf_greg_t sar;
|
||||||
elf_greg_t syscall;
|
elf_greg_t syscall;
|
||||||
elf_greg_t ar[XCHAL_NUM_AREGS];
|
elf_greg_t ar[64];
|
||||||
} xtensa_gregset_t;
|
} xtensa_gregset_t;
|
||||||
|
|
||||||
#define ELF_NGREG (sizeof(xtensa_gregset_t) / sizeof(elf_greg_t))
|
#define ELF_NGREG (sizeof(xtensa_gregset_t) / sizeof(elf_greg_t))
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ struct pt_regs {
|
|||||||
unsigned long windowbase; /* 48 */
|
unsigned long windowbase; /* 48 */
|
||||||
unsigned long windowstart; /* 52 */
|
unsigned long windowstart; /* 52 */
|
||||||
unsigned long syscall; /* 56 */
|
unsigned long syscall; /* 56 */
|
||||||
int reserved[2]; /* 64 */
|
unsigned long icountlevel; /* 60 */
|
||||||
|
int reserved[1]; /* 64 */
|
||||||
|
|
||||||
/* Make sure the areg field is 16 bytes aligned. */
|
/* Make sure the areg field is 16 bytes aligned. */
|
||||||
int align[0] __attribute__ ((aligned(16)));
|
int align[0] __attribute__ ((aligned(16)));
|
||||||
|
|||||||
@@ -5,21 +5,12 @@
|
|||||||
* License. See the file "COPYING" in the main directory of this archive
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2001 - 2003 Tensilica Inc.
|
* Copyright (C) 2001 - 2007 Tensilica Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XTENSA_SIGCONTEXT_H
|
#ifndef _XTENSA_SIGCONTEXT_H
|
||||||
#define _XTENSA_SIGCONTEXT_H
|
#define _XTENSA_SIGCONTEXT_H
|
||||||
|
|
||||||
#define _ASMLANGUAGE
|
|
||||||
#include <asm/processor.h>
|
|
||||||
#include <asm/coprocessor.h>
|
|
||||||
|
|
||||||
|
|
||||||
struct _cpstate {
|
|
||||||
unsigned char _cpstate[XTENSA_CP_EXTRA_SIZE];
|
|
||||||
} __attribute__ ((aligned (XTENSA_CP_EXTRA_ALIGN)));
|
|
||||||
|
|
||||||
|
|
||||||
struct sigcontext {
|
struct sigcontext {
|
||||||
unsigned long oldmask;
|
unsigned long oldmask;
|
||||||
@@ -27,18 +18,13 @@ struct sigcontext {
|
|||||||
/* CPU registers */
|
/* CPU registers */
|
||||||
unsigned long sc_pc;
|
unsigned long sc_pc;
|
||||||
unsigned long sc_ps;
|
unsigned long sc_ps;
|
||||||
unsigned long sc_wmask;
|
|
||||||
unsigned long sc_windowbase;
|
|
||||||
unsigned long sc_windowstart;
|
|
||||||
unsigned long sc_lbeg;
|
unsigned long sc_lbeg;
|
||||||
unsigned long sc_lend;
|
unsigned long sc_lend;
|
||||||
unsigned long sc_lcount;
|
unsigned long sc_lcount;
|
||||||
unsigned long sc_sar;
|
unsigned long sc_sar;
|
||||||
unsigned long sc_depc;
|
unsigned long sc_acclo;
|
||||||
unsigned long sc_dareg0;
|
unsigned long sc_acchi;
|
||||||
unsigned long sc_treg[4];
|
unsigned long sc_a[16];
|
||||||
unsigned long sc_areg[XCHAL_NUM_AREGS];
|
|
||||||
struct _cpstate *sc_cpstate;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ASM_XTENSA_SIGCONTEXT_H */
|
#endif /* _XTENSA_SIGCONTEXT_H */
|
||||||
|
|||||||
@@ -485,8 +485,8 @@ __SYSCALL(217, sys_sched_get_priority_min, 1)
|
|||||||
__SYSCALL(218, sys_sched_rr_get_interval, 2)
|
__SYSCALL(218, sys_sched_rr_get_interval, 2)
|
||||||
#define __NR_sched_yield 219
|
#define __NR_sched_yield 219
|
||||||
__SYSCALL(219, sys_sched_yield, 0)
|
__SYSCALL(219, sys_sched_yield, 0)
|
||||||
#define __NR_sigreturn 222
|
#define __NR_available222 222
|
||||||
__SYSCALL(222, xtensa_sigreturn, 0)
|
__SYSCALL(222, sys_ni_syscall, 0)
|
||||||
|
|
||||||
/* Signal Handling */
|
/* Signal Handling */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user