Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / lib / libbootmsg / bootmsg_lvl.S
diff --git a/qemu/roms/SLOF/lib/libbootmsg/bootmsg_lvl.S b/qemu/roms/SLOF/lib/libbootmsg/bootmsg_lvl.S
new file mode 100644 (file)
index 0000000..2e4c135
--- /dev/null
@@ -0,0 +1,204 @@
+/******************************************************************************
+ * 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 _ASM_
+#include "macros.h"
+#include "southbridge.h"
+#include "nvramlog.h"
+
+#define bootmsg_area_size 128
+
+       .text
+       .align  3
+
+// Declare the warning level for all 128 possibilities of AC/pCKG kombinations
+       WRNG_LVL:
+               .rept bootmsg_area_size
+               .byte 0x0
+               .endr
+
+
+//*****************************************************************************
+// Check UserWarningLevel against SystemWarningLevel
+// input : r3=cp-id, r5=level
+// change: r6,r7
+// output: CR0 ( compared user vs system level )
+//      example:
+//              bl GET_WRNG_LVL
+//              ble print_warning
+//              bgt do_not_print_warning
+ENTRY(GET_WRNG_LVL)
+       mflr    r7                      // save linkage register
+       bl      0f                      // get current
+0:     mflr    r6                      // Instruction Address
+       mtlr    r7                      // restore linkage register
+       addi    r6,r6,WRNG_LVL-0b       // calc addr of WRNG_LVL array
+       rldic   r7,r3,56,57             // calc index into array
+       lbzux   r7,r6,r7                // read the warning level
+       cmpw    r5,r7                   // and compare it
+       blr
+
+//*****************************************************************************
+// Print CheckPoint
+// input : r3=cp-id
+// change: r3, r4, r5, r6, r7, r11
+// output: none
+ENTRY(bootmsg_cp)
+       mflr    r11
+       mr      r9, r3          // save checkpoint ID
+       li      r3, 'C'
+       bl      io_putchar      // print character
+       mr      r3, r9
+       bl      io_printhex16   // print checkpoint ID
+       .rept   5
+       li      r3,'\b'
+       bl      io_putchar      // print backspaces
+       .endr
+       mtlr    r11
+       blr
+
+//*****************************************************************************
+// Print a general BootMessage
+// input : r3=cp-id, r4=string, r5=char (type C,W,E)
+// change: r3,r4,r5,r6,r7,r9,r10,r11,r12
+// output: none
+ENTRY(print_msg)
+       mflr    r11             // Save linkage register
+       mr      r9, r3          // Save ID
+       mr      r10, r4         // Save ptr to string
+       mr      r12, r5         // Save type (char [CWE])
+       li      r3, '\n'        // make it a new line
+       bl      io_putchar
+       li      r3, '\r'
+       bl      io_putchar
+       mr      r3, r12         // restore type
+       bl      io_putchar      // print character
+       mr      r3, r9          // restore ID
+       bl      io_printhex16   // print checkpoint ID
+       li      r3, ' '         // print a space
+       bl      io_putchar
+       mr      r3, r10         // restore ptr to string
+       bl      io_print        // print message
+       li      r3, '\n'        // add a new line
+       bl      io_putchar
+       li      r3, '\r'
+       bl      io_putchar
+       mtlr    r11             // restore linkage register
+       blr
+
+//*****************************************************************************
+// Print an Error Boot Message
+// input  : r3=cp-id, r4=string-ptr
+// change : r3,r4,r5,r6,r7,r9,r10,r11,r12
+// output : none
+ENTRY(bootmsg_error)
+       li      r5, 'E'         // E is for Error
+       b       print_msg       // and print this message
+
+//*****************************************************************************
+// Print a Warning Boot Message
+// input  : r3=cp-id, r4=string-ptr, r5=level
+// change : r3,r4,r5,r6,r7,r9,r10,r11,r12
+// output : none
+ENTRY(bootmsg_warning)
+       mflr    r11             // save linkage register
+       bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
+       mtlr    r11             // restore linkage register
+       li      r5, 'W'         // 'W' is for Warning
+       ble     print_msg       // if UserLevel<=SystemLevel print and return
+       blr                     // else return
+
+//*****************************************************************************
+// Print a Debug Checkpoint
+// input  : r3=cp-id, r4=string-ptr, r5=level
+// change : r3,r4,r5,r6,r7,r9,r10,r11,r12
+// output : none
+// r3=cp-id, r4=string, r5=level
+ENTRY(bootmsg_debugcp)
+       mflr    r11             // save linkage register
+       addi    r5,r5,0x20      // add checkpoint offset
+       bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
+       mtlr    r11             // restore linkage register
+       li      r5, 'D'         // 'D' is for Debug CheckPoint
+       ble     print_msg       // if UserLevel<=SystemLevel print and return
+       blr                     // else return
+
+//*****************************************************************************
+// Check warning level
+// input  : r3=cp-id, r4=level
+// change : r3,r4,r5,r6,r7,r9,r10,r11
+// output : r3 (true, false)
+// r3=cp-id, r4=level
+ENTRY(bootmsg_checklevel)
+       mflr    r11
+       mr      r5, r4
+       slwi    r3, r3, 8
+       bl      GET_WRNG_LVL    // check UserLevel against SystemLevel
+       li      r3, 0           // return 0
+       bgt     0f              // IF ( UserLevel < SystemLevel )
+       li      r3, 1           // | return 1
+0:     mtlr    r11             // FI
+       blr
+
+// r3=area|pkg, r4=level
+ENTRY(bootmsg_setlevel)
+       mflr    r5
+       bl      WarningMsg      // calc current IA
+       WarningMsg:
+       mflr    r6              // get current IA
+       addi    r6,r6,WRNG_LVL-WarningMsg
+       andi.   r3, r3, 0x7F
+       add     r6,r3,r6        // address     |
+       stb     r4,0(r6)        // store level |_ stwbrx r4,r3,r6
+       
+#if !defined(DISABLE_NVRAM) && !defined(RTAS_NVRAM)
+       LOAD64(r6, SB_NVRAM_FWONLY_adr + 8 )
+       add     r6,r6,r3
+       stb     r4,0(r6)
+#endif
+       mtlr    r5
+       blr
+
+ENTRY(bootmsg_nvupdate)
+#if !defined(DISABLE_NVRAM) && !defined(RTAS_NVRAM)
+       mflr    r10
+       LOAD64(r3, SB_NVRAM_FWONLY_adr)
+       lwz     r4, 0(r3)
+       cmpwi   r4, 0x424E                 // find bootmsg area header
+       bne     0f
+
+       LOAD64(r5, bootmsg_area_size/8)
+       mtctr   r5
+       bl      WngMsg
+       WngMsg:
+       mflr    r5
+       addi    r5,r5,WRNG_LVL-WngMsg-8
+
+1:
+       ldu     r4, 8(r3)
+       stdu    r4, 8(r5)
+       bdnz+   1b
+       b       2f
+
+0:
+       LOAD64(r5, bootmsg_area_size)
+       mtctr   r5
+       li      r4, 0x424E              // clear bootmsg log area
+       stw     r4, 0(r3)
+       li      r4, 0
+
+1:     stdu    r4, 8(r3)
+       bdnz+   1b
+
+2:                              // the end
+       mtlr    r10
+#endif
+       blr