|
|
@ -37,14 +37,12 @@
|
|
|
|
.set BIOS_STACK_1,_fstack-8
|
|
|
|
.set BIOS_STACK_1,_fstack-8
|
|
|
|
|
|
|
|
|
|
|
|
.macro load32 rx,v
|
|
|
|
.macro load32 rx,v
|
|
|
|
li \rx,0
|
|
|
|
lis \rx,\v>>16
|
|
|
|
oris \rx,\rx,\v>>16
|
|
|
|
|
|
|
|
ori \rx,\rx,\v&0x0000FFFF
|
|
|
|
ori \rx,\rx,\v&0x0000FFFF
|
|
|
|
.endm
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
|
|
.macro load16swiz rx,v
|
|
|
|
.macro load16swiz rx,v
|
|
|
|
li \rx,0
|
|
|
|
lis \rx,(\v<<8)&0xFF00
|
|
|
|
ori \rx,\rx,(\v<<8)&0xFF00
|
|
|
|
|
|
|
|
ori \rx,\rx,(\v>>8)&0x00FF
|
|
|
|
ori \rx,\rx,(\v>>8)&0x00FF
|
|
|
|
.endm
|
|
|
|
.endm
|
|
|
|
|
|
|
|
|
|
|
@ -75,9 +73,9 @@
|
|
|
|
.set BIOS_STACK_0,_stack_0
|
|
|
|
.set BIOS_STACK_0,_stack_0
|
|
|
|
.endif
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
#.ifndef BIOS_STACK_1
|
|
|
|
.ifndef BIOS_STACK_1
|
|
|
|
#.set BIOS_STACK_1,_stack_1
|
|
|
|
.set BIOS_STACK_1,_stack_1
|
|
|
|
#.endif
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
.section .text
|
|
|
|
.section .text
|
|
|
|
|
|
|
|
|
|
|
@ -85,11 +83,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
.org 0x000
|
|
|
|
.org 0x000
|
|
|
|
_start:
|
|
|
|
_start:
|
|
|
|
int_000:
|
|
|
|
|
|
|
|
b boot_start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ints need to handle save/restore and call to isr (like uart_isr())
|
|
|
|
.ifdef BIOS_LE
|
|
|
|
# enable in a2node when it's safe (stack set up, etc.)
|
|
|
|
# a2o boots in 32Be w/erats set up for BE; rewrite I[15],D[31]
|
|
|
|
|
|
|
|
# 0000000000000240 <_start>:
|
|
|
|
|
|
|
|
# 240: 00 8c 60 3c lis r3,-29696
|
|
|
|
|
|
|
|
# 244: 1f 00 00 38 li r0,31
|
|
|
|
|
|
|
|
# 248: 95 00 40 38 li r2,149
|
|
|
|
|
|
|
|
# 24c: 00 00 80 38 li r4,0
|
|
|
|
|
|
|
|
# 250: 3f 02 00 39 li r8,575
|
|
|
|
|
|
|
|
# 254: a6 fb 7c 7c mtspr 1020,r3
|
|
|
|
|
|
|
|
# 258: a6 11 40 7c eratwe r2,r0,2
|
|
|
|
|
|
|
|
# 25c: a6 09 80 7c eratwe r4,r0,1
|
|
|
|
|
|
|
|
# 260: a6 01 00 7d mtfprwa f8,r0
|
|
|
|
|
|
|
|
# 264: 2c 01 00 4c isync
|
|
|
|
|
|
|
|
# 268: 00 88 60 3c lis r3,-30720
|
|
|
|
|
|
|
|
# 26c: 0f 00 00 38 li r0,15
|
|
|
|
|
|
|
|
# 270: bf 00 40 38 li r2,191
|
|
|
|
|
|
|
|
# 274: 00 00 80 38 li r4,0
|
|
|
|
|
|
|
|
# 278: 3f 02 00 39 li r8,575
|
|
|
|
|
|
|
|
# 27c: a6 fb 7c 7c mtspr 1020,r3
|
|
|
|
|
|
|
|
# 280: a6 11 40 7c eratwe r2,r0,2
|
|
|
|
|
|
|
|
# 284: a6 09 80 7c eratwe r4,r0,1
|
|
|
|
|
|
|
|
# 288: a6 01 00 7d mtfprwa f8,r0
|
|
|
|
|
|
|
|
# 28c: 2c 01 00 4c isync
|
|
|
|
|
|
|
|
# 290: 00 00 40 39 li r10,0
|
|
|
|
|
|
|
|
# 294: 02 80 4a 65 oris r10,r10,32770
|
|
|
|
|
|
|
|
# 298: 00 b0 4a 61 ori r10,r10,45056
|
|
|
|
|
|
|
|
# 29c: 24 01 40 7d mtmsr r10
|
|
|
|
|
|
|
|
# 2a0: 2c 01 00 4c isync
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.long 0x008c603c
|
|
|
|
|
|
|
|
.long 0x1f000038
|
|
|
|
|
|
|
|
.long 0x95004038
|
|
|
|
|
|
|
|
.long 0x00008038
|
|
|
|
|
|
|
|
.long 0x3f020039
|
|
|
|
|
|
|
|
.long 0xa6fb7c7c
|
|
|
|
|
|
|
|
.long 0xa611407c
|
|
|
|
|
|
|
|
.long 0xa609807c
|
|
|
|
|
|
|
|
.long 0xa601007d
|
|
|
|
|
|
|
|
.long 0x2c01004c
|
|
|
|
|
|
|
|
.long 0x0088603c
|
|
|
|
|
|
|
|
.long 0x0f000038
|
|
|
|
|
|
|
|
.long 0xbf004038
|
|
|
|
|
|
|
|
.long 0x00008038
|
|
|
|
|
|
|
|
.long 0x3f020039
|
|
|
|
|
|
|
|
.long 0xa6fb7c7c
|
|
|
|
|
|
|
|
.long 0xa611407c
|
|
|
|
|
|
|
|
.long 0xa609807c
|
|
|
|
|
|
|
|
.long 0xa601007d
|
|
|
|
|
|
|
|
.long 0x2c01004c
|
|
|
|
|
|
|
|
# stay in 32b mode until done with common code
|
|
|
|
|
|
|
|
#.long 0x00004039
|
|
|
|
|
|
|
|
#.long 0x02804a65
|
|
|
|
|
|
|
|
#.long 0x00b04a61
|
|
|
|
|
|
|
|
#.long 0x2401407d
|
|
|
|
|
|
|
|
#.long 0x2c01004c
|
|
|
|
|
|
|
|
#.long 0x02040048
|
|
|
|
|
|
|
|
# isync
|
|
|
|
|
|
|
|
# li r10,0
|
|
|
|
|
|
|
|
# oris r10,r10,32770
|
|
|
|
|
|
|
|
# ori r10,r10,45056
|
|
|
|
|
|
|
|
# mtmsr r10
|
|
|
|
|
|
|
|
# isync
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.else
|
|
|
|
|
|
|
|
|
|
|
|
# critical input
|
|
|
|
# critical input
|
|
|
|
.org 0x020
|
|
|
|
.org 0x020
|
|
|
@ -110,6 +168,13 @@ int_040:
|
|
|
|
int_060:
|
|
|
|
int_060:
|
|
|
|
b .
|
|
|
|
b .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b boot_start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ints need to handle save/restore and call to isr (like uart_isr())
|
|
|
|
|
|
|
|
# enable in a2node when it's safe (stack set up, etc.)
|
|
|
|
|
|
|
|
|
|
|
|
# isi
|
|
|
|
# isi
|
|
|
|
.org 0x080
|
|
|
|
.org 0x080
|
|
|
|
int_080:
|
|
|
|
int_080:
|
|
|
@ -252,18 +317,20 @@ boot_start:
|
|
|
|
bne init_t123
|
|
|
|
bne init_t123
|
|
|
|
|
|
|
|
|
|
|
|
lis r3,0x8C00 # 32=ecl 36:37=tlbsel (10=i, 11=d)
|
|
|
|
lis r3,0x8C00 # 32=ecl 36:37=tlbsel (10=i, 11=d)
|
|
|
|
|
|
|
|
mtspr mmucr0,r3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.ifndef BIOS_LE
|
|
|
|
# derat 31 @00000000
|
|
|
|
# derat 31 @00000000
|
|
|
|
li r0,0x001F # entry #31
|
|
|
|
li r0,0x001F # entry #31
|
|
|
|
li r2,0x0015 # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
li r2,0x0015 # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
li r4,0 # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
li r4,0 # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
li r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
|
li r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
|
|
|
|
|
|
|
|
|
mtspr mmucr0,r3
|
|
|
|
|
|
|
|
eratwe r2,r0,2
|
|
|
|
eratwe r2,r0,2
|
|
|
|
eratwe r4,r0,1
|
|
|
|
eratwe r4,r0,1
|
|
|
|
eratwe r8,r0,0
|
|
|
|
eratwe r8,r0,0
|
|
|
|
isync
|
|
|
|
isync
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
load32 r10,BIOS_ERATW2 # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
load32 r10,BIOS_ERATW2 # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
|
|
|
|
|
|
|
@ -280,7 +347,8 @@ boot_start:
|
|
|
|
|
|
|
|
|
|
|
|
# derat 29 @<CSR_START> I=1!!!
|
|
|
|
# derat 29 @<CSR_START> I=1!!!
|
|
|
|
li r0,0x001D # entry #29
|
|
|
|
li r0,0x001D # entry #29
|
|
|
|
ori r10,r10,0x0F00 # word 2 with WIMG=F
|
|
|
|
#ori r10,r10,0x0F00 # word 2 with WIMG=F - doesn't work for 64LE
|
|
|
|
|
|
|
|
li r10,0x0F3F # WIMG=F BE
|
|
|
|
load32 r4,CSR_START # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
load32 r4,CSR_START # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
load32 r8,CSR_START
|
|
|
|
load32 r8,CSR_START
|
|
|
|
ori r8,r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
|
ori r8,r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
@ -291,18 +359,20 @@ boot_start:
|
|
|
|
isync
|
|
|
|
isync
|
|
|
|
|
|
|
|
|
|
|
|
lis r3,0x8800 # 32=ecl 36:37=tlbsel (10=i, 11=d)
|
|
|
|
lis r3,0x8800 # 32=ecl 36:37=tlbsel (10=i, 11=d)
|
|
|
|
|
|
|
|
mtspr mmucr0,r3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.ifndef BIOS_LE
|
|
|
|
# ierat 15 @00000000
|
|
|
|
# ierat 15 @00000000
|
|
|
|
li r0,0x000F # entry #15
|
|
|
|
li r0,0x000F # entry #15
|
|
|
|
li r2,0x003F # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
li r2,0x003F # word 2 wlc=40:41 rsvd=42 u=44:47 r=48 c=49 wimge=52:56 vf=57 ux/sx=58:59 uw/sw=60:61 ur/sr=62:63
|
|
|
|
li r4,0 # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
li r4,0 # word 1 rpn(32:51)=32:51 rpn(22:31)=54:63
|
|
|
|
li r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
|
li r8,0x023F # word 0 epn=32:51 class=52:53 v=54 x=55 size=56:59 thrd=60:63 size: 0001=4K 0011=64K 0101=1M 0111=16M 1010=1G
|
|
|
|
|
|
|
|
|
|
|
|
mtspr mmucr0,r3
|
|
|
|
|
|
|
|
eratwe r2,r0,2
|
|
|
|
eratwe r2,r0,2
|
|
|
|
eratwe r4,r0,1
|
|
|
|
eratwe r4,r0,1
|
|
|
|
eratwe r8,r0,0
|
|
|
|
eratwe r8,r0,0
|
|
|
|
isync
|
|
|
|
isync
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
# *** leave the init'd entry 14 for MT access to FFFFFFC0
|
|
|
|
# *** leave the init'd entry 14 for MT access to FFFFFFC0
|
|
|
|
# ierat 13 @<BIOS_START>
|
|
|
|
# ierat 13 @<BIOS_START>
|
|
|
@ -330,6 +400,8 @@ init_t0:
|
|
|
|
########################################################################################################################################
|
|
|
|
########################################################################################################################################
|
|
|
|
# VMA/LMA: copy .data, clear .bss
|
|
|
|
# VMA/LMA: copy .data, clear .bss
|
|
|
|
rominit:
|
|
|
|
rominit:
|
|
|
|
|
|
|
|
.ifdef BIOS_32
|
|
|
|
|
|
|
|
|
|
|
|
lis r1,_fdata_rom@h
|
|
|
|
lis r1,_fdata_rom@h
|
|
|
|
ori r1,r1,_fdata_rom@l
|
|
|
|
ori r1,r1,_fdata_rom@l
|
|
|
|
lis r2,_fdata@h
|
|
|
|
lis r2,_fdata@h
|
|
|
@ -341,6 +413,23 @@ rominit:
|
|
|
|
lis r5,_ebss@h
|
|
|
|
lis r5,_ebss@h
|
|
|
|
ori r5,r5,_ebss@l
|
|
|
|
ori r5,r5,_ebss@l
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bl +4
|
|
|
|
|
|
|
|
1: mflr r12
|
|
|
|
|
|
|
|
addis r12,r12,(.TOC.-1b)@h
|
|
|
|
|
|
|
|
addi r12,r12,(.TOC.-1b)@l # now gots toc
|
|
|
|
|
|
|
|
ld r1,_fdata_rom@got(r12)
|
|
|
|
|
|
|
|
ld r2,_fdata@got(r12)
|
|
|
|
|
|
|
|
ld r3,_edata_rom@got(r12)
|
|
|
|
|
|
|
|
ld r4,_fbss@got(r12)
|
|
|
|
|
|
|
|
ld r5,_ebss@got(r12)
|
|
|
|
|
|
|
|
ld r6,_fstack@got(r12)
|
|
|
|
|
|
|
|
addi r6,r6,-32
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subf r9,r1,r3
|
|
|
|
subf r9,r1,r3
|
|
|
|
srwi. r9,r9,2
|
|
|
|
srwi. r9,r9,2
|
|
|
|
beq romcopy_done
|
|
|
|
beq romcopy_done
|
|
|
@ -389,13 +478,19 @@ romclear_done:
|
|
|
|
# lis r1,_stack_0@h
|
|
|
|
# lis r1,_stack_0@h
|
|
|
|
# ori r1,r1,_stack_0@l
|
|
|
|
# ori r1,r1,_stack_0@l
|
|
|
|
# this requires data load
|
|
|
|
# this requires data load
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.ifdef BIOS_32
|
|
|
|
lwz r1,stack_0(r0)
|
|
|
|
lwz r1,stack_0(r0)
|
|
|
|
|
|
|
|
.else
|
|
|
|
|
|
|
|
mr r1,r6
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
b boot_complete
|
|
|
|
b boot_complete
|
|
|
|
|
|
|
|
|
|
|
|
# except T0
|
|
|
|
# except T0
|
|
|
|
|
|
|
|
|
|
|
|
init_t123:
|
|
|
|
init_t123:
|
|
|
|
|
|
|
|
# NEEDS 64LE VERSION!!! once i figure out the right way
|
|
|
|
|
|
|
|
|
|
|
|
# set up BIOS msr
|
|
|
|
# set up BIOS msr
|
|
|
|
|
|
|
|
|
|
|
@ -411,14 +506,45 @@ init_t123:
|
|
|
|
boot_complete:
|
|
|
|
boot_complete:
|
|
|
|
|
|
|
|
|
|
|
|
# set up thread and hop to it
|
|
|
|
# set up thread and hop to it
|
|
|
|
|
|
|
|
.ifdef BIOS_32
|
|
|
|
|
|
|
|
|
|
|
|
lis r3,main@h
|
|
|
|
lis r3,main@h
|
|
|
|
ori r3,r3,main@l
|
|
|
|
ori r3,r3,main@l
|
|
|
|
mtctr r3
|
|
|
|
mtctr r3
|
|
|
|
mfspr r3,tir # who am i?
|
|
|
|
mfspr r3,tir # who am i?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.else
|
|
|
|
|
|
|
|
bl +4
|
|
|
|
|
|
|
|
0: mflr r2
|
|
|
|
|
|
|
|
addis r2,r2,(.TOC.-0b)@h
|
|
|
|
|
|
|
|
addi r2,r2,(.TOC.-0b)@l # set toc
|
|
|
|
|
|
|
|
ld r3,main@got(r2)
|
|
|
|
|
|
|
|
addi r3,r3,8 # <main+8>
|
|
|
|
|
|
|
|
mtctr r3
|
|
|
|
|
|
|
|
li r3,0 # argc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.endif
|
|
|
|
|
|
|
|
|
|
|
|
bctrl
|
|
|
|
bctrl
|
|
|
|
b kernel_return
|
|
|
|
b kernel_return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wtf: # huh? what did linux guys do to the good ol 32b stuff?
|
|
|
|
|
|
|
|
bl main
|
|
|
|
|
|
|
|
ba main
|
|
|
|
|
|
|
|
ba main@got
|
|
|
|
|
|
|
|
lwz r1,main(r0)
|
|
|
|
|
|
|
|
lwz r1,main@got(r0)
|
|
|
|
|
|
|
|
uwatt:
|
|
|
|
|
|
|
|
bl +4
|
|
|
|
|
|
|
|
0: mflr r2
|
|
|
|
|
|
|
|
# /* Get our TOC */
|
|
|
|
|
|
|
|
addis r1,r2,(.TOC.-0b)@h
|
|
|
|
|
|
|
|
addi r2,r2,(.TOC.-0b)@l
|
|
|
|
|
|
|
|
ld r3,_fdata@got(r2)
|
|
|
|
|
|
|
|
wtf2:
|
|
|
|
|
|
|
|
ld r3,main@got(r2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
.ifdef BIOS_32
|
|
|
|
.ifdef BIOS_32
|
|
|
|