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
13\ Create debug section in NVRAM
14: debug-init-nvram ( -- )
15   nvram-partition-type-debug get-nvram-partition IF
16      cr ." Could not find debug partition in NVRAM - "
17      nvram-partition-type-debug s" debug" d# 1024 new-nvram-partition
18      ABORT" Failed to create DEBUG NVRAM partition"
19      2dup erase-nvram-partition drop
20      ." created." cr
21   THEN
22   s" debug-nvram-partition" $2constant
23;
24
25debug-init-nvram
26
27: debug-add-env ( "name" "value" -- ) debug-nvram-partition 2rot 2rot internal-add-env drop ;
28: debug-set-env ( "name" "value" -- ) debug-nvram-partition 2rot 2rot internal-set-env drop ;
29: debug-get-env ( "name" -- "value" TRUE | FALSE) debug-nvram-partition 2swap internal-get-env ;
30
31: debug-get-history-enabled ( -- n )	s" history-enabled?" debug-get-env IF $number IF 0 THEN ELSE 0 THEN ;
32: debug-set-history-enabled ( n -- )	(.) s" history-enabled?" 2swap debug-set-env ;
33
34
35debug-get-history-enabled constant nvram-history?
36
37nvram-history? [IF]
38
39: history-init-nvram ( -- )
40   nvram-partition-type-history get-nvram-partition IF
41      cr ." Could not find history partition in NVRAM - "
42      nvram-partition-type-history s" history" d# 2048 new-nvram-partition
43      ABORT" Failed to create SMS NVRAM partition"
44      2dup erase-nvram-partition drop
45      ." created" cr
46   THEN
47   s" history-nvram-partition" $2constant
48;
49
50history-init-nvram
51
520 value (history-len)
530 value (history-adr)
54
55: (history-load-one) ( str len -- len )
56   \ 2dup ." loading " type cr
57   to (history-len) to (history-adr)
58   /his (history-len) + alloc-mem ( his )
59   his-tail 0= IF dup to his-tail THEN
60   his-head over his>next ! to his-head
61   his-head his>next @  his>prev his-head swap !
62   (history-len) his-head his>len !
63   (history-adr) his-head his>buf (history-len) move
64   (history-len) 1+
65;
66
67: history-load ( -- )
68   history-nvram-partition drop BEGIN dup WHILE
69      dup rzcount ( part str len )
70      dup IF
71         (history-load-one) +
72      ELSE
73         3drop 0
74      THEN
75   REPEAT
76   drop
77;
78
79: (history-store-one) ( pos len saddr slen -- FALSE | npos nlen TRUE )
80   dup 3 pick < IF \ enough space
81      dup >r rot >r
82      \ 2dup ." storing " type cr
83      bounds DO dup i c@ swap nvram-c! 1+ LOOP
84      dup 0 swap nvram-c! 1+
85      r> r> - 1- true
86   ELSE
87      2drop false
88   THEN
89;
90
91: history-store ( -- )
92   history-nvram-partition erase-nvram-partition drop
93   history-nvram-partition his-tail BEGIN dup WHILE
94      dup his>buf over his>len @
95      ( position len link saddr slen )
96      rot >r (history-store-one) r>
97      swap IF his>prev @ ELSE drop 0 THEN
98   REPEAT
99   2drop drop
100;
101
102\ redefine "end of SLOF" words to safe history
103: reset-all history-store reset-all ;
104: reboot history-store reboot ;
105: boot history-store boot ;
106
107[THEN]
108