Commit 8e93fb33 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/64: provide a helper macro to load r2 with the kernel TOC

A later change stops the kernel using r2 and loads it with a poison
value.  Provide a PACATOC loading abstraction which can hide this
detail.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220926034057.2360083-5-npiggin@gmail.com
parent 754f6117
...@@ -327,6 +327,12 @@ GLUE(.,name): ...@@ -327,6 +327,12 @@ GLUE(.,name):
#ifdef __powerpc64__ #ifdef __powerpc64__
#define __LOAD_PACA_TOC(reg) \
ld reg,PACATOC(r13)
#define LOAD_PACA_TOC() \
__LOAD_PACA_TOC(r2)
#define LOAD_REG_IMMEDIATE(reg, expr) __LOAD_REG_IMMEDIATE reg, expr #define LOAD_REG_IMMEDIATE(reg, expr) __LOAD_REG_IMMEDIATE reg, expr
#define LOAD_REG_IMMEDIATE_SYM(reg, tmp, expr) \ #define LOAD_REG_IMMEDIATE_SYM(reg, tmp, expr) \
......
...@@ -371,7 +371,7 @@ exc_##n##_common: \ ...@@ -371,7 +371,7 @@ exc_##n##_common: \
ld r4,excf+EX_R11(r13); /* get back r11 */ \ ld r4,excf+EX_R11(r13); /* get back r11 */ \
mfspr r5,scratch; /* get back r13 */ \ mfspr r5,scratch; /* get back r13 */ \
SAVE_GPR(12, r1); /* save r12 in stackframe */ \ SAVE_GPR(12, r1); /* save r12 in stackframe */ \
ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ LOAD_PACA_TOC(); /* get kernel TOC into r2 */ \
mflr r6; /* save LR in stackframe */ \ mflr r6; /* save LR in stackframe */ \
mfctr r7; /* save CTR in stackframe */ \ mfctr r7; /* save CTR in stackframe */ \
mfspr r8,SPRN_XER; /* save XER in stackframe */ \ mfspr r8,SPRN_XER; /* save XER in stackframe */ \
...@@ -687,7 +687,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) ...@@ -687,7 +687,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
beq+ 1f beq+ 1f
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
ld r15,PACATOC(r13) __LOAD_PACA_TOC(r15)
ld r14,interrupt_base_book3e@got(r15) ld r14,interrupt_base_book3e@got(r15)
ld r15,__end_interrupts@got(r15) ld r15,__end_interrupts@got(r15)
cmpld cr0,r10,r14 cmpld cr0,r10,r14
...@@ -758,7 +758,7 @@ kernel_dbg_exc: ...@@ -758,7 +758,7 @@ kernel_dbg_exc:
beq+ 1f beq+ 1f
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
ld r15,PACATOC(r13) __LOAD_PACA_TOC(r15)
ld r14,interrupt_base_book3e@got(r15) ld r14,interrupt_base_book3e@got(r15)
ld r15,__end_interrupts@got(r15) ld r15,__end_interrupts@got(r15)
cmpld cr0,r10,r14 cmpld cr0,r10,r14
...@@ -883,7 +883,7 @@ kernel_dbg_exc: ...@@ -883,7 +883,7 @@ kernel_dbg_exc:
.macro SEARCH_RESTART_TABLE .macro SEARCH_RESTART_TABLE
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
ld r11,PACATOC(r13) __LOAD_PACA_TOC(r11)
ld r14,__start___restart_table@got(r11) ld r14,__start___restart_table@got(r11)
ld r15,__stop___restart_table@got(r11) ld r15,__stop___restart_table@got(r11)
#else #else
...@@ -1061,7 +1061,7 @@ bad_stack_book3e: ...@@ -1061,7 +1061,7 @@ bad_stack_book3e:
std r11,0(r1) std r11,0(r1)
ZEROIZE_GPR(12) ZEROIZE_GPR(12)
std r12,0(r11) std r12,0(r11)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
1: addi r3,r1,STACK_FRAME_OVERHEAD 1: addi r3,r1,STACK_FRAME_OVERHEAD
bl kernel_bad_stack bl kernel_bad_stack
b 1b b 1b
...@@ -1302,7 +1302,7 @@ a2_tlbinit_after_linear_map: ...@@ -1302,7 +1302,7 @@ a2_tlbinit_after_linear_map:
/* Now we branch the new virtual address mapped by this entry */ /* Now we branch the new virtual address mapped by this entry */
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
ld r5,PACATOC(r13) __LOAD_PACA_TOC(r5)
ld r3,1f@got(r5) ld r3,1f@got(r5)
#else #else
LOAD_REG_IMMEDIATE_SYM(r3, r5, 1f) LOAD_REG_IMMEDIATE_SYM(r3, r5, 1f)
......
...@@ -580,7 +580,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR) ...@@ -580,7 +580,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
std r2,GPR2(r1) /* save r2 in stackframe */ std r2,GPR2(r1) /* save r2 in stackframe */
SAVE_GPRS(3, 8, r1) /* save r3 - r8 in stackframe */ SAVE_GPRS(3, 8, r1) /* save r3 - r8 in stackframe */
mflr r9 /* Get LR, later save to stack */ mflr r9 /* Get LR, later save to stack */
ld r2,PACATOC(r13) /* get kernel TOC into r2 */ LOAD_PACA_TOC() /* get kernel TOC into r2 */
std r9,_LINK(r1) std r9,_LINK(r1)
lbz r10,PACAIRQSOFTMASK(r13) lbz r10,PACAIRQSOFTMASK(r13)
mfspr r11,SPRN_XER /* save XER in stackframe */ mfspr r11,SPRN_XER /* save XER in stackframe */
...@@ -610,7 +610,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR) ...@@ -610,7 +610,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
.macro SEARCH_RESTART_TABLE .macro SEARCH_RESTART_TABLE
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
mr r12,r2 mr r12,r2
ld r2,PACATOC(r13) LOAD_PACA_TOC()
LOAD_REG_ADDR(r9, __start___restart_table) LOAD_REG_ADDR(r9, __start___restart_table)
LOAD_REG_ADDR(r10, __stop___restart_table) LOAD_REG_ADDR(r10, __stop___restart_table)
mr r2,r12 mr r2,r12
...@@ -640,7 +640,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR) ...@@ -640,7 +640,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
.macro SEARCH_SOFT_MASK_TABLE .macro SEARCH_SOFT_MASK_TABLE
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
mr r12,r2 mr r12,r2
ld r2,PACATOC(r13) LOAD_PACA_TOC()
LOAD_REG_ADDR(r9, __start___soft_mask_table) LOAD_REG_ADDR(r9, __start___soft_mask_table)
LOAD_REG_ADDR(r10, __stop___soft_mask_table) LOAD_REG_ADDR(r10, __stop___soft_mask_table)
mr r2,r12 mr r2,r12
......
...@@ -841,7 +841,7 @@ __secondary_start: ...@@ -841,7 +841,7 @@ __secondary_start:
* before going into C code. * before going into C code.
*/ */
start_secondary_prolog: start_secondary_prolog:
ld r2,PACATOC(r13) LOAD_PACA_TOC()
li r3,0 li r3,0
std r3,0(r1) /* Zero the stack frame pointer */ std r3,0(r1) /* Zero the stack frame pointer */
bl start_secondary bl start_secondary
...@@ -981,7 +981,7 @@ start_here_common: ...@@ -981,7 +981,7 @@ start_here_common:
std r1,PACAKSAVE(r13) std r1,PACAKSAVE(r13)
/* Load the TOC (virtual address) */ /* Load the TOC (virtual address) */
ld r2,PACATOC(r13) LOAD_PACA_TOC()
/* Mark interrupts soft and hard disabled (they might be enabled /* Mark interrupts soft and hard disabled (they might be enabled
* in the PACA when doing hotplug) * in the PACA when doing hotplug)
......
...@@ -57,7 +57,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name) ...@@ -57,7 +57,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
std r0,GPR0(r1) std r0,GPR0(r1)
std r10,GPR1(r1) std r10,GPR1(r1)
std r2,GPR2(r1) std r2,GPR2(r1)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
mfcr r12 mfcr r12
li r11,0 li r11,0
/* Save syscall parameters in r3-r8 */ /* Save syscall parameters in r3-r8 */
...@@ -174,7 +174,7 @@ syscall_vectored_\name\()_restart: ...@@ -174,7 +174,7 @@ syscall_vectored_\name\()_restart:
_ASM_NOKPROBE_SYMBOL(syscall_vectored_\name\()_restart) _ASM_NOKPROBE_SYMBOL(syscall_vectored_\name\()_restart)
GET_PACA(r13) GET_PACA(r13)
ld r1,PACA_EXIT_SAVE_R1(r13) ld r1,PACA_EXIT_SAVE_R1(r13)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
ld r3,RESULT(r1) ld r3,RESULT(r1)
addi r4,r1,STACK_FRAME_OVERHEAD addi r4,r1,STACK_FRAME_OVERHEAD
li r11,IRQS_ALL_DISABLED li r11,IRQS_ALL_DISABLED
...@@ -224,7 +224,7 @@ START_BTB_FLUSH_SECTION ...@@ -224,7 +224,7 @@ START_BTB_FLUSH_SECTION
BTB_FLUSH(r10) BTB_FLUSH(r10)
END_BTB_FLUSH_SECTION END_BTB_FLUSH_SECTION
#endif #endif
ld r2,PACATOC(r13) LOAD_PACA_TOC()
mfcr r12 mfcr r12
li r11,0 li r11,0
/* Save syscall parameters in r3-r8 */ /* Save syscall parameters in r3-r8 */
...@@ -355,7 +355,7 @@ syscall_restart: ...@@ -355,7 +355,7 @@ syscall_restart:
_ASM_NOKPROBE_SYMBOL(syscall_restart) _ASM_NOKPROBE_SYMBOL(syscall_restart)
GET_PACA(r13) GET_PACA(r13)
ld r1,PACA_EXIT_SAVE_R1(r13) ld r1,PACA_EXIT_SAVE_R1(r13)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
ld r3,RESULT(r1) ld r3,RESULT(r1)
addi r4,r1,STACK_FRAME_OVERHEAD addi r4,r1,STACK_FRAME_OVERHEAD
li r11,IRQS_ALL_DISABLED li r11,IRQS_ALL_DISABLED
...@@ -502,7 +502,7 @@ interrupt_return_\srr\()_user_restart: ...@@ -502,7 +502,7 @@ interrupt_return_\srr\()_user_restart:
_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_user_restart) _ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_user_restart)
GET_PACA(r13) GET_PACA(r13)
ld r1,PACA_EXIT_SAVE_R1(r13) ld r1,PACA_EXIT_SAVE_R1(r13)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
addi r3,r1,STACK_FRAME_OVERHEAD addi r3,r1,STACK_FRAME_OVERHEAD
li r11,IRQS_ALL_DISABLED li r11,IRQS_ALL_DISABLED
stb r11,PACAIRQSOFTMASK(r13) stb r11,PACAIRQSOFTMASK(r13)
...@@ -663,7 +663,7 @@ interrupt_return_\srr\()_kernel_restart: ...@@ -663,7 +663,7 @@ interrupt_return_\srr\()_kernel_restart:
_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_kernel_restart) _ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_kernel_restart)
GET_PACA(r13) GET_PACA(r13)
ld r1,PACA_EXIT_SAVE_R1(r13) ld r1,PACA_EXIT_SAVE_R1(r13)
ld r2,PACATOC(r13) LOAD_PACA_TOC()
addi r3,r1,STACK_FRAME_OVERHEAD addi r3,r1,STACK_FRAME_OVERHEAD
li r11,IRQS_ALL_DISABLED li r11,IRQS_ALL_DISABLED
stb r11,PACAIRQSOFTMASK(r13) stb r11,PACAIRQSOFTMASK(r13)
......
...@@ -73,7 +73,7 @@ optprobe_template_entry: ...@@ -73,7 +73,7 @@ optprobe_template_entry:
* further below. * further below.
*/ */
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
ld r2,PACATOC(r13) LOAD_PACA_TOC()
#endif #endif
.global optprobe_template_op_address .global optprobe_template_op_address
......
...@@ -48,7 +48,7 @@ _GLOBAL(return_to_handler) ...@@ -48,7 +48,7 @@ _GLOBAL(return_to_handler)
* We might be called from a module. * We might be called from a module.
* Switch to our TOC to run inside the core kernel. * Switch to our TOC to run inside the core kernel.
*/ */
ld r2, PACATOC(r13) LOAD_PACA_TOC()
#else #else
stwu r1, -16(r1) stwu r1, -16(r1)
stw r3, 8(r1) stw r3, 8(r1)
......
...@@ -83,8 +83,7 @@ ...@@ -83,8 +83,7 @@
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* Save callee's TOC in the ABI compliant location */ /* Save callee's TOC in the ABI compliant location */
std r2, STK_GOT(r1) std r2, STK_GOT(r1)
ld r2,PACATOC(r13) /* get kernel TOC in r2 */ LOAD_PACA_TOC() /* get kernel TOC in r2 */
LOAD_REG_ADDR(r3, function_trace_op) LOAD_REG_ADDR(r3, function_trace_op)
ld r5,0(r3) ld r5,0(r3)
#else #else
......
...@@ -315,7 +315,7 @@ kvmppc_p9_exit_interrupt: ...@@ -315,7 +315,7 @@ kvmppc_p9_exit_interrupt:
reg = reg + 1 reg = reg + 1
.endr .endr
ld r2,PACATOC(r13) LOAD_PACA_TOC()
mflr r4 mflr r4
std r4,VCPU_LR(r3) std r4,VCPU_LR(r3)
......
...@@ -1024,7 +1024,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) ...@@ -1024,7 +1024,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
/* Restore R1/R2 so we can handle faults */ /* Restore R1/R2 so we can handle faults */
ld r1, HSTATE_HOST_R1(r13) ld r1, HSTATE_HOST_R1(r13)
ld r2, PACATOC(r13) LOAD_PACA_TOC()
mfspr r10, SPRN_SRR0 mfspr r10, SPRN_SRR0
mfspr r11, SPRN_SRR1 mfspr r11, SPRN_SRR1
...@@ -2727,7 +2727,7 @@ kvmppc_bad_host_intr: ...@@ -2727,7 +2727,7 @@ kvmppc_bad_host_intr:
std r4, _CTR(r1) std r4, _CTR(r1)
std r5, _XER(r1) std r5, _XER(r1)
std r6, SOFTE(r1) std r6, SOFTE(r1)
ld r2, PACATOC(r13) LOAD_PACA_TOC()
LOAD_REG_IMMEDIATE(3, 0x7265677368657265) LOAD_REG_IMMEDIATE(3, 0x7265677368657265)
std r3, STACK_FRAME_OVERHEAD-16(r1) std r3, STACK_FRAME_OVERHEAD-16(r1)
......
...@@ -110,7 +110,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_HV_ASSIST) ...@@ -110,7 +110,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_HV_ASSIST)
mtmsrd r2, 1 mtmsrd r2, 1
/* Reload TOC pointer. */ /* Reload TOC pointer. */
ld r2, PACATOC(r13) LOAD_PACA_TOC()
/* Save all but r0-r2, r9 & r13 */ /* Save all but r0-r2, r9 & r13 */
reg = 3 reg = 3
......
...@@ -1118,7 +1118,7 @@ tlb_load_linear: ...@@ -1118,7 +1118,7 @@ tlb_load_linear:
* we only use 1G pages for now. That might have to be changed in a * we only use 1G pages for now. That might have to be changed in a
* final implementation, especially when dealing with hypervisors * final implementation, especially when dealing with hypervisors
*/ */
ld r11,PACATOC(r13) __LOAD_PACA_TOC(r11)
ld r11,linear_map_top@got(r11) ld r11,linear_map_top@got(r11)
ld r10,0(r11) ld r10,0(r11)
tovirt(10,10) tovirt(10,10)
......
...@@ -57,7 +57,7 @@ opal_return: ...@@ -57,7 +57,7 @@ opal_return:
.long 0xa64b7b7d /* mthsrr1 r11 */ .long 0xa64b7b7d /* mthsrr1 r11 */
.long 0x2402004c /* hrfid */ .long 0x2402004c /* hrfid */
#endif #endif
ld r2,PACATOC(r13) LOAD_PACA_TOC()
ld r0,PPC_LR_STKOFF(r1) ld r0,PPC_LR_STKOFF(r1)
mtlr r0 mtlr r0
blr blr
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment