mirror of
https://github.com/opnsense/src.git
synced 2026-04-15 14:29:58 -04:00
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:
parent
bb80825435
commit
9cecb88ce3
5 changed files with 44 additions and 22 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: */
|
||||
|
|
|
|||
|
|
@ -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; \
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue