mirror of https://gitee.com/openkylin/linux.git
[IA64] Handle debug traps in fsys mode
We need to handle debug traps in fsys mode non-fatally. They can happen now that we have fsyscalls which contain probe instructions. Signed-off-by: Jason Uhlenkott <jasonuhl@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
6d6e420005
commit
15029285dc
|
@ -530,12 +530,15 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
|
|||
if (fsys_mode(current, ®s)) {
|
||||
extern char __kernel_syscall_via_break[];
|
||||
/*
|
||||
* Got a trap in fsys-mode: Taken Branch Trap and Single Step trap
|
||||
* need special handling; Debug trap is not supposed to happen.
|
||||
* Got a trap in fsys-mode: Taken Branch Trap
|
||||
* and Single Step trap need special handling;
|
||||
* Debug trap is ignored (we disable it here
|
||||
* and re-enable it in the lower-privilege trap).
|
||||
*/
|
||||
if (unlikely(vector == 29)) {
|
||||
die("Got debug trap in fsys-mode---not supposed to happen!",
|
||||
®s, 0);
|
||||
set_thread_flag(TIF_DB_DISABLED);
|
||||
ia64_psr(®s)->db = 0;
|
||||
ia64_psr(®s)->lp = 1;
|
||||
return;
|
||||
}
|
||||
/* re-do the system call via break 0x100000: */
|
||||
|
@ -589,10 +592,19 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
|
|||
case 34:
|
||||
if (isr & 0x2) {
|
||||
/* Lower-Privilege Transfer Trap */
|
||||
|
||||
/* If we disabled debug traps during an fsyscall,
|
||||
* re-enable them here.
|
||||
*/
|
||||
if (test_thread_flag(TIF_DB_DISABLED)) {
|
||||
clear_thread_flag(TIF_DB_DISABLED);
|
||||
ia64_psr(®s)->db = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Just clear PSR.lp and then return immediately: all the
|
||||
* interesting work (e.g., signal delivery is done in the kernel
|
||||
* exit path).
|
||||
* Just clear PSR.lp and then return immediately:
|
||||
* all the interesting work (e.g., signal delivery)
|
||||
* is done in the kernel exit path.
|
||||
*/
|
||||
ia64_psr(®s)->lp = 0;
|
||||
return;
|
||||
|
|
|
@ -93,6 +93,7 @@ struct thread_info {
|
|||
#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
||||
#define TIF_MEMDIE 17
|
||||
#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */
|
||||
#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */
|
||||
|
||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||
|
@ -100,9 +101,10 @@ struct thread_info {
|
|||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||
#define _TIF_SIGDELAYED (1 << TIF_SIGDELAYED)
|
||||
#define _TIF_SIGDELAYED (1 << TIF_SIGDELAYED)
|
||||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
|
||||
#define _TIF_MCA_INIT (1 << TIF_MCA_INIT)
|
||||
#define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED)
|
||||
|
||||
/* "work to do on user-return" bits */
|
||||
#define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SIGDELAYED)
|
||||
|
|
Loading…
Reference in New Issue