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>
This commit is contained in:
Родитель
61e2390ede
Коммит
742415d6b6
|
@ -25,6 +25,43 @@
|
||||||
* 0x7000 - 0x7fff : FWNMI data area
|
* 0x7000 - 0x7fff : FWNMI data area
|
||||||
* 0x8000 - : Early init and support code
|
* 0x8000 - : Early init and support code
|
||||||
*/
|
*/
|
||||||
|
/* Syscall routine is used twice, in reloc-off and reloc-on paths */
|
||||||
|
#define SYSCALL_PSERIES_1 \
|
||||||
|
BEGIN_FTR_SECTION \
|
||||||
|
cmpdi r0,0x1ebe ; \
|
||||||
|
beq- 1f ; \
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \
|
||||||
|
mr r9,r13 ; \
|
||||||
|
GET_PACA(r13) ; \
|
||||||
|
mfspr r11,SPRN_SRR0 ; \
|
||||||
|
0:
|
||||||
|
|
||||||
|
#define SYSCALL_PSERIES_2_RFID \
|
||||||
|
mfspr r12,SPRN_SRR1 ; \
|
||||||
|
ld r10,PACAKBASE(r13) ; \
|
||||||
|
LOAD_HANDLER(r10, system_call_entry) ; \
|
||||||
|
mtspr SPRN_SRR0,r10 ; \
|
||||||
|
ld r10,PACAKMSR(r13) ; \
|
||||||
|
mtspr SPRN_SRR1,r10 ; \
|
||||||
|
rfid ; \
|
||||||
|
b . ; /* prevent speculative execution */
|
||||||
|
|
||||||
|
#define SYSCALL_PSERIES_3 \
|
||||||
|
/* Fast LE/BE switch system call */ \
|
||||||
|
1: mfspr r12,SPRN_SRR1 ; \
|
||||||
|
xori r12,r12,MSR_LE ; \
|
||||||
|
mtspr SPRN_SRR1,r12 ; \
|
||||||
|
rfid ; /* return to userspace */ \
|
||||||
|
b . ; \
|
||||||
|
2: mfspr r12,SPRN_SRR1 ; \
|
||||||
|
andi. r12,r12,MSR_PR ; \
|
||||||
|
bne 0b ; \
|
||||||
|
mtspr SPRN_SRR0,r3 ; \
|
||||||
|
mtspr SPRN_SRR1,r4 ; \
|
||||||
|
mtspr SPRN_SDR1,r5 ; \
|
||||||
|
rfid ; \
|
||||||
|
b . ; /* prevent speculative execution */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the start of the interrupt handlers for pSeries
|
* This is the start of the interrupt handlers for pSeries
|
||||||
|
@ -207,31 +244,11 @@ system_call_pSeries:
|
||||||
KVMTEST(0xc00)
|
KVMTEST(0xc00)
|
||||||
GET_SCRATCH0(r13)
|
GET_SCRATCH0(r13)
|
||||||
#endif
|
#endif
|
||||||
BEGIN_FTR_SECTION
|
SYSCALL_PSERIES_1
|
||||||
cmpdi r0,0x1ebe
|
SYSCALL_PSERIES_2_RFID
|
||||||
beq- 1f
|
SYSCALL_PSERIES_3
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
|
|
||||||
mr r9,r13
|
|
||||||
GET_PACA(r13)
|
|
||||||
mfspr r11,SPRN_SRR0
|
|
||||||
mfspr r12,SPRN_SRR1
|
|
||||||
ld r10,PACAKBASE(r13)
|
|
||||||
LOAD_HANDLER(r10, system_call_entry)
|
|
||||||
mtspr SPRN_SRR0,r10
|
|
||||||
ld r10,PACAKMSR(r13)
|
|
||||||
mtspr SPRN_SRR1,r10
|
|
||||||
rfid
|
|
||||||
b . /* prevent speculative execution */
|
|
||||||
|
|
||||||
KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
|
KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
|
||||||
|
|
||||||
/* Fast LE/BE switch system call */
|
|
||||||
1: mfspr r12,SPRN_SRR1
|
|
||||||
xori r12,r12,MSR_LE
|
|
||||||
mtspr SPRN_SRR1,r12
|
|
||||||
rfid /* return to userspace */
|
|
||||||
b .
|
|
||||||
|
|
||||||
STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step)
|
STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step)
|
||||||
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00)
|
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00)
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче