Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / lib / libbootmsg / bootmsg_lvl.S
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         
162 #if !defined(DISABLE_NVRAM) && !defined(RTAS_NVRAM)
163         LOAD64(r6, SB_NVRAM_FWONLY_adr + 8 )
164         add     r6,r6,r3
165         stb     r4,0(r6)
166 #endif
167         mtlr    r5
168         blr
169
170 ENTRY(bootmsg_nvupdate)
171 #if !defined(DISABLE_NVRAM) && !defined(RTAS_NVRAM)
172         mflr    r10
173         LOAD64(r3, SB_NVRAM_FWONLY_adr)
174         lwz     r4, 0(r3)
175         cmpwi   r4, 0x424E                 // find bootmsg area header
176         bne     0f
177
178         LOAD64(r5, bootmsg_area_size/8)
179         mtctr   r5
180         bl      WngMsg
181         WngMsg:
182         mflr    r5
183         addi    r5,r5,WRNG_LVL-WngMsg-8
184
185 1:
186         ldu     r4, 8(r3)
187         stdu    r4, 8(r5)
188         bdnz+   1b
189         b       2f
190
191 0:
192         LOAD64(r5, bootmsg_area_size)
193         mtctr   r5
194         li      r4, 0x424E              // clear bootmsg log area
195         stw     r4, 0(r3)
196         li      r4, 0
197
198 1:      stdu    r4, 8(r3)
199         bdnz+   1b
200
201 2:                              // the end
202         mtlr    r10
203 #endif
204         blr