diff options
| author | Michael Neuling <mikey@neuling.org> | 2012-11-02 02:16:01 -0400 |
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-11-14 23:08:04 -0500 |
| commit | 742415d6b66bf09e3e73280178ef7ec85c90b7ee (patch) | |
| tree | cf0065c6665688a4148cd9a02186223b3bb05b46 /arch/powerpc | |
| parent | 61e2390ede3cea186cc01f5f3d0c9eb570c42c40 (diff) | |
powerpc: Turn syscall handler into macros
This turns the syscall handler into macros as we are going to want to reuse
them again later.
Signed-off-by: Matt Evans <matt@ozlabs.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 0969b7ff0f8..85b3c7e9dd6 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -25,6 +25,43 @@ | |||
| 25 | * 0x7000 - 0x7fff : FWNMI data area | 25 | * 0x7000 - 0x7fff : FWNMI data area |
| 26 | * 0x8000 - : Early init and support code | 26 | * 0x8000 - : Early init and support code |
| 27 | */ | 27 | */ |
| 28 | /* Syscall routine is used twice, in reloc-off and reloc-on paths */ | ||
| 29 | #define SYSCALL_PSERIES_1 \ | ||
| 30 | BEGIN_FTR_SECTION \ | ||
| 31 | cmpdi r0,0x1ebe ; \ | ||
| 32 | beq- 1f ; \ | ||
| 33 | END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \ | ||
| 34 | mr r9,r13 ; \ | ||
| 35 | GET_PACA(r13) ; \ | ||
| 36 | mfspr r11,SPRN_SRR0 ; \ | ||
| 37 | 0: | ||
| 38 | |||
| 39 | #define SYSCALL_PSERIES_2_RFID \ | ||
| 40 | mfspr r12,SPRN_SRR1 ; \ | ||
| 41 | ld r10,PACAKBASE(r13) ; \ | ||
| 42 | LOAD_HANDLER(r10, system_call_entry) ; \ | ||
| 43 | mtspr SPRN_SRR0,r10 ; \ | ||
| 44 | ld r10,PACAKMSR(r13) ; \ | ||
| 45 | mtspr SPRN_SRR1,r10 ; \ | ||
| 46 | rfid ; \ | ||
| 47 | b . ; /* prevent speculative execution */ | ||
| 48 | |||
| 49 | #define SYSCALL_PSERIES_3 \ | ||
| 50 | /* Fast LE/BE switch system call */ \ | ||
| 51 | 1: mfspr r12,SPRN_SRR1 ; \ | ||
| 52 | xori r12,r12,MSR_LE ; \ | ||
| 53 | mtspr SPRN_SRR1,r12 ; \ | ||
| 54 | rfid ; /* return to userspace */ \ | ||
| 55 | b . ; \ | ||
| 56 | 2: mfspr r12,SPRN_SRR1 ; \ | ||
| 57 | andi. r12,r12,MSR_PR ; \ | ||
| 58 | bne 0b ; \ | ||
| 59 | mtspr SPRN_SRR0,r3 ; \ | ||
| 60 | mtspr SPRN_SRR1,r4 ; \ | ||
| 61 | mtspr SPRN_SDR1,r5 ; \ | ||
| 62 | rfid ; \ | ||
| 63 | b . ; /* prevent speculative execution */ | ||
| 64 | |||
| 28 | 65 | ||
| 29 | /* | 66 | /* |
| 30 | * This is the start of the interrupt handlers for pSeries | 67 | * This is the start of the interrupt handlers for pSeries |
| @@ -207,31 +244,11 @@ system_call_pSeries: | |||
| 207 | KVMTEST(0xc00) | 244 | KVMTEST(0xc00) |
| 208 | GET_SCRATCH0(r13) | 245 | GET_SCRATCH0(r13) |
| 209 | #endif | 246 | #endif |
| 210 | BEGIN_FTR_SECTION | 247 | SYSCALL_PSERIES_1 |
| 211 | cmpdi r0,0x1ebe | 248 | SYSCALL_PSERIES_2_RFID |
| 212 | beq- 1f | 249 | SYSCALL_PSERIES_3 |
| 213 | END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) | ||
| 214 | mr r9,r13 | ||
| 215 | GET_PACA(r13) | ||
| 216 | mfspr r11,SPRN_SRR0 | ||
| 217 | mfspr r12,SPRN_SRR1 | ||
| 218 | ld r10,PACAKBASE(r13) | ||
| 219 | LOAD_HANDLER(r10, system_call_entry) | ||
| 220 | mtspr SPRN_SRR0,r10 | ||
| 221 | ld r10,PACAKMSR(r13) | ||
| 222 | mtspr SPRN_SRR1,r10 | ||
| 223 | rfid | ||
| 224 | b . /* prevent speculative execution */ | ||
| 225 | |||
| 226 | KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00) | 250 | KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00) |
| 227 | 251 | ||
| 228 | /* Fast LE/BE switch system call */ | ||
| 229 | 1: mfspr r12,SPRN_SRR1 | ||
| 230 | xori r12,r12,MSR_LE | ||
| 231 | mtspr SPRN_SRR1,r12 | ||
| 232 | rfid /* return to userspace */ | ||
| 233 | b . | ||
| 234 | |||
| 235 | STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step) | 252 | STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step) |
| 236 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00) | 253 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00) |
| 237 | 254 | ||
