ofwboot.s
来自「一个类似windows」· S 代码 · 共 1,246 行 · 第 1/2 页
S
1,246 行
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 */ blrofw_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 */ blrofw_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 */ blrofw_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 */ blrofw_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 */ blrsetup_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 - _startcopy_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) blrdsi_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 rfidsi_end: .org 0x1000freeldr_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 0ofw_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 0x2000stack: .space 0x4000
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?