summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/nvram.fs
blob: 5ea58d17f270561fe7758dd08d13aca0789af021 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
\ *****************************************************************************
\ * Copyright (c) 2004, 2014 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
\ ****************************************************************************/

51 CONSTANT nvram-partition-type-cpulog
\ types 53-55 are omitted because they have been used for
\ storing binary tables in the past
60 CONSTANT nvram-partition-type-sas
61 CONSTANT nvram-partition-type-sms
6e CONSTANT nvram-partition-type-debug
6f CONSTANT nvram-partition-type-history
70 CONSTANT nvram-partition-type-common
7f CONSTANT nvram-partition-type-freespace
a0 CONSTANT nvram-partition-type-linux

: rztype ( str len -- ) \ stop at zero byte, read with nvram-c@
   0 DO
      dup i + nvram-c@ ?dup IF ( str char )
         emit
      ELSE                     ( str )
         drop UNLOOP EXIT
      THEN
   LOOP
;

create tmpStr 500 allot
: rzcount ( zstr -- str len )
   dup tmpStr >r BEGIN
      dup nvram-c@ dup r> dup 1+ >r c!
   WHILE
      char+
   REPEAT
   r> drop over - swap drop tmpStr swap
;

: calc-header-cksum ( offset -- cksum )
   dup nvram-c@
   10 2 DO
      over I + nvram-c@ +
   LOOP
   wbsplit + nip
;

: bad-header? ( offset -- flag )
   dup 2+ nvram-w@        ( offset length )
   0= IF                  ( offset )
      drop true EXIT      ( )
   THEN
   dup calc-header-cksum  ( offset checksum' )
   swap 1+ nvram-c@       ( checksum ' checksum )
   <>                     ( flag )
;

: .header ( offset -- )
   cr                         ( offset )
   dup bad-header? IF         ( offset )
      ."   BAD HEADER -- trying to print it anyway" cr
   THEN
   space                      ( offset )
   \ print type
   dup nvram-c@ 2 0.r         ( offset )
   space space                ( offset )
   \ print length
   dup 2+ nvram-w@ 10 * 5 .r  ( offset )
   space space                ( offset )
   \ print name
   4 + 0c rztype              ( )
;

: .headers ( -- )
   cr cr ." Type  Size  Name"
   cr ." ========================"
   0 BEGIN                      ( offset )
      dup nvram-c@              ( offset type )
   WHILE
      dup .header               ( offset )
      dup 2+ nvram-w@ 10 * +    ( offset offset' )
      dup nvram-size < IF       ( offset )
      ELSE
	 drop EXIT              ( )
      THEN
   REPEAT
   drop                         ( )
   cr cr
;

: reset-nvram ( -- )
   internal-reset-nvram
;

: dump-partition     ['] nvram-c@      1 (dump) ;

: type-no-zero ( addr len -- )
   0 DO
      dup I + dup nvram-c@ 0= IF drop ELSE nvram-c@ emit THEN
   LOOP
   drop
;

: type-no-zero-part ( from-str cnt-str addr len )
   0 DO
      dup i + dup nvram-c@ 0= IF
         drop
      ELSE
         ( from-str cnt-str addr addr+i )
         ( from-str==0 AND cnt-str > 0 )
         3 pick 0= 3 pick 0 > AND IF
            dup 1 type-no-zero
         THEN

         nvram-c@ a = IF
            2 pick 0= IF
               over 1- 0 max
               rot drop swap
            THEN
            2 pick 1- 0 max
            3 roll drop rot rot
            ( from-str-- cnt-str-- addr addr+i )
         THEN
      THEN
   LOOP
   drop
;

: (dmesg-prepare) ( base-addr -- base-addr' addr len act-off )
   10 - \ go back to header
   dup 14 + nvram-l@ dup >r
   ( base-addr act-off ) ( R: act-off )
   over over over + swap 10 + nvram-w@ + >r
   ( base-addr act-off ) ( R:  act-off nvram-act-addr )
   over 2 + nvram-w@ 10 * swap - over swap
   ( base-addr base-addr start-size ) ( R:  act-off nvram-act-addr )
   r> swap rot 10 + nvram-w@ - r>
;

: .dmesg ( base-addr -- )
   (dmesg-prepare) >r
   ( base-addr addr len )
   cr type-no-zero
   ( base-addr ) ( R: act-off )
   dup 10 + nvram-w@ + r> type-no-zero
;

: .dmesg-part ( from-str cnt-str base-addr -- )
   (dmesg-prepare) >r
   ( from-str cnt-str base-addr addr len )
   >r >r -rot r> r>
   ( base-addr from-str cnt-str addr len )
   cr type-no-zero-part rot
   ( base-addr ) ( R: act-off )
   dup 10 + nvram-w@ + r> type-no-zero-part
;

: dmesg-part ( from-str cnt-str -- left-from-str left-cnt-str )
   2dup
   s" ibm,CPU0log" get-named-nvram-partition IF
      2drop EXIT
   THEN
   drop .dmesg-part nip nip
;

: dmesg2 ( -- )
   s" ibm,CPU1log" get-named-nvram-partition IF
      ." No log partition." cr EXIT
   THEN
   drop .dmesg
;

: dmesg ( -- )
   s" ibm,CPU0log" get-named-nvram-partition IF
      ." No log partition." cr EXIT
   THEN
   drop .dmesg
;