aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/mm/fault.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/mm/fault.c')
-rw-r--r--arch/s390/mm/fault.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index b6570069b127..b4aad0c1f562 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -542,7 +542,8 @@ void pfault_fini(void)
542 : : "a" (&refbk), "m" (refbk) : "cc"); 542 : : "a" (&refbk), "m" (refbk) : "cc");
543} 543}
544 544
545static void pfault_interrupt(__u16 int_code) 545static void pfault_interrupt(unsigned int ext_int_code,
546 unsigned int param32, unsigned long param64)
546{ 547{
547 struct task_struct *tsk; 548 struct task_struct *tsk;
548 __u16 subcode; 549 __u16 subcode;
@@ -553,14 +554,18 @@ static void pfault_interrupt(__u16 int_code)
553 * in the 'cpu address' field associated with the 554 * in the 'cpu address' field associated with the
554 * external interrupt. 555 * external interrupt.
555 */ 556 */
556 subcode = S390_lowcore.cpu_addr; 557 subcode = ext_int_code >> 16;
557 if ((subcode & 0xff00) != __SUBCODE_MASK) 558 if ((subcode & 0xff00) != __SUBCODE_MASK)
558 return; 559 return;
559 560
560 /* 561 /*
561 * Get the token (= address of the task structure of the affected task). 562 * Get the token (= address of the task structure of the affected task).
562 */ 563 */
563 tsk = *(struct task_struct **) __LC_PFAULT_INTPARM; 564#ifdef CONFIG_64BIT
565 tsk = *(struct task_struct **) param64;
566#else
567 tsk = *(struct task_struct **) param32;
568#endif
564 569
565 if (subcode & 0x0080) { 570 if (subcode & 0x0080) {
566 /* signal bit is set -> a page has been swapped in by VM */ 571 /* signal bit is set -> a page has been swapped in by VM */