Skip to content

Commit

Permalink
powerpc: ABIv2 function calls must place target address in r12
Browse files Browse the repository at this point in the history
To establish addressability quickly, ABIv2 requires the target
address of the function being called to be in r12. Fix a number of
places in assembly code that we do indirect function calls.

We need to avoid function descriptors on ABIv2 too.

Signed-off-by: Anton Blanchard <[email protected]>
  • Loading branch information
antonblanchard committed Apr 23, 2014
1 parent 7167af7 commit cc7efbf
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 13 deletions.
4 changes: 2 additions & 2 deletions arch/powerpc/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,8 @@ system_call: /* label this so stack traces look sane */
clrldi r8,r8,32
15:
slwi r0,r0,4
ldx r10,r11,r0 /* Fetch system call handler [ptr] */
mtctr r10
ldx r12,r11,r0 /* Fetch system call handler [ptr] */
mtctr r12
bctrl /* Call handler */

syscall_exit:
Expand Down
20 changes: 11 additions & 9 deletions arch/powerpc/kernel/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -140,16 +140,18 @@ __secondary_hold:
tovirt(r26,r26)
#endif
/* All secondary cpus wait here until told to start. */
100: ld r4,__secondary_hold_spinloop-_stext(r26)
cmpdi 0,r4,0
100: ld r12,__secondary_hold_spinloop-_stext(r26)
cmpdi 0,r12,0
beq 100b

#if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
#ifdef CONFIG_PPC_BOOK3E
tovirt(r4,r4)
tovirt(r12,r12)
#endif
ld r4,0(r4) /* deref function descriptor */
mtctr r4
#if !defined(_CALL_ELF) || _CALL_ELF != 2
ld r12,0(r12) /* deref function descriptor */
#endif
mtctr r12
mr r3,r24
/*
* it may be the case that other platforms have r4 right to
Expand Down Expand Up @@ -267,8 +269,8 @@ generic_secondary_common_init:
ld r23,CPU_SPEC_RESTORE(r23)
cmpdi 0,r23,0
beq 3f
ld r23,0(r23)
mtctr r23
ld r12,0(r23)
mtctr r12
bctrl

3: LOAD_REG_ADDR(r3, spinning_secondaries) /* Decrement spinning_secondaries */
Expand Down Expand Up @@ -468,8 +470,8 @@ __after_prom_start:
/* this includes the code being */
/* executed here. */
addis r8,r3,(4f - _stext)@ha /* Jump to the copy of this code */
addi r8,r8,(4f - _stext)@l /* that we just made */
mtctr r8
addi r12,r8,(4f - _stext)@l /* that we just made */
mtctr r12
bctr

.balign 8
Expand Down
8 changes: 6 additions & 2 deletions arch/powerpc/kernel/misc_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -595,8 +595,12 @@ _GLOBAL(kexec_sequence)
stw r6,kexec_flag-1b(5)

/* clear out hardware hash page table and tlb */
ld r5,0(r27) /* deref function descriptor */
mtctr r5
#if !defined(_CALL_ELF) || _CALL_ELF != 2
ld r12,0(r27) /* deref function descriptor */
#else
mr r12,r27
#endif
mtctr r12
bctrl /* ppc_md.hpte_clear_all(void); */

/*
Expand Down

0 comments on commit cc7efbf

Please sign in to comment.