Annotation of qemu/roms/SLOF/clients/net-snk/kernel/entry.S, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  * Copyright (c) 2004, 2008 IBM Corporation
                      3:  * All rights reserved.
                      4:  * This program and the accompanying materials
                      5:  * are made available under the terms of the BSD License
                      6:  * which accompanies this distribution, and is available at
                      7:  * http://www.opensource.org/licenses/bsd-license.php
                      8:  *
                      9:  * Contributors:
                     10:  *     IBM Corporation - initial implementation
                     11:  *****************************************************************************/
                     12: 
                     13: #define STACKSIZE 0x100000
                     14: #include <macros.h>
                     15: 
                     16: /*
                     17: Function:      
                     18:        Input:
                     19:                r3:   
                     20:                r4:   
                     21:                r5:   prom entry         
                     22:        Output:         
                     23: 
                     24: Decription: Main entry point, called from OF
                     25:        
                     26: */
                     27:        .globl  _entry
                     28:         .section        ".opd","aw"
                     29:         .align 3
                     30: _entry:
                     31:         .quad   ._entry,.TOC.@tocbase,0
                     32:         .previous
                     33:         .size   main,24
                     34:        .globl ._entry
                     35: ._entry:       
                     36:        mr      r3, r6  # parm 0 passed in r6
                     37:        mr      r4, r7  # parm 1 passed in r7   
                     38:        mr      r6, r1  # save stack pointer    
                     39:        mflr    r7      # save link register
                     40:        bcl     20,31,over      # branch after pointer table
                     41: base:  
                     42:        .align  3
                     43: .LCgot:                .quad   _got-base+0x8000
                     44: .LCstack:      .quad   _stack+STACKSIZE-0x80-base
                     45: over:  
                     46:        mflr    r8              # gpr 8 is the base
                     47:        ld      r1,.LCstack-base(r8)    # load new stack pointer
                     48:        add     r1, r1, r8              # add base
                     49:        std     r2, 64(r1)              # save got
                     50:        std     r7, 56(r1)              # save link register
                     51: #      ld      r2, .LCgot-base(r8)     # load got pointer
                     52: #      add     r2, r2, r8              # add base      
                     53:        std     r6, 0(r1)               # save stack pointer
                     54: 
                     55:        ld      r6, _prom_entry@got(r2)
                     56:        std     r5, 0(r6)               # Save prom handle
                     57: 
                     58:        ld      r10, _exit_sp@got(r2)   # save stack pointer for exit call
                     59:        std     r1, 0(r10)
                     60: 
                     61:        bl      ._start_kernel          # call kernel init code
                     62: 
                     63: the_end:
                     64:        ld      r4, 56(r1)              # Restore link register
                     65:        mtlr    r4
                     66:        ld      r2, 64(r1)              # restore got
                     67:        ld      r1, 0(r1)
                     68: 
                     69:        blr
                     70: 
                     71: /*
                     72:  * Function: _callback_entry
                     73:  * Input:   r6  start address of parameter string
                     74:  *          r7  length of parameter string.
                     75:  *
                     76:  * Description: If a client application wants to register a callback function,
                     77:  *  this function is registered w/ SLOF, not the application's function. SLOF
                     78:  *  passes the parameter string in Forth representation in R6 and R7. This
                     79:  *  function moves R6 to R3 and R7 to R4 and then calls callback_entry().
                     80:  *
                     81:  */
                     82:        .globl          _callback_entry
                     83:        .section        ".opd", "aw"
                     84:        .align          3
                     85: _callback_entry:
                     86:        .quad           ._callback_entry,.TOC.@tocbase,0
                     87:        .previous
                     88:        .size           callback,24
                     89:        .type           ._callback_entry, @function
                     90:        .globl          ._callback_entry
                     91: ._callback_entry:
                     92:        # Save the LR
                     93:        mflr    r0
                     94:        std     r0, 16(r1)
                     95: 
                     96:        # Reserve stack space
                     97:        stdu    r1,     -32(r1)
                     98: 
                     99:        # SLOF passes the parameters in Registers R6 and R7 but the target
                    100:        # wants them in registers R3 and R4
                    101:        mr      r3, r6
                    102:        mr      r4, r7
                    103: 
                    104:        # Branch to the callback_entry function
                    105:        bl      .callback_entry
                    106: 
                    107:        # Destroy stack frame
                    108:        ld      r1,     0(r1)
                    109: 
                    110:        # Restore LR
                    111:        ld      r0, 16(r1)
                    112:        mtlr    r0
                    113: 
                    114:        # Return to caller
                    115:        blr
                    116: 
                    117: 
                    118:        .globl  _exit_sp
                    119: _exit_sp:      .quad 0
                    120:        .globl  _prom_entry     
                    121: _prom_entry:   .quad 0
                    122: 
                    123: ENTRY(_exit)
                    124:        ld      r1, _exit_sp@got(r2)
                    125:        ld      r1, 0(r1)
                    126:        b       the_end
                    127: 
                    128:        .globl  .undo_exception
                    129: .undo_exception:
                    130:        .globl  undo_exception
                    131: undo_exception:
                    132: 
                    133: /* 
                    134:        unwind stack
                    135: */
                    136:        ld      r3,exception_stack_frame@got(r2)
                    137:        ld      r1,0(r3)
                    138: 
                    139:        ld      r14,0x130(r1)
                    140:        mtctr   r14
                    141: 
                    142: //     restore regs same as in _exception_handler:
                    143: 
                    144:        .irp i, 2,3,4,5,6,7,8,9,10,12,13,14,15,16, \
                    145:                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
                    146:                27, 28, 29, 30, 31
                    147:        ld      r\i, 0x30+\i*8 (r1)
                    148:        .endr
                    149:     addi       r1, r1, 0x130
                    150: 
                    151: //     restore regs as in default handler 
                    152: 
                    153:        ld      r0, 0x48(r1)    
                    154:        mtsrr0  r0
                    155:        ld      r0, 0x50(r1)    
                    156:        mtsrr1  r0
                    157: // 20
                    158:        ld      r0, 0x38(r1)
                    159:        mtlr    r0      
                    160:        ld      r0, 0x30(r1)
                    161:        ld      r11, 0x40(r1)
                    162: // 30
                    163:        addi    r1, r1, 0x58
                    164: 
                    165:        rfid
                    166: 
                    167:        .lcomm  _stack,STACKSIZE,16

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.