Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / clients / net-snk / kernel / entry.S
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 (file)
index 0000000..8849fb9
--- /dev/null
@@ -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