|
@@ -208,9 +208,7 @@ syscall_debug_table:
|
|
|
mfs r11, rmsr; /* save MSR */ \
|
|
|
swi r11, r1, PT_MSR;
|
|
|
|
|
|
-#define RESTORE_REGS \
|
|
|
- lwi r11, r1, PT_MSR; \
|
|
|
- mts rmsr , r11; \
|
|
|
+#define RESTORE_REGS_GP \
|
|
|
lwi r2, r1, PT_R2; /* restore SDA */ \
|
|
|
lwi r3, r1, PT_R3; \
|
|
|
lwi r4, r1, PT_R4; \
|
|
@@ -242,6 +240,18 @@ syscall_debug_table:
|
|
|
lwi r30, r1, PT_R30; \
|
|
|
lwi r31, r1, PT_R31; /* Restore cur task reg */
|
|
|
|
|
|
+#define RESTORE_REGS \
|
|
|
+ lwi r11, r1, PT_MSR; \
|
|
|
+ mts rmsr , r11; \
|
|
|
+ RESTORE_REGS_GP
|
|
|
+
|
|
|
+#define RESTORE_REGS_RTBD \
|
|
|
+ lwi r11, r1, PT_MSR; \
|
|
|
+ andni r11, r11, MSR_EIP; /* clear EIP */ \
|
|
|
+ ori r11, r11, MSR_EE | MSR_BIP; /* set EE and BIP */ \
|
|
|
+ mts rmsr , r11; \
|
|
|
+ RESTORE_REGS_GP
|
|
|
+
|
|
|
#define SAVE_STATE \
|
|
|
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* save stack */ \
|
|
|
/* See if already in kernel mode.*/ \
|
|
@@ -427,7 +437,7 @@ C_ENTRY(ret_from_trap):
|
|
|
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
|
|
|
VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
- RESTORE_REGS;
|
|
|
+ RESTORE_REGS_RTBD;
|
|
|
addik r1, r1, PT_SIZE /* Clean up stack space. */
|
|
|
lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */
|
|
|
bri 6f;
|
|
@@ -436,7 +446,7 @@ C_ENTRY(ret_from_trap):
|
|
|
2: set_bip; /* Ints masked for state restore */
|
|
|
VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
- RESTORE_REGS;
|
|
|
+ RESTORE_REGS_RTBD;
|
|
|
addik r1, r1, PT_SIZE /* Clean up stack space. */
|
|
|
tovirt(r1,r1);
|
|
|
6:
|
|
@@ -612,7 +622,7 @@ C_ENTRY(ret_from_exc):
|
|
|
VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
|
|
|
- RESTORE_REGS;
|
|
|
+ RESTORE_REGS_RTBD;
|
|
|
addik r1, r1, PT_SIZE /* Clean up stack space. */
|
|
|
|
|
|
lwi r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer. */
|
|
@@ -621,7 +631,7 @@ C_ENTRY(ret_from_exc):
|
|
|
2: set_bip; /* Ints masked for state restore */
|
|
|
VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
- RESTORE_REGS;
|
|
|
+ RESTORE_REGS_RTBD;
|
|
|
addik r1, r1, PT_SIZE /* Clean up stack space. */
|
|
|
|
|
|
tovirt(r1,r1);
|
|
@@ -847,7 +857,7 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
|
|
|
VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
/* MS: Restore all regs */
|
|
|
- RESTORE_REGS
|
|
|
+ RESTORE_REGS_RTBD
|
|
|
addik r1, r1, PT_SIZE /* Clean up stack space */
|
|
|
lwi r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer */
|
|
|
DBTRAP_return_user: /* MS: Make global symbol for debugging */
|
|
@@ -858,7 +868,7 @@ DBTRAP_return_user: /* MS: Make global symbol for debugging */
|
|
|
2: VM_OFF;
|
|
|
tophys(r1,r1);
|
|
|
/* MS: Restore all regs */
|
|
|
- RESTORE_REGS
|
|
|
+ RESTORE_REGS_RTBD
|
|
|
lwi r14, r1, PT_R14;
|
|
|
lwi r16, r1, PT_PC;
|
|
|
addik r1, r1, PT_SIZE; /* MS: Clean up stack space */
|