Use TOC to look up all kernel globals on powerpc64 instead of doing the

non-relocatable lis @ha, ori @l dance and hoping they are below 4 GB.

MFC after:	2 months
This commit is contained in:
Nathan Whitehorn 2015-01-18 20:00:33 +00:00
parent bb80825435
commit 9cecb88ce3
5 changed files with 44 additions and 22 deletions

View file

@ -91,6 +91,8 @@ GLOBAL(__endkernel)
GLOBAL(tmpstk)
.space TMPSTKSZ
TOC_ENTRY(tmpstk)
.text
.globl btext
btext:
@ -124,8 +126,8 @@ ASENTRY_NOPROF(__start)
ld %r2,0(%r2)
/* Set up the stack pointer */
lis %r1,(tmpstk+TMPSTKSZ-48)@ha
addi %r1,%r1,(tmpstk+TMPSTKSZ-48)@l
ld %r1,TOC_REF(tmpstk)(%r2)
addi %r1,%r1,TMPSTKSZ-48
/* Switch to 64-bit mode */
mfmsr %r9

View file

@ -307,10 +307,11 @@ CNAME(rstcode):
CNAME(rstsize) = . - CNAME(rstcode)
cpu_reset:
lis %r1,(tmpstk+TMPSTKSZ-48)@ha /* get new SP */
addi %r1,%r1,(tmpstk+TMPSTKSZ-48)@l
GET_TOCBASE(%r2)
ld %r1,TOC_REF(tmpstk)(%r2) /* get new SP */
addi %r1,%r1,(TMPSTKSZ-48)
bl CNAME(cpudep_ap_early_bootstrap) /* Set PCPU */
nop
lis %r3,1@l
@ -751,8 +752,10 @@ dbtrap:
andi. %r1,%r1,0xff00
mtsprg3 %r1
lis %r1,(tmpstk+TMPSTKSZ-48)@ha /* get new SP */
addi %r1,%r1,(tmpstk+TMPSTKSZ-48)@l
li %r1,TRAP_TOCBASE /* get new SP */
ld %r1,0(%r1)
ld %r1,TOC_REF(tmpstk)(%r1)
addi %r1,%r1,(TMPSTKSZ-48)
FRAME_SETUP(PC_DBSAVE)
/* Call C trap code: */

View file

@ -80,6 +80,12 @@
name:
#ifdef __powerpc64__
#define TOC_REF(name) __CONCAT(.L,name)
#define TOC_ENTRY(name) \
.section ".toc","aw"; \
TOC_REF(name): \
.tc name[TC],name
#define _ENTRY(name) \
.section ".text"; \
.p2align 2; \

View file

@ -52,6 +52,13 @@ GLOBAL(openfirmware_entry)
GLOBAL(rtas_entry)
.llong 0 /* RTAS entry point */
TOC_ENTRY(ofmsr)
TOC_ENTRY(ofwstk)
TOC_ENTRY(rtasmsr)
TOC_ENTRY(openfirmware_entry)
TOC_ENTRY(rtas_entry)
TOC_ENTRY(rtas_regsave)
/*
* Open Firmware Real-mode Entry Point. This is a huge pain.
*/
@ -94,16 +101,20 @@ ASENTRY_NOPROF(ofwcall)
mfmsr %r6
/* read client interface handler */
lis %r4,openfirmware_entry@ha
ld %r4,openfirmware_entry@l(%r4)
ld %r4,TOC_REF(openfirmware_entry)(%r2)
ld %r4,0(%r4)
/* Get OF stack pointer */
ld %r7,TOC_REF(ofwstk)(%r2)
addi %r7,%r7,OFWSTKSZ-32
/*
* Set the MSR to the OF value. This has the side effect of disabling
* exceptions, which is important for the next few steps.
*/
lis %r5,ofmsr@ha
ld %r5,ofmsr@l(%r5)
ld %r5,TOC_REF(ofmsr)(%r2)
ld %r5,0(%r5)
mtmsrd %r5
isync
@ -114,8 +125,7 @@ ASENTRY_NOPROF(ofwcall)
* the old MSR so we can get them back later.
*/
mr %r5,%r1
lis %r1,(ofwstk+OFWSTKSZ-32)@ha
addi %r1,%r1,(ofwstk+OFWSTKSZ-32)@l
mr %r1,%r7
std %r5,8(%r1) /* Save real stack pointer */
std %r2,16(%r1) /* Save old TOC */
std %r6,24(%r1) /* Save old MSR */
@ -212,17 +222,18 @@ ASENTRY_NOPROF(rtascall)
/* Record the old MSR */
mfmsr %r6
/* read client interface handler */
lis %r5,rtas_entry@ha
ld %r5,rtas_entry@l(%r5)
/* Read RTAS entry and reg save area pointers */
ld %r5,TOC_REF(rtas_entry)(%r2)
ld %r5,0(%r5)
ld %r8,TOC_REF(rtas_regsave)(%r2)
/*
* Set the MSR to the RTAS value. This has the side effect of disabling
* exceptions, which is important for the next few steps.
*/
lis %r7,rtasmsr@ha
ld %r7,rtasmsr@l(%r7)
ld %r7,TOC_REF(rtasmsr)(%r2)
ld %r7,0(%r7)
mtmsrd %r7
isync
@ -233,8 +244,7 @@ ASENTRY_NOPROF(rtascall)
* are below 4 GB, so this is safe.
*/
mr %r7,%r1
lis %r1,rtas_regsave@ha
addi %r1,%r1,rtas_regsave@l
mr %r1,%r8
std %r7,0(%r1) /* Save 64-bit stack pointer */
std %r2,8(%r1) /* Save TOC */
std %r6,16(%r1) /* Save MSR */

View file

@ -65,6 +65,8 @@
#include <machine/param.h>
#include <machine/asm.h>
TOC_ENTRY(blocked_lock)
/*
* void cpu_throw(struct thread *old, struct thread *new)
*/
@ -145,8 +147,7 @@ ENTRY(cpu_switch)
cpu_switchin:
#if defined(SMP) && defined(SCHED_ULE)
/* Wait for the new thread to become unblocked */
lis %r6,blocked_lock@ha
addi %r6,%r6,blocked_lock@l
ld %r6,TOC_REF(blocked_lock)(%r2)
blocked_loop:
ld %r7,TD_LOCK(%r13)
cmpd %r6,%r7