|
@@ -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;
|