diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2010-10-25 10:10:38 -0400 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-10-25 10:10:19 -0400 |
commit | f6649a7e5a9ee99e9623878f4a5579cc2f6cdd51 (patch) | |
tree | 183438313c7593565980a1445f208e0ba30162cd /arch/s390/mm | |
parent | 1e54622e0403891b10f2105663e0f9dd595a1f17 (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.c | 11 |
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 | ||
545 | static void pfault_interrupt(__u16 int_code) | 545 | static 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 */ |