summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/clients/net-snk/kernel/entry.S
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/clients/net-snk/kernel/entry.S')
-rw-r--r--qemu/roms/SLOF/clients/net-snk/kernel/entry.S127
1 files changed, 127 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/clients/net-snk/kernel/entry.S b/qemu/roms/SLOF/clients/net-snk/kernel/entry.S
new file mode 100644
index 000000000..8849fb9d1
--- /dev/null
+++ b/qemu/roms/SLOF/clients/net-snk/kernel/entry.S
@@ -0,0 +1,127 @@
+/******************************************************************************
+ * 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