| /****************************************************************************** |
| * Copyright (c) 2004, 2008 IBM Corporation |
| * All rights reserved. |
| * This program and the accompanying materials |
| * are made available under the terms of the BSD License |
| * which accompanies this distribution, and is available at |
| * http://www.opensource.org/licenses/bsd-license.php |
| * |
| * Contributors: |
| * IBM Corporation - initial implementation |
| *****************************************************************************/ |
| |
| #define STACKSIZE 0x100000 |
| #include <macros.h> |
| |
| |
| .section ".toc","aw" # TOC entries are needed for relocation |
| .exception_stack_frame_toc: |
| .tc exception_stack_frame[TC],exception_stack_frame |
| .exit_sp_toc: |
| .tc _exit_sp[TC],_exit_sp |
| .prom_entry_toc: |
| .tc _prom_entry[TC],_prom_entry |
| |
| .previous |
| |
| |
| /* |
| Function: |
| Input: |
| r3: |
| r4: |
| r5: prom entry |
| Output: |
| |
| Decription: Main entry point, called from OF |
| |
| */ |
| C_ENTRY(_entry) |
| mr r3, r6 # parm 0 passed in r6 |
| mr r4, r7 # parm 1 passed in r7 |
| mr r6, r1 # save stack pointer |
| mflr r7 # save link register |
| bcl 20,31,over # branch after pointer table |
| base: |
| .align 3 |
| .LCgot: .quad _got-base+0x8000 |
| .LCstack: .quad _stack+STACKSIZE-0x80-base |
| over: |
| mflr r8 # gpr 8 is the base |
| ld r1,.LCstack-base(r8) # load new stack pointer |
| add r1, r1, r8 # add base |
| std r2, 64(r1) # save got |
| std r7, 56(r1) # save link register |
| ld r2, .LCgot-base(r8) # load got pointer |
| add r2, r2, r8 # add base |
| std r6, 0(r1) # save stack pointer |
| |
| ld r6, .prom_entry_toc@toc(r2) |
| std r5, 0(r6) # Save prom handle |
| |
| ld r10, .exit_sp_toc@toc(r2) # save stack pointer for exit call |
| std r1, 0(r10) |
| |
| bl ._start_kernel # call kernel init code |
| |
| the_end: |
| ld r4, 56(r1) # Restore link register |
| mtlr r4 |
| ld r2, 64(r1) # restore got |
| ld r1, 0(r1) |
| |
| blr |
| |
| /* |
| * Function: _callback_entry |
| * Input: r6 start address of parameter string |
| * r7 length of parameter string. |
| * |
| * Description: If a client application wants to register a callback function, |
| * this function is registered w/ SLOF, not the application's function. SLOF |
| * passes the parameter string in Forth representation in R6 and R7. This |
| * function moves R6 to R3 and R7 to R4 and then calls callback_entry(). |
| * |
| */ |
| C_ENTRY(_callback_entry) |
| # Save the LR |
| mflr r0 |
| std r0, 16(r1) |
| |
| # Reserve stack space |
| stdu r1, -32(r1) |
| |
| # SLOF passes the parameters in Registers R6 and R7 but the target |
| # wants them in registers R3 and R4 |
| mr r3, r6 |
| mr r4, r7 |
| |
| # Branch to the callback_entry function |
| bl .callback_entry |
| |
| # Destroy stack frame |
| ld r1, 0(r1) |
| |
| # Restore LR |
| ld r0, 16(r1) |
| mtlr r0 |
| |
| # Return to caller |
| blr |
| |
| .section ".bss" |
| |
| _exit_sp: .quad 0 |
| |
| .global _prom_entry |
| _prom_entry: .quad 0 |
| |
| .section ".text" |
| |
| C_ENTRY(_exit) |
| ld r1, .exit_sp_toc@toc(r2) |
| ld r1, 0(r1) |
| b the_end |
| |
| |
| .lcomm _stack,STACKSIZE,16 |