From: Art Yerkes Date: Tue, 27 Jun 2006 10:02:42 +0000 (+0000) Subject: Fix some sillyness. Remove some cruft. X-Git-Tag: backups/ddk2003@36850~944^2~66 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=d2af61537f467bc77fdbdfdf83410d49f4280da5 Fix some sillyness. Remove some cruft. svn path=/branches/powerpc/; revision=22661 --- diff --git a/reactos/boot/freeldr/bootsect/ofw_util.s b/reactos/boot/freeldr/bootsect/ofw_util.s index 1da50c9ec09..036a9c6fc11 100644 --- a/reactos/boot/freeldr/bootsect/ofw_util.s +++ b/reactos/boot/freeldr/bootsect/ofw_util.s @@ -1,4 +1,76 @@ .section .text + + .globl ofw_functions_addr +ofw_functions_addr: + .long ofw_functions + + .align 4 +call_freeldr: + /* Get the address of the functions list -- + * Note: + * Because of little endian switch we must use an even number of + * instructions here.. Pad with a nop if needed. */ + mfmsr %r10 + ori %r10,%r10,1 + mtmsr %r10 + + nop + + /* Note that this is little-endian from here on */ + blr + nop + + .align 4 + +call_ofw: + /* R3 has the function offset to call (n * 4) + * Other arg registers are unchanged. + * Note that these 4 instructions are in reverse order due to + * little-endian convention */ + andi. %r0,%r0,65534 + mfmsr %r0 + mtmsr %r0 + /* Now normal ordering resumes */ + subi %r1,%r1,0x100 + + stw %r8,4(%r1) + stw %r9,8(%r1) + stw %r10,12(%r1) + mflr %r8 + stw %r8,16(%r1) + + lis %r10,0xe00000@ha + add %r9,%r3,%r10 + lwz %r3,ofw_functions_addr - _start@l(%r9) + lwz %r3,0(%r3) + mtctr %r3 + + mr %r3,%r4 + mr %r4,%r5 + mr %r5,%r6 + mr %r6,%r7 + mr %r7,%r8 + + /* Goto the swapped function */ + bctrl + + lwz %r8,16(%r1) + mtlr %r8 + + lwz %r8,4(%r1) + lwz %r9,8(%r1) + lwz %r10,12(%r1) + + addi %r1,%r1,0x100 + /* Ok, go back to little endian */ + mfmsr %r0 + ori %r0,%r0,1 + mtmsr %r0 + + /* Note that this is little-endian from here on */ + blr + nop + prim_strlen: mr %r5,%r3 prim_strlen_loop: @@ -14,7 +86,7 @@ prim_strlen_done: copy_bits: cmp 0,0,%r3,%r4 - beqlr + bgelr lwz %r6,0(%r3) stw %r6,0(%r5) @@ -366,3 +438,29 @@ ofw_register_special: blr +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" + +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" diff --git a/reactos/boot/freeldr/bootsect/ofwboot.s b/reactos/boot/freeldr/bootsect/ofwboot.s index 627d7658814..70a55075f59 100644 --- a/reactos/boot/freeldr/bootsect/ofwboot.s +++ b/reactos/boot/freeldr/bootsect/ofwboot.s @@ -1,5 +1,4 @@ .section .text - .globl setup_bats _start: .long 0xe00000 + 12 @@ -20,8 +19,6 @@ _begin: lis %r10,0xe00000@ha stw %r5,ofw_call_addr - _start@l(%r10) - bl setup_bats - lis %r3,0xe00000@ha addi %r3,%r3,freeldr_banner - _start @@ -29,6 +26,21 @@ _begin: bl ofw_print_eol + /* Claim enough bytes to place freeldr at 0x8000 */ + lis %r3,0x8000@ha + addi %r3,%r3,0x8000@l + + lis %r4,_binary_freeldr_tmp_end@ha + addi %r4,%r4,_binary_freeldr_tmp_end@l + lis %r5,_binary_freeldr_tmp_start@ha + addi %r5,%r5,_binary_freeldr_tmp_start@l + sub %r4,%r4,%r5 + + xor %r5,%r5,%r5 + li %r5,0x1000 + + bl ofw_claim + lis %r4,_binary_freeldr_tmp_end@ha addi %r4,%r4,_binary_freeldr_tmp_end@l lis %r3,_binary_freeldr_tmp_start@ha @@ -37,25 +49,23 @@ _begin: lis %r5,0x8000@ha addi %r5,%r5,0x8000@l - bl ofw_print_regs + bl ofw_dumpregs bl copy_bits bl zero_registers -/* bl setup_exc */ - /* Zero CTR */ mtcr %r31 - + lis %r3,0x8000@ha addi %r3,%r3,0x8000@l mtlr %r3 - - lis %r3,call_ofw@ha - addi %r3,%r3,call_ofw - _start - + + lis %r3,call_freeldr@ha + addi %r3,%r3,call_freeldr - _start + blr /* @@ -79,71 +89,6 @@ setup_bats: isync blr - .align 4 -call_freeldr: - /* Get the address of the functions list -- - * Note: - * Because of little endian switch we must use an even number of - * instructions here.. Pad with a nop if needed. */ - mfmsr %r10 - ori %r10,%r10,1 - mtmsr %r10 - - nop - - /* Note that this is little-endian from here on */ - blr - nop - - .align 4 -call_ofw: - /* R3 has the function offset to call (n * 4) - * Other arg registers are unchanged. - * Note that these 4 instructions are in reverse order due to - * little-endian convention */ - andi. %r0,%r0,65534 - mfmsr %r0 - mtmsr %r0 - /* Now normal ordering resumes */ - subi %r1,%r1,0x100 - - stw %r8,4(%r1) - stw %r9,8(%r1) - stw %r10,12(%r1) - mflr %r8 - stw %r8,16(%r1) - - lis %r10,0xe00000@ha - add %r9,%r3,%r10 - lwz %r3,ofw_functions - _start@l(%r9) - mtctr %r3 - - mr %r3,%r4 - mr %r4,%r5 - mr %r5,%r6 - mr %r6,%r7 - mr %r7,%r8 - - /* Goto the swapped function */ - bctrl - - lwz %r8,16(%r1) - mtlr %r8 - - lwz %r8,4(%r1) - lwz %r9,8(%r1) - lwz %r10,12(%r1) - - addi %r1,%r1,0x100 - /* Ok, go back to little endian */ - mfmsr %r0 - ori %r0,%r0,1 - mtmsr %r0 - - /* Note that this is little-endian from here on */ - blr - nop - zero_registers: xor %r2,%r2,%r2 mr %r0,%r2 @@ -191,961 +136,6 @@ zero_registers: blr -prim_strlen: - mr %r5,%r3 -prim_strlen_loop: - lbz %r4,0(%r3) - cmpi 0,0,%r4,0 - beq prim_strlen_done - addi %r3,%r3,1 - b prim_strlen_loop - -prim_strlen_done: - sub %r3,%r3,%r5 - blr - -copy_bits: - cmp 0,0,%r3,%r4 - beqlr - lwz %r6,0(%r3) - stw %r6,0(%r5) - addi %r3,%r3,4 - addi %r5,%r5,4 - b copy_bits - -ofw_print_string_hook: - bl ofw_print_number - bl ofw_exit - -ofw_print_string: - /* Reserve some stack space */ - subi %r1,%r1,32 - - /* Save args */ - stw %r3,0(%r1) - - /* Save the lr, a scratch register */ - stw %r8,8(%r1) - mflr %r8 - stw %r8,12(%r1) - - /* Load the package name */ - lis %r3,0xe00000@ha - addi %r3,%r3,ofw_chosen_name - _start - - /* Fire */ - bl ofw_finddevice - - /* Load up for getprop */ - stw %r3,16(%r1) - - lis %r4,0xe00000@ha - addi %r4,%r4,ofw_stdout_name - _start - - addi %r5,%r1,20 - - li %r6,4 - - bl ofw_getprop - - /* Measure the string and remember the length */ - lwz %r3,0(%r1) - bl prim_strlen - mr %r5,%r3 - - lwz %r3,20(%r1) - lwz %r4,0(%r1) - - /* Write the string */ - bl ofw_write - - /* Return */ - lwz %r8,12(%r1) - mtlr %r8 - lwz %r8,8(%r1) - - addi %r1,%r1,32 - blr - - /* Print 8 hex digits representing a number in r3 */ -ofw_print_number: - subi %r1,%r1,32 - stw %r8,0(%r1) - mflr %r8 - stw %r8,4(%r1) - stw %r9,8(%r1) - - xor %r9,%r9,%r9 - stw %r9,12(%r1) - - /* Set up and, devide, shift */ - mr %r8,%r3 - lis %r6,0xf0000000@ha - lis %r7,0x10000000@ha - li %r9,8 - -ofw_number_loop: - nop - cmpi 0,0,%r9,0 - beq ofw_number_return - subi %r9,%r9,1 - - /* Body: isolate digit, divide, print */ - and %r5,%r6,%r8 - divwu %r4,%r5,%r7 - srwi %r6,%r6,4 - srwi %r7,%r7,4 - - nop - - cmpi 0,0,%r4,10 - bge ofw_number_letter - addi %r4,%r4,'0' - b ofw_number_digit_out - -ofw_number_letter: - addi %r4,%r4,'A' - 10 - -ofw_number_digit_out: - stb %r4,12(%r1) - addi %r3,%r1,12 - - stw %r6,16(%r1) - stw %r7,20(%r1) - stw %r8,24(%r1) - stw %r9,28(%r1) - - bl ofw_print_string - - lwz %r6,16(%r1) - lwz %r7,20(%r1) - lwz %r8,24(%r1) - lwz %r9,28(%r1) - - b ofw_number_loop - -ofw_number_return: - /* Return */ - lwz %r9,8(%r1) - lwz %r8,4(%r1) - mtlr %r8 - lwz %r8,0(%r1) - addi %r1,%r1,32 - blr - -ofw_print_eol: - subi %r1,%r1,16 - stw %r8,0(%r1) - mflr %r8 - stw %r8,4(%r1) - li %r4,0x0d0a - sth %r4,8(%r1) - xor %r4,%r4,%r4 - sth %r4,10(%r1) - addi %r3,%r1,8 - bl ofw_print_string - lwz %r8,4(%r1) - mtlr %r8 - lwz %r8,0(%r1) - addi %r1,%r1,16 - blr - -ofw_print_nothing: - subi %r1,%r1,16 - stw %r8,0(%r1) - mflr %r8 - stw %r8,4(%r1) - li %r4,0 - sth %r4,8(%r1) - xor %r4,%r4,%r4 - sth %r4,10(%r1) - addi %r3,%r1,8 - bl ofw_print_string - lwz %r8,4(%r1) - mtlr %r8 - lwz %r8,0(%r1) - addi %r1,%r1,16 - blr - -ofw_print_space: - subi %r1,%r1,16 - stw %r8,0(%r1) - mflr %r8 - stw %r8,4(%r1) - li %r4,0x2000 - sth %r4,8(%r1) - xor %r4,%r4,%r4 - sth %r4,10(%r1) - addi %r3,%r1,8 - bl ofw_print_string - lwz %r8,4(%r1) - mtlr %r8 - lwz %r8,0(%r1) - addi %r1,%r1,16 - blr - -ofw_print_regs: - /* Construct ofw exit call */ - subi %r1,%r1,0xa0 - - stw %r0,0(%r1) - stw %r1,4(%r1) - stw %r2,8(%r1) - stw %r3,12(%r1) - - stw %r4,16(%r1) - stw %r5,20(%r1) - stw %r6,24(%r1) - stw %r7,28(%r1) - - stw %r8,32(%r1) - stw %r9,36(%r1) - stw %r10,40(%r1) - stw %r11,44(%r1) - - stw %r12,48(%r1) - stw %r13,52(%r1) - stw %r14,56(%r1) - stw %r15,60(%r1) - - stw %r16,64(%r1) - stw %r17,68(%r1) - stw %r18,72(%r1) - stw %r19,76(%r1) - - stw %r20,80(%r1) - stw %r21,84(%r1) - stw %r22,88(%r1) - stw %r23,92(%r1) - - stw %r24,96(%r1) - stw %r25,100(%r1) - stw %r26,104(%r1) - stw %r27,108(%r1) - - stw %r28,112(%r1) - stw %r29,116(%r1) - stw %r30,120(%r1) - stw %r31,124(%r1) - - mflr %r0 - stw %r0,128(%r1) - mfcr %r0 - stw %r0,132(%r1) - mfctr %r0 - stw %r0,136(%r1) - mfmsr %r0 - stw %r0,140(%r1) - - /* Count at zero */ - xor %r0,%r0,%r0 - stw %r0,144(%r1) - mr %r3,%r1 - stw %r3,148(%r1) - - /* Body, print the regname, then the register */ -ofw_register_loop: - lwz %r3,144(%r1) - cmpi 0,0,%r3,32 - beq ofw_register_special - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_init - _start - bl ofw_print_string - lwz %r3,144(%r1) - bl ofw_print_number - bl ofw_print_space - lwz %r3,144(%r1) - mulli %r3,%r3,4 - add %r3,%r1,%r3 - lwz %r3,0(%r3) - stw %r3,152(%r1) - bl ofw_print_number - lwz %r3,144(%r1) - addi %r3,%r3,1 - stw %r3,144(%r1) - - bl ofw_print_space - - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_init - _start - bl ofw_print_string - lwz %r3,144(%r1) - bl ofw_print_number - bl ofw_print_space - lwz %r3,144(%r1) - mulli %r3,%r3,4 - add %r3,%r1,%r3 - lwz %r3,0(%r3) - stw %r3,152(%r1) - bl ofw_print_number - lwz %r3,144(%r1) - addi %r3,%r3,1 - stw %r3,144(%r1) - - b done_dump - -dump_optional: - bl ofw_print_space - bl ofw_print_space - lwz %r3,152(%r1) - lwz %r3,0(%r3) - bl ofw_print_number - bl ofw_print_space - lwz %r3,152(%r1) - lwz %r3,4(%r3) - bl ofw_print_number - bl ofw_print_space - lwz %r3,152(%r1) - lwz %r3,8(%r3) - bl ofw_print_number - bl ofw_print_space - lwz %r3,152(%r1) - lwz %r3,12(%r3) - bl ofw_print_number - bl ofw_print_space -done_dump: - bl ofw_print_eol - b ofw_register_loop - -ofw_register_special: - /* LR */ - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_lr - _start - bl ofw_print_string - bl ofw_print_space - lwz %r3,128(%r1) - bl ofw_print_number - bl ofw_print_eol - - /* CR */ - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_cr - _start - bl ofw_print_string - bl ofw_print_space - lwz %r3,132(%r1) - bl ofw_print_number - bl ofw_print_eol - - /* CTR */ - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_ctr - _start - bl ofw_print_string - bl ofw_print_space - lwz %r3,136(%r1) - bl ofw_print_number - bl ofw_print_eol - - /* MSR */ - lis %r3,0xe00000@ha - addi %r3,%r3,freeldr_reg_msr - _start - bl ofw_print_string - bl ofw_print_space - lwz %r3,140(%r1) - bl ofw_print_number - bl ofw_print_eol - - /* Return */ - lwz %r0,128(%r1) - mtlr %r0 - - lwz %r0,0(%r1) - lwz %r2,8(%r1) - lwz %r3,12(%r1) - - lwz %r4,16(%r1) - lwz %r5,20(%r1) - lwz %r6,24(%r1) - lwz %r7,28(%r1) - - addi %r1,%r1,0xa0 - - blr - -ofw_finddevice_hook: - subi %r1,%r1,32 - stw %r3,0(%r1) - mflr %r3 - stw %r3,4(%r1) - lwz %r3,0(%r1) - bl ofw_finddevice - stw %r3,0(%r1) - lwz %r3,4(%r1) - mtlr %r3 - lwz %r3,0(%r1) - addi %r1,%r1,32 - blr - -ofw_finddevice: - /* 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 finddevice name */ - lis %r8,0xe00000@ha - addi %r9,%r8,ofw_finddevice_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_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" @@ -1153,79 +143,12 @@ freeldr_banner: 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