Annotation of qemu/roms/SLOF/lib/libbootmsg/bootmsg_lvl.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: #define _ASM_
                     13: #include "macros.h"
                     14: #include "southbridge.h"
                     15: #include "nvramlog.h"
                     16: 
                     17: #define bootmsg_area_size 128
                     18: 
                     19:        .text
                     20:        .align  3
                     21: 
                     22: // Declare the warning level for all 128 possibilities of AC/pCKG kombinations
                     23:        WRNG_LVL:
                     24:                .rept bootmsg_area_size
                     25:                .byte 0x0
                     26:                .endr
                     27: 
                     28: 
                     29: //*****************************************************************************
                     30: // Check UserWarningLevel against SystemWarningLevel
                     31: // input : r3=cp-id, r5=level
                     32: // change: r6,r7
                     33: // output: CR0 ( compared user vs system level )
                     34: //      example:
                     35: //              bl GET_WRNG_LVL
                     36: //              ble print_warning
                     37: //              bgt do_not_print_warning
                     38: ENTRY(GET_WRNG_LVL)
                     39:        mflr    r7                      // save linkage register
                     40:        bl      0f                      // get current
                     41: 0:     mflr    r6                      // Instruction Address
                     42:        mtlr    r7                      // restore linkage register
                     43:        addi    r6,r6,WRNG_LVL-0b       // calc addr of WRNG_LVL array
                     44:        rldic   r7,r3,56,57             // calc index into array
                     45:        lbzux   r7,r6,r7                // read the warning level
                     46:        cmpw    r5,r7                   // and compare it
                     47:        blr
                     48: 
                     49: //*****************************************************************************
                     50: // Print CheckPoint
                     51: // input : r3=cp-id
                     52: // change: r3, r4, r5, r6, r7, r11
                     53: // output: none
                     54: ENTRY(bootmsg_cp)
                     55:        mflr    r11
                     56:        mr      r9, r3          // save checkpoint ID
                     57:        li      r3, 'C'
                     58:        bl      io_putchar      // print character
                     59:        mr      r3, r9
                     60:        bl      io_printhex16   // print checkpoint ID
                     61:        .rept   5
                     62:        li      r3,'\b'
                     63:        bl      io_putchar      // print backspaces
                     64:        .endr
                     65:        mtlr    r11
                     66:        blr
                     67: 
                     68: //*****************************************************************************
                     69: // Print a general BootMessage
                     70: // input : r3=cp-id, r4=string, r5=char (type C,W,E)
                     71: // change: r3,r4,r5,r6,r7,r9,r10,r11,r12
                     72: // output: none
                     73: ENTRY(print_msg)
                     74:        mflr    r11             // Save linkage register
                     75:        mr      r9, r3          // Save ID
                     76:        mr      r10, r4         // Save ptr to string
                     77:        mr      r12, r5         // Save type (char [CWE])
                     78:        li      r3, '\n'        // make it a new line
                     79:        bl      io_putchar
                     80:        li      r3, '\r'
                     81:        bl      io_putchar
                     82:        mr      r3, r12         // restore type
                     83:        bl      io_putchar      // print character
                     84:        mr      r3, r9          // restore ID
                     85:        bl      io_printhex16   // print checkpoint ID
                     86:        li      r3, ' '         // print a space
                     87:        bl      io_putchar
                     88:        mr      r3, r10         // restore ptr to string
                     89:        bl      io_print        // print message
                     90:        li      r3, '\n'        // add a new line
                     91:        bl      io_putchar
                     92:        li      r3, '\r'
                     93:        bl      io_putchar
                     94:        mtlr    r11             // restore linkage register
                     95:        blr
                     96: 
                     97: //*****************************************************************************
                     98: // Print an Error Boot Message
                     99: // input  : r3=cp-id, r4=string-ptr
                    100: // change : r3,r4,r5,r6,r7,r9,r10,r11,r12
                    101: // output : none
                    102: ENTRY(bootmsg_error)
                    103:        li      r5, 'E'         // E is for Error
                    104:        b       print_msg       // and print this message
                    105: 
                    106: //*****************************************************************************
                    107: // Print a Warning Boot Message
                    108: // input  : r3=cp-id, r4=string-ptr, r5=level
                    109: // change : r3,r4,r5,r6,r7,r9,r10,r11,r12
                    110: // output : none
                    111: ENTRY(bootmsg_warning)
                    112:        mflr    r11             // save linkage register
                    113:        bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
                    114:        mtlr    r11             // restore linkage register
                    115:        li      r5, 'W'         // 'W' is for Warning
                    116:        ble     print_msg       // if UserLevel<=SystemLevel print and return
                    117:        blr                     // else return
                    118: 
                    119: //*****************************************************************************
                    120: // Print a Debug Checkpoint
                    121: // input  : r3=cp-id, r4=string-ptr, r5=level
                    122: // change : r3,r4,r5,r6,r7,r9,r10,r11,r12
                    123: // output : none
                    124: // r3=cp-id, r4=string, r5=level
                    125: ENTRY(bootmsg_debugcp)
                    126:        mflr    r11             // save linkage register
                    127:        addi    r5,r5,0x20      // add checkpoint offset
                    128:        bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
                    129:        mtlr    r11             // restore linkage register
                    130:        li      r5, 'D'         // 'D' is for Debug CheckPoint
                    131:        ble     print_msg       // if UserLevel<=SystemLevel print and return
                    132:        blr                     // else return
                    133: 
                    134: //*****************************************************************************
                    135: // Check warning level
                    136: // input  : r3=cp-id, r4=level
                    137: // change : r3,r4,r5,r6,r7,r9,r10,r11
                    138: // output : r3 (true, false)
                    139: // r3=cp-id, r4=level
                    140: ENTRY(bootmsg_checklevel)
                    141:        mflr    r11
                    142:        mr      r5, r4
                    143:        slwi    r3, r3, 8
                    144:        bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
                    145:        li      r3, 0           // return 0
                    146:        bgt     0f              // IF ( UserLevel < SystemLevel )
                    147:        li      r3, 1           // | return 1
                    148: 0:     mtlr    r11             // FI
                    149:        blr
                    150: 
                    151: // r3=area|pkg, r4=level
                    152: ENTRY(bootmsg_setlevel)
                    153:        mflr    r5
                    154:        bl      WarningMsg      // calc current IA
                    155:        WarningMsg:
                    156:        mflr    r6              // get current IA
                    157:        addi    r6,r6,WRNG_LVL-WarningMsg
                    158:        andi.   r3, r3, 0x7F
                    159:        add     r6,r3,r6        // address     |
                    160:        stb     r4,0(r6)        // store level |_ stwbrx r4,r3,r6
                    161: #ifndef DISABLE_NVRAM
                    162:        LOAD64(r6, SB_NVRAM_FWONLY_adr + 8 )
                    163:        add     r6,r6,r3
                    164:        stb     r4,0(r6)
                    165: #endif
                    166:        mtlr    r5
                    167:        blr
                    168: 
                    169: ENTRY(bootmsg_nvupdate)
                    170: #ifndef DISABLE_NVRAM
                    171:        mflr    r10
                    172:        LOAD64(r3, SB_NVRAM_FWONLY_adr)
                    173:        lwz     r4, 0(r3)
                    174:        cmpwi   r4, 0x424E                 // find bootmsg area header
                    175:        bne     0f
                    176: 
                    177:        LOAD64(r5, bootmsg_area_size/8)
                    178:        mtctr   r5
                    179:        bl      WngMsg
                    180:        WngMsg:
                    181:        mflr    r5
                    182:        addi    r5,r5,WRNG_LVL-WngMsg-8
                    183: 
                    184: 1:
                    185:        ldu     r4, 8(r3)
                    186:        stdu    r4, 8(r5)
                    187:        bdnz+   1b
                    188:        b       2f
                    189: 
                    190: 0:
                    191:        LOAD64(r5, bootmsg_area_size)
                    192:        mtctr   r5
                    193:        li      r4, 0x424E              // clear bootmsg log area
                    194:        stw     r4, 0(r3)
                    195:        li      r4, 0
                    196: 
                    197: 1:     stdu    r4, 8(r3)
                    198:        bdnz+   1b
                    199: 
                    200: 2:                              // the end
                    201:        mtlr    r10
                    202: #endif
                    203:        blr

unix.superglobalmegacorp.com

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