Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / nvram.fs
diff --git a/qemu/roms/SLOF/slof/fs/nvram.fs b/qemu/roms/SLOF/slof/fs/nvram.fs
new file mode 100644 (file)
index 0000000..5ea58d1
--- /dev/null
@@ -0,0 +1,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
+;