aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/mm
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2010-10-25 10:10:38 -0400
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2010-10-25 10:10:19 -0400
commitf6649a7e5a9ee99e9623878f4a5579cc2f6cdd51 (patch)
tree183438313c7593565980a1445f208e0ba30162cd /arch/s390/mm
parent1e54622e0403891b10f2105663e0f9dd595a1f17 (diff)
[S390] cleanup lowcore access from external interrupts
Read external interrupts parameters from the lowcore in the first level interrupt handler in entry[64].S. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-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 */