📄 ofwboot.s
字号:
lwz %r3,16(%r1)
/* Restore registers */
lwz %r8,28(%r1)
mtlr %r8
lwz %r9,24(%r1)
lwz %r8,20(%r1)
addi %r1,%r1,32
/* Return */
blr
ofw_open:
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,32
/* Store r8, r9, lr */
stw %r8,20(%r1)
stw %r9,24(%r1)
mflr %r8
stw %r8,28(%r1)
/* Get open name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_open_name - _start
stw %r9,0(%r1)
/* 1 Argument and 1 return */
li %r9,1
stw %r9,4(%r1)
stw %r9,8(%r1)
stw %r3,12(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
lwz %r3,16(%r1)
/* Restore registers */
lwz %r8,28(%r1)
mtlr %r8
lwz %r9,24(%r1)
lwz %r8,20(%r1)
addi %r1,%r1,32
/* Return */
blr
ofw_getprop_hook:
/* Reserve stack space:
* 32 bytes for the ofw call
* 12 bytes for r8, r9, lr
*/
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,48
/* Store r8, r9, lr */
stw %r8,32(%r1)
stw %r9,36(%r1)
mflr %r8
stw %r8,40(%r1)
/* Get getprop name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_getprop_name - _start
stw %r9,0(%r1)
/* 4 Argument and 1 return */
li %r9,4
stw %r9,4(%r1)
li %r9,1
stw %r9,8(%r1)
stw %r3,12(%r1) /* Package */
stw %r4,16(%r1) /* Property */
stw %r5,20(%r1) /* Return buffer */
stw %r6,24(%r1) /* Buffer size */
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
/* Workaround to a wierd crash ... not sure what causes it.
* XXX investigate me */
bl ofw_print_nothing
/* Return */
lwz %r3,28(%r1)
/* Restore registers */
lwz %r8,40(%r1)
mtlr %r8
lwz %r9,36(%r1)
lwz %r8,32(%r1)
addi %r1,%r1,48
/* Return */
blr
ofw_getprop:
/* Reserve stack space:
* 32 bytes for the ofw call
* 12 bytes for r8, r9, lr
*/
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,48
/* Store r8, r9, lr */
stw %r8,32(%r1)
stw %r9,36(%r1)
mflr %r8
stw %r8,40(%r1)
/* Get getprop name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_getprop_name - _start
stw %r9,0(%r1)
/* 4 Argument and 1 return */
li %r9,4
stw %r9,4(%r1)
li %r9,1
stw %r9,8(%r1)
stw %r3,12(%r1) /* Package */
stw %r4,16(%r1) /* Property */
stw %r5,20(%r1) /* Return buffer */
stw %r6,24(%r1) /* Buffer size */
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
/* Return */
lwz %r3,28(%r1)
/* Restore registers */
lwz %r8,40(%r1)
mtlr %r8
lwz %r9,36(%r1)
lwz %r8,32(%r1)
addi %r1,%r1,48
/* Return */
blr
ofw_write:
/* Reserve stack space:
* 28 bytes for the ofw call
* 12 bytes for r8, r9, lr
*/
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,48
nop
/* Store r8, r9, lr */
stw %r8,28(%r1)
stw %r9,32(%r1)
mflr %r8
stw %r8,36(%r1)
/* Get write name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_write_name - _start
stw %r9,0(%r1)
/* 3 Arguments and 1 return */
li %r9,3
stw %r9,4(%r1)
li %r9,1
stw %r9,8(%r1)
stw %r3,12(%r1)
stw %r4,16(%r1)
stw %r5,20(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
/* Return */
lwz %r3,24(%r1)
/* Restore registers */
lwz %r8,36(%r1)
mtlr %r8
lwz %r9,32(%r1)
lwz %r8,28(%r1)
addi %r1,%r1,48
/* Return */
blr
ofw_read:
/* Reserve stack space:
* 28 bytes for the ofw call
* 12 bytes for r8, r9, lr
*/
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,48
nop
/* Store r8, r9, lr */
stw %r8,28(%r1)
stw %r9,32(%r1)
mflr %r8
stw %r8,36(%r1)
/* Get read name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_read_name - _start
stw %r9,0(%r1)
/* 3 Arguments and 1 return */
li %r9,3
stw %r9,4(%r1)
li %r9,1
stw %r9,8(%r1)
stw %r3,12(%r1)
stw %r4,16(%r1)
stw %r5,20(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
/* Return */
lwz %r3,24(%r1)
/* Restore registers */
lwz %r8,36(%r1)
mtlr %r8
lwz %r9,32(%r1)
lwz %r8,28(%r1)
addi %r1,%r1,48
/* Return */
blr
ofw_exit:
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_halt - _start
bl ofw_print_string
/*
ofw_exit_loop:
b ofw_exit_loop
*/
/* Load the exit name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_exit_name - _start
stw %r9,0(%r1)
/* Zero args, zero returns */
xor %r9,%r9,%r9
stw %r9,4(%r1)
stw %r9,8(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
mr %r3,%r1
/* Fire */
blrl
/* No return from exit */
ofw_child:
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,32
/* Store r8, r9, lr */
stw %r8,20(%r1)
stw %r9,24(%r1)
mflr %r8
stw %r8,28(%r1)
/* Get child name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_child_name - _start
stw %r9,0(%r1)
/* 1 Argument and 1 return */
li %r9,1
stw %r9,4(%r1)
stw %r9,8(%r1)
stw %r3,12(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
lwz %r3,16(%r1)
/* Restore registers */
lwz %r8,28(%r1)
mtlr %r8
lwz %r9,24(%r1)
lwz %r8,20(%r1)
addi %r1,%r1,32
/* Return */
blr
ofw_peer:
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,32
/* Store r8, r9, lr */
stw %r8,20(%r1)
stw %r9,24(%r1)
mflr %r8
stw %r8,28(%r1)
/* Get peer name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_peer_name - _start
stw %r9,0(%r1)
/* 1 Argument and 1 return */
li %r9,1
stw %r9,4(%r1)
stw %r9,8(%r1)
stw %r3,12(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
lwz %r3,16(%r1)
/* Restore registers */
lwz %r8,28(%r1)
mtlr %r8
lwz %r9,24(%r1)
lwz %r8,20(%r1)
addi %r1,%r1,32
/* Return */
blr
ofw_seek:
/* Reserve stack space ...
* 20 bytes for the ofw call,
* r8, r9, and lr */
subi %r1,%r1,32
/* Store r8, r9, lr */
stw %r8,20(%r1)
stw %r9,24(%r1)
mflr %r8
stw %r8,28(%r1)
/* Get peer name */
lis %r8,0xe00000@ha
addi %r9,%r8,ofw_seek_name - _start
stw %r9,0(%r1)
/* 3 Arguments and 1 return */
li %r9,3
stw %r9,4(%r1)
li %r9,1
stw %r9,8(%r1)
stw %r3,12(%r1)
stw %r4,16(%r1)
stw %r5,20(%r1)
/* Load up the call address */
lwz %r9,ofw_call_addr - _start(%r8)
mtlr %r9
/* Set argument */
mr %r3,%r1
/* Fire */
blrl
lwz %r3,16(%r1)
/* Restore registers */
lwz %r8,28(%r1)
mtlr %r8
lwz %r9,24(%r1)
lwz %r8,20(%r1)
addi %r1,%r1,32
/* Return */
blr
setup_exc:
subi %r1,%r1,32
stw %r3,0(%r1)
mflr %r3
stw %r3,4(%r1)
stw %r8,8(%r1)
stw %r9,12(%r1)
stw %r10,16(%r1)
stw %r12,20(%r1)
lis %r8,0xe00000@ha
xor %r12,%r12,%r12
addi %r12,%r12,0x300
addi %r9,%r8,dsi_exc - _start
addi %r10,%r8,dsi_end - _start
copy_loop:
cmp 0,0,%r9,%r10
beq ret_setup_exc
mr %r3,%r12
bl ofw_print_number
bl ofw_print_space
lwz %r3,0(%r9)
stw %r3,0(%r12)
bl ofw_print_number
bl ofw_print_eol
addi %r12,%r12,4
addi %r9,%r9,4
b copy_loop
ret_setup_exc:
mfmsr %r12
andi. %r12,%r12,0xffbf
mtmsr %r12
lwz %r12,20(%r1)
lwz %r10,16(%r1)
lwz %r9,12(%r1)
lwz %r8,8(%r1)
lwz %r3,4(%r1)
mtlr %r3
lwz %r3,0(%r1)
blr
dsi_exc:
subi %r1,%r1,16
stw %r0,0(%r1)
stw %r3,4(%r1)
mfsrr0 %r3
addi %r3,%r3,4
mtsrr0 %r3
/* mfsrr1 %r3 */
/* ori %r3,%r3,2 */
/* mtsrr1 %r3 */
lwz %r3,4(%r1)
lwz %r0,0(%r1)
addi %r1,%r1,16
rfi
dsi_end:
.org 0x1000
freeldr_banner:
.ascii "ReactOS OpenFirmware Boot Program\r\n\0"
freeldr_halt:
.ascii "ReactOS OpenFirmware Boot Program Halting\r\n\0"
freeldr_reg_init:
.ascii "r\0"
freeldr_reg_lr:
.ascii "lr \0"
freeldr_reg_cr:
.ascii "cr \0"
freeldr_reg_ctr:
.ascii "ctr\0"
freeldr_reg_msr:
.ascii "msr\0"
ofw_call_addr:
.long 0
ofw_memory_size:
.long 0
.long 0
.long 0
.long 0
ofw_finddevice_name:
.ascii "finddevice\0"
ofw_getprop_name:
.ascii "getprop\0"
ofw_write_name:
.ascii "write\0"
ofw_read_name:
.ascii "read\0"
ofw_exit_name:
.ascii "exit\0"
ofw_open_name:
.ascii "open\0"
ofw_child_name:
.ascii "child\0"
ofw_peer_name:
.ascii "peer\0"
ofw_seek_name:
.ascii "seek\0"
ofw_chosen_name:
.ascii "/chosen\0"
ofw_stdout_name:
.ascii "stdout\0"
ofw_memory_name:
.ascii "/memory@0\0"
ofw_reg_name:
.ascii "reg\0"
ofw_functions:
.long ofw_finddevice_hook
.long ofw_getprop_hook
.long ofw_write
.long ofw_read
.long ofw_exit
.long ofw_print_regs
.long ofw_print_string
.long ofw_print_number
.long ofw_open
.long ofw_child
.long ofw_peer
.long ofw_seek
.org 0x2000
stack:
.space 0x4000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -