patch-2.4.15 linux/arch/s390x/kernel/traps.c
Next file: linux/arch/s390x/kernel/wrapper32.S
Previous file: linux/arch/s390x/kernel/smp.c
Back to the patch index
Back to the overall index
- Lines: 44
- Date:
Fri Nov 9 13:58:02 2001
- Orig file:
v2.4.14/linux/arch/s390x/kernel/traps.c
- Orig date:
Tue Oct 23 22:48:50 2001
diff -u --recursive --new-file v2.4.14/linux/arch/s390x/kernel/traps.c linux/arch/s390x/kernel/traps.c
@@ -92,6 +92,13 @@
static void inline do_trap(long interruption_code, int signr, char *str,
struct pt_regs *regs, siginfo_t *info)
{
+ /*
+ * We got all needed information from the lowcore and can
+ * now safely switch on interrupts.
+ */
+ if (regs->psw.mask & PSW_PROBLEM_STATE)
+ __sti();
+
if (regs->psw.mask & PSW_PROBLEM_STATE) {
struct task_struct *tsk = current;
tsk->thread.trap_no = interruption_code;
@@ -161,6 +168,14 @@
int do_sig = 0;
location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+ /*
+ * We got all needed information from the lowcore and can
+ * now safely switch on interrupts.
+ */
+ if (regs->psw.mask & PSW_PROBLEM_STATE)
+ __sti();
+
/* WARNING don't change this check back to */
/* int problem_state=(regs->psw.mask & PSW_PROBLEM_STATE); */
/* & then doing if(problem_state) an int is too small for this */
@@ -186,6 +201,14 @@
int do_sig = 0;
location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+
+ /*
+ * We got all needed information from the lowcore and can
+ * now safely switch on interrupts.
+ */
+ if (regs->psw.mask & PSW_PROBLEM_STATE)
+ __sti();
+
__asm__ volatile ("stfpc %0\n\t"
: "=m" (current->thread.fp_regs.fpc));
/* Same code should work when we implement fpu emulation */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)