commit - 6c006d3773ab84b28a9c6ab81d8c600ee6dbf943
commit + 5cc91f03efb86a3999bee23ce9f0317328ccba1e
blob - b3a828c28a57f36c489bc3560b284843c9d7c3d9
blob + 280c4e7126e34c45f11658c89ee046a63d6fb9ec
--- aim64/cpu.c
+++ aim64/cpu.c
#include <dev/ofw/openfirm.h>
#include <machine/autoconf.h>
-#include <powerpc/bat.h>
#include <machine/cpu.h>
#include <machine/trap.h>
#include <powerpc/hid.h>
blob - a78e33ffe9c7066c18d871a6c160e32a7b85c646
blob + 49b58b9b3388d9f23c905fe49f4b689a0a07928e
--- aim64/ofwreal.S
+++ aim64/ofwreal.S
#define CACHELINE 32 /* Note that this value is really hardwired */
.data
-ofentry: .long 0 /* actual entry to firmware in virtual mode */
+ofentry: .llong 0 /* actual entry to firmware in virtual mode */
-#define SRSIZE (16*4+4)
-#define SPRGSIZE (4*4)
-#define SDR1SIZE 4
-#define MSRSIZE 4
+#define SRSIZE (16*8+8)
+#define SPRGSIZE (4*8)
+#define SDR1SIZE 8
+#define MSRSIZE 8
#define SVSIZE (SRSIZE+SPRGSIZE+SDR1SIZE+MSRSIZE)
-#define BATSIZE (16*4)
+#define BATSIZE (16*8)
.global _C_LABEL(fwcall)
-_C_LABEL(fwcall): .long 0
+_C_LABEL(fwcall): .llong 0
.lcomm fwsave,SVSIZE,8
.lcomm fwbatsave,BATSIZE,8
.lcomm clsave,SVSIZE,8
.lcomm clbatsave,BATSIZE,8
-.lcomm ofsrsave,16*4,4 /* 16 words of 4 bytes to store OF segment registers */
-.lcomm srsave,16*4,4 /* 16 words of 4 bytes to swap OF segment registers*/
+.lcomm ofsrsave,16*8,4 /* 16 doublewords of 8 bytes to store OF segment registers */
+.lcomm srsave,16*8,4 /* 16 doublewords of 8 bytes to swap OF segment registers*/
.globl _C_LABEL(ofmsr)
-_C_LABEL(ofmsr): .long 0 /* area to store msr for openfirmware*/
+_C_LABEL(ofmsr): .llong 0 /* area to store msr for openfirmware*/
+ .align 3
.text
_ENTRY(_C_LABEL(ofw_init))
mflr %r31 /* save return address */
mr %r13,%r6 /* save args (only pointer used) */
lis %r8,ofentry@ha
- stw %r5,ofentry@l(%r8) /* save virtual mode firmware entry */
+ std %r5,ofentry@l(%r8) /* save virtual mode firmware entry */
lis %r4,fwcall@ha /* call ofw directly until vm setup */
- stw %r5,fwcall@l(%r4)
+ std %r5,fwcall@l(%r4)
mfmsr %r5
lis %r4,_C_LABEL(ofmsr)@ha /* save msr from openfirmware */
- stw %r5,_C_LABEL(ofmsr)@l(%r4)
+ std %r5,_C_LABEL(ofmsr)@l(%r4)
#if 0
lis %r0,(0x80001ffe)@ha
addi %r0,%r0,(0x80001ffe)@l
mr %r6,%r4 /* r4 holds pointer to BAT save area */
li %r4,0 /* save SRs */
+#if 0
1:
addis %r4,%r4,-0x10000000@ha
or. %r4,%r4,%r4
mfsrin %r5,%r4
- stwu %r5,4(%r3)
+ stdu %r5,8(%r3)
bne 1b
mfibatl %r4,0 /* save BATs */
stw %r4,0x38(%r6)
mfdbatu %r4,3
stw %r4,0x3c(%r6)
+#endif
mfsprg %r4,0 /* save SPRGs */
- stw %r4,4(%r3)
+ std %r4,8(%r3)
mfsprg %r4,1
- stw %r4,8(%r3)
+ std %r4,16(%r3)
mfsprg %r4,2
- stw %r4,12(%r3)
+ std %r4,24(%r3)
mfsprg %r4,3
- stw %r4,16(%r3)
+ std %r4,32(%r3)
mfsdr1 %r4 /* save SDR1 */
- stw %r4,20(%r3)
+ std %r4,40(%r3)
addi %r4,%r3,24
mfmsr %r4
- stw %r4,24(%r3)
+ std %r4,48(%r3)
sync
isync
mtmsr %r0
mr %r6,%r4 /* pointer to sr to restore */
li %r4,0 /* restore SRs */
+#if 0
1:
- lwzu %r5,4(%r3)
+ ldzu %r5,8(%r3)
addis %r4,%r4,-0x10000000@ha
or. %r4,%r4,%r4
mtsrin %r5,%r4
mtdbatl 3,%r4
lwz %r4,60(%r6)
mtdbatu 3,%r4
+#endif
- lwz %r4,4(%r3)
+ ld %r4,8(%r3)
mtsprg 0,4 /* restore SPRGs */
- lwz %r4,8(%r3)
+ ld %r4,16(%r3)
mtsprg 1,4
- lwz %r4,12(%r3)
+ ld %r4,24(%r3)
mtsprg 2,4
- lwz %r4,16(%r3)
+ ld %r4,32(%r3)
mtsprg 3,4
sync /* remove everything from tlb */
tlbsync
sync
- lwz %r4,20(%r3)
+ ld %r4,40(%r3)
sync
mtsdr1 %r4 /* restore SDR1 */
/* tlbia */
sync
+ /* XXX offset in 64 bit mode? */
li %r5,0x40
mtctr %r5
li %r4,0
tlbsync
sync
- lwz %r4,24(%r3)
+ ld %r4,48(%r3)
mtmsr %r4
isync
_ENTRY(_C_LABEL(fwentry))
- stwu %r1,-16(%r1)
+ stdu %r1,-32(%r1)
mflr %r4
- stw %r4,20(%r1)
- stw %r3,12(%r1) /* save arg */
+ std %r4,40(%r1)
+ std %r3,24(%r1) /* save arg */
lis %r3,clsave@ha /* save mmu values of client */
addi %r3,%r3,clsave@l
bl restoremmu
lis %r3,ofentry@ha
- lwz %r3,ofentry@l(%r3) /* get actual firmware entry */
+ ld %r3,ofentry@l(%r3) /* get actual firmware entry */
mtlr %r3
mfmsr %r4
mtmsr %r4
isync
- lwz %r3,12(%r1) /* restore arg */
+ ld %r3,24(%r1) /* restore arg */
blrl /* do actual firmware call */
- stw %r3,12(%r1) /* save return value */
+ std %r3,24(%r1) /* save return value */
lis %r3,fwsave@ha /* save mmu values of firmare */
addi %r3,%r3,fwsave@l /* (might not be necessary, but... */
addi %r4,%r4,clbatsave@l
bl restoremmu
- lwz %r4,20(%r1)
- lwz %r3,12(%r1) /* restore return value */
+ ld %r4,40(%r1)
+ ld %r3,24(%r1) /* restore return value */
mtlr %r4
+ /* XXX - should this be 32? */
addi %r1,%r1,16
blr
* OpenFirmware entry point
*/
_ENTRY(_C_LABEL(openfirmware))
- stwu %r1,-16(%r1)
+ stdu %r1,-32(%r1)
mflr %r0 /* save return address */
- stw %r0,20(%r1)
+ std %r0,40(%r1)
lis %r4,fwcall@ha
lwz %r4,fwcall@l(%r4)
mtlr %r4
blrl
- lwz %r0,20(%r1)
+ ld %r0,40(%r1)
mtlr %r0
lwz %r1,0(%r1)
blr
mfmsr %r8 /* turn off interrupts */
andi. %r0,%r8,~(PSL_EE|PSL_RI)@l
mtmsr %r0
- stw %r8,4(%r1) /* abuse return address slot */
+ std %r8,8(%r1) /* abuse return address slot */
- lwz %r5,0(%r1) /* get length of stack frame */
+ ld %r5,0(%r1) /* get length of stack frame */
subf %r5,%r1,%r5
lis %r7,firmstk+NBPG-8@ha
lis %r6,ofw_back@ha
addi %r6,%r6,ofw_back@l
subf %r4,%r5,%r7 /* make room for stack frame on new stack */
- stwu %r1,-16(%r7)
- stw %r6,4(%r7) /* setup return pointer */
+ stdu %r1,-32(%r7)
+ std %r6,8(%r7) /* setup return pointer */
- stw %r7,-16(%r4)
+ std %r7,-32(%r4)
addi %r3,%r1,%r8
addi %r1,%r4,-16
.type ofw_back,@function
ofw_back:
- lwz %r1,0(%r1) /* get callers original stack pointer */
+ ld %r1,0(%r1) /* get callers original stack pointer */
- lwz %r0,4(%r1) /* get saved msr from abused slot */
+ ld %r0,8(%r1) /* get saved msr from abused slot */
mtmsr %r0
- lwz %r1,0(%r1) /* return */
- lwz %r0,4(%r1)
+ ld %r1,0(%r1) /* return */
+ ld %r0,8(%r1)
mtlr %r0
blr