Annotation of qemu/roms/openbios/arch/ppc/start.S, revision 1.1.1.1

1.1       root        1: /*
                      2:  *   Creation Date: <2001/06/16 21:30:18 samuel>
                      3:  *   Time-stamp: <2003/04/04 16:32:06 samuel>
                      4:  *
                      5:  *     <init.S>
                      6:  *
                      7:  *     Asm glue for ELF images run inside MOL
                      8:  *
                      9:  *   Copyright (C) 2001, 2002, 2003 Samuel Rydh ([email protected])
                     10:  *
                     11:  *   This program is free software; you can redistribute it and/or
                     12:  *   modify it under the terms of the GNU General Public License
                     13:  *   as published by the Free Software Foundation
                     14:  *
                     15:  */
                     16: 
                     17: #include "asm/asmdefs.h"
                     18: #include "asm/processor.h"
                     19: #include "osi.h"
                     20: 
                     21: /************************************************************************/
                     22: /*     Macros                                                          */
                     23: /************************************************************************/
                     24: 
                     25: #define ILLEGAL_VECTOR( v )    .org __vectors + v ; bl trap_error ;
                     26: #define VECTOR( v, dummystr )  .org __vectors + v ; vector__##v
                     27: 
                     28: #define EXCEPTION_PREAMBLE \
                     29:        mtsprg1 r1 ;            /* scratch */ \
                     30:        mfsprg0 r1 ;            /* exception stack in sprg0 */ \
                     31:        addi    r1,r1,-80 ;     /* push exception frame */ \
                     32:  \
                     33:        stw     r0,0(r1) ;      /* save r0 */ \
                     34:        mfsprg1 r0 ; \
                     35:        stw     r0,4(r1) ;      /* save r1 */ \
                     36:        stw     r2,8(r1) ;      /* save r2 */ \
                     37:        stw     r3,12(r1) ;     /* save r3 */ \
                     38:        stw     r4,16(r1) ; \
                     39:        stw     r5,20(r1) ; \
                     40:        stw     r6,24(r1) ; \
                     41:        stw     r7,28(r1) ; \
                     42:        stw     r8,32(r1) ; \
                     43:        stw     r9,36(r1) ; \
                     44:        stw     r10,40(r1) ; \
                     45:        stw     r11,44(r1) ; \
                     46:        stw     r12,48(r1) ; \
                     47:  \
                     48:        mflr    r0 ; \
                     49:        stw     r0,52(r1) ; \
                     50:        mfcr    r0 ; \
                     51:        stw     r0,56(r1) ; \
                     52:        mfctr   r0 ; \
                     53:        stw     r0,60(r1) ; \
                     54:        mfxer   r0 ; \
                     55:        stw     r0,64(r1) ; \
                     56:  \
                     57:        /* 76(r1) unused */ \
                     58:        addi    r1,r1,-16 ;     /* call conventions uses 0(r1) and 4(r1)... */
                     59: 
                     60: 
                     61: /************************************************************************/
                     62: /*     stack space                                                     */
                     63: /************************************************************************/
                     64: 
                     65:        .section .bss
                     66:        .balign 32
                     67:        .space  32*1024         // 32 K client stack
                     68: client_stack:
                     69:        .space  128
                     70: 
                     71:        .space  64*1024         // 64 K stack
                     72: stack: .space  64
                     73: 
                     74:        .space  32*1024         // 32 K exception stack
                     75: estack:        .space  128
                     76: 
                     77: 
                     78: /************************************************************************/
                     79: /*     entry                                                           */
                     80: /************************************************************************/
                     81: 
                     82:        .text
                     83: GLOBL(_start):
                     84:        li      r0,0
                     85:        mtmsr   r0
                     86: 
                     87:        lis     r1,HA(estack)
                     88:        addi    r1,r1,LO(estack)
                     89:        mtsprg0 r1                      // setup exception stack
                     90:        lis     r1,HA(stack)
                     91:        addi    r1,r1,LO(stack)
                     92: 
                     93:        // copy exception vectors
                     94:        lis     r3,HA(__vectors)
                     95:        addi    r3,r3,LO(__vectors)
                     96:        li      r4,0
                     97:        li      r5,__vectors_end - __vectors + 16
                     98:        rlwinm  r5,r5,0,0,28
                     99: 1:     lwz     r6,0(r3)
                    100:        lwz     r7,4(r3)
                    101:        lwz     r8,8(r3)
                    102:        lwz     r9,12(r3)
                    103:        stw     r6,0(r4)
                    104:        stw     r7,4(r4)
                    105:        stw     r8,8(r4)
                    106:        stw     r9,12(r4)
                    107:        dcbst   0,r4
                    108:        sync
                    109:        icbi    0,r4
                    110:        sync
                    111:        addi    r5,r5,-16
                    112:        addi    r3,r3,16
                    113:        addi    r4,r4,16
                    114:        cmpwi   r5,0
                    115:        bgt     1b
                    116:        isync
                    117: 
                    118:        bl      setup_mmu
                    119:        bl      entry
                    120: 1:     nop
                    121:        b       1b
                    122: 
                    123: 
                    124:        /* According to IEEE 1275, PPC bindings:
                    125:         *
                    126:         *      MSR = FP, ME + (DR|IR)
                    127:         *      r1 = stack (32 K + 32 bytes link area above)
                    128:         *      r5 = clint interface handler
                    129:         *      r6 = address of client program arguments (unused)
                    130:         *      r7 = length of client program arguments (unsed)
                    131:         */
                    132: saved_stack:
                    133:        .long   0
                    134:        /* void call_elf( entry ) */
                    135: GLOBL(call_elf):
                    136:        mflr    r0
                    137:        stwu    r1,-16(r1)
                    138:        stw     r0,20(r1)
                    139:        mtlr    r3
                    140:        lis     r8,HA(saved_stack)
                    141:        addi    r8,r8,LO(saved_stack)           // save our stack pointer
                    142:        stw     r1,0(r8)
                    143:        lis     r1,HA(client_stack)
                    144:        addi    r1,r1,LO(client_stack)
                    145:        lis     r5,HA(of_client_callback)
                    146:        addi    r5,r5,LO(of_client_callback)    // r5 = callback
                    147:        li      r6,0                    // r6 = address of client program arguments (unused)
                    148:        li      r7,0                    // r7 = length of client program arguments (unused)
                    149:        li      r0,MSR_FP | MSR_ME | MSR_DR | MSR_IR
                    150:        mtmsr   r0
                    151:        blrl
                    152: 
                    153:        lis     r8,HA(saved_stack)
                    154:        addi    r8,r8,LO(saved_stack)           // restore stack pointer
                    155:        mr      r1,r8
                    156:        lwz     r0,20(r1)
                    157:        mtlr    r0
                    158:        addi    r1,r1,16
                    159:        // XXX: should restore r12-r31 etc..
                    160:        // we should not really come here though
                    161:        blr
                    162: 
                    163: GLOBL(of_client_callback):
                    164:        lis     r4,HA(saved_stack)
                    165:        addi    r4,r4,LO(saved_stack)
                    166:        lwz     r4,0(r4)
                    167:        stwu    r4,-32(r4)
                    168:        mflr    r5
                    169:        stw     r5,32+4(r4)
                    170:        stw     r1,8(r4)                // save caller stack
                    171:        mr      r1,r4
                    172:        stw     r2,12(r1)
                    173:        stw     r0,16(r1)
                    174:        mfctr   r2
                    175:        stw     r2,20(r1)
                    176:        mfcr    r2
                    177:        stw     r2,24(r1)
                    178:        mfxer   r2
                    179:        stw     r2,28(r1)
                    180:        // do we need to save more registers?
                    181:        bl      of_client_interface
                    182:        lwz     r4,32+4(r1)
                    183:        mtlr    r4
                    184:        lwz     r2,20(r1)
                    185:        mtctr   r2
                    186:        lwz     r2,24(r1)
                    187:        mtcr    r2
                    188:        lwz     r2,28(r1)
                    189:        mtxer   r2
                    190:        lwz     r2,12(r1)
                    191:        lwz     r0,16(r1)
                    192:        lwz     r1,8(r1)                // restore caller stack
                    193:        blr
                    194: 
                    195:        /* rtas glue (must be reloctable) */
                    196: GLOBL(of_rtas_start):
                    197:        /* r3 = argument buffer, r4 = of_rtas_start */
                    198:        /* according to the CHRP standard, cr must be preserved (cr0/cr1 too?) */
                    199:        mr      r6,r3
                    200:        lis     r3,HA(OSI_SC_MAGIC_R3)
                    201:        addi    r3,r3,LO(OSI_SC_MAGIC_R3)
                    202:        lis     r4,HA(OSI_SC_MAGIC_R4)
                    203:        addi    r4,r4,LO(OSI_SC_MAGIC_R4)
                    204:        li      r5,OSI_OF_RTAS
                    205:        sc
                    206:        blr
                    207: GLOBL(of_rtas_end):
                    208: 
                    209: 
                    210:        /* used in a hack to the newworld calibration */
                    211: GLOBL(nw_dec_calibration):
                    212:        .long   0
                    213: GLOBL(timer_calib_start):
                    214:        lis     r3,HA(nw_dec_calibration)
                    215:        addi    r3,r3,LO(nw_dec_calibration)
                    216:        lwz     r3,0(r3)
                    217:        blr
                    218: GLOBL(timer_calib_end):
                    219: 
                    220: 
                    221: /************************************************************************/
                    222: /*     vectors                                                         */
                    223: /************************************************************************/
                    224: 
                    225: GLOBL(__vectors):
                    226:        nop                     // NULL-jmp trap
                    227: 1:     nop                     //
                    228:        b       1b
                    229: 
                    230: exception_return:
                    231:        addi    r1,r1,16        // pop ABI frame
                    232: 
                    233:        lwz     r0,52(r1)
                    234:        mtlr    r0
                    235:        lwz     r0,56(r1)
                    236:        mtcr    r0
                    237:        lwz     r0,60(r1)
                    238:        mtctr   r0
                    239:        lwz     r0,64(r1)
                    240:        mtxer   r0
                    241: 
                    242:        lwz     r0,0(r1)        // restore r0
                    243:        lwz     r2,8(r1)        // restore r2
                    244:        lwz     r3,12(r1)       // restore r3
                    245:        lwz     r4,16(r1)
                    246:        lwz     r5,20(r1)
                    247:        lwz     r6,24(r1)
                    248:        lwz     r7,28(r1)
                    249:        lwz     r8,32(r1)
                    250:        lwz     r9,36(r1)
                    251:        lwz     r10,40(r1)
                    252:        lwz     r11,44(r1)
                    253:        lwz     r12,48(r1)
                    254:        lwz     r1,4(r1)        // restore r1
                    255:        rfi
                    256: 
                    257: trap_error:
                    258:        mflr    r3
                    259:        b       unexpected_excep
                    260: 
                    261: ILLEGAL_VECTOR( 0x100 )
                    262: ILLEGAL_VECTOR( 0x200 )
                    263: 
                    264: VECTOR( 0x300, "DSI" ):
                    265:        EXCEPTION_PREAMBLE
                    266:        lis     r3,HA(dsi_exception)
                    267:        addi    r3,r3,LO(dsi_exception)
                    268:        mtctr   r3
                    269:        bctrl
                    270:        b       exception_return
                    271: 
                    272: VECTOR( 0x400, "ISI" ):
                    273:        EXCEPTION_PREAMBLE
                    274:        lis     r3,HA(isi_exception)
                    275:        addi    r3,r3,LO(isi_exception)
                    276:        mtctr   r3
                    277:        bctrl
                    278:        b       exception_return
                    279: 
                    280:        ILLEGAL_VECTOR( 0x500 )
                    281:        ILLEGAL_VECTOR( 0x600 )
                    282:        ILLEGAL_VECTOR( 0x700 )
                    283: 
                    284: VECTOR( 0x800, "FPU" ):
                    285:        mtsprg1 r3
                    286:        mfsrr1  r3
                    287:        ori     r3,r3,0x2000
                    288:        mtsrr1  r3
                    289:        mfsprg1 r3
                    290:        rfi
                    291: 
                    292: ILLEGAL_VECTOR( 0x900 )
                    293: ILLEGAL_VECTOR( 0xa00 )
                    294: ILLEGAL_VECTOR( 0xb00 )
                    295: ILLEGAL_VECTOR( 0xc00 )
                    296: ILLEGAL_VECTOR( 0xd00 )
                    297: ILLEGAL_VECTOR( 0xe00 )
                    298: ILLEGAL_VECTOR( 0xf00 )
                    299: ILLEGAL_VECTOR( 0xf20 )
                    300: ILLEGAL_VECTOR( 0x1000 )
                    301: ILLEGAL_VECTOR( 0x1100 )
                    302: ILLEGAL_VECTOR( 0x1200 )
                    303: ILLEGAL_VECTOR( 0x1300 )
                    304: ILLEGAL_VECTOR( 0x1400 )
                    305: ILLEGAL_VECTOR( 0x1500 )
                    306: ILLEGAL_VECTOR( 0x1600 )
                    307: ILLEGAL_VECTOR( 0x1700 )
                    308: 
                    309: GLOBL(__vectors_end):
                    310: 
                    311: 
                    312: #define CACHE_LINE_SIZE         32
                    313: #define LG_CACHE_LINE_SIZE      5
                    314: 
                    315: /* flush_icache_range( unsigned long start, unsigned long stop) */
                    316: GLOBL(flush_icache_range):
                    317:         li      r5,CACHE_LINE_SIZE-1
                    318:         andc    r3,r3,r5
                    319:         subf    r4,r3,r4
                    320:         add     r4,r4,r5
                    321:         srwi.   r4,r4,LG_CACHE_LINE_SIZE
                    322:         beqlr
                    323:         mtctr   r4
                    324:         mr      r6,r3
                    325: 1:      dcbst   0,r3
                    326:         addi    r3,r3,CACHE_LINE_SIZE
                    327:         bdnz    1b
                    328:         sync                            /* wait for dcbst's to get to ram */
                    329:         mtctr   r4
                    330: 2:      icbi    0,r6
                    331:         addi    r6,r6,CACHE_LINE_SIZE
                    332:         bdnz    2b
                    333:         sync                            /* additional sync needed on g4 */
                    334:         isync
                    335:         blr

unix.superglobalmegacorp.com

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