[OpenBIOS] [RFC v2] Pretty-print reg property
Andreas Färber
andreas.faerber at web.de
Thu Nov 4 01:44:44 CET 2010
Executing .properties for, e.g., the /memory node would print the "reg" property
as a series of bytes.
Modify the .properties and (.property) words to special-case property display
based on property name.
Visualize the "reg" format as a table.
v2:
* Use my-#acells for address size.
* Introduce my-#scells for size size.
* Confine special-handling of "available" to /memory and MMU.
Signed-off-by: Andreas Färber <andreas.faerber at web.de>
---
forth/admin/devices.fs | 60 +++++++++++++++++++++++++++++++++++++++++++--
forth/device/property.fs | 16 +++++++++++-
2 files changed, 72 insertions(+), 4 deletions(-)
diff --git a/forth/admin/devices.fs b/forth/admin/devices.fs
index dbb4646..6662a7e 100644
--- a/forth/admin/devices.fs
+++ b/forth/admin/devices.fs
@@ -289,9 +289,63 @@
2drop r> drop 1
;
+\ Helpers: Convert number of cells into number of bytes
+\ TODO honor cell size, currently assumes 4 (wrong for sparc64)
+: my-#acellbytes ( -- #bytes)
+ my-#acells 4 *
+;
+
+: my-#scellbytes ( -- #bytes)
+ my-#scells 4 *
+;
+
+: .p-reg ( data len -- )
+ swap >r 0
+ begin 2dup > while
+ dup r@ + c@
+ ( len n ch )
+ pocket tohexstr dup 2 <> if ." 0" then type
+ 1+
+ dup my-#acellbytes my-#scellbytes + mod my-#acellbytes = if
+ ." "
+ then
+ dup my-#acellbytes my-#scellbytes + mod 0= if
+ 2dup <> if
+ cr 0 begin ." " 1+ dup d# 26 >= until drop
+ then
+ then
+ repeat
+ 2drop r> drop
+;
+
\ this function tries to heuristically determine the data format
-: (.property) ( data len -- )
- dup 0= if 2drop ." <empty>" exit then
+: (.property) ( name-str name-len data len -- )
+ dup 0= if 2drop 2drop ." <empty>" exit then
+
+ 2over
+ ( name-str name-len data len name-str name-len )
+ " reg" strcmp 0= if .p-reg 2drop exit then
+ ( name-str name-len data len )
+ " name" active-package get-package-property 0= if
+ drop
+ ( name-str name-len data len prop-name )
+ " memory" comp0 0= if
+ 2over
+ " available" strcmp 0= if .p-reg 2drop exit then
+ then
+ then
+ ( name-str name-len data len )
+ " device_type" active-package get-package-property 0= if
+ drop
+ ( name-str name-len data len prop-name )
+ " cpu" comp0 0= if
+ 2over
+ " available" strcmp 0= if .p-reg 2drop exit then
+ then
+ then
+ ( name-str name-len data len )
+ 2swap 2drop
+ ( data len )
.p-string? if exit then
.p-int? if exit then
@@ -307,7 +361,7 @@
while
cr 2dup dup -rot type
begin ." " 1+ dup d# 26 >= until drop
- 2dup active-package get-package-property drop (.property)
+ 2dup 2dup active-package get-package-property drop (.property)
repeat
then
r> drop
diff --git a/forth/device/property.fs b/forth/device/property.fs
index 285113b..d0a46a0 100644
--- a/forth/device/property.fs
+++ b/forth/device/property.fs
@@ -143,7 +143,7 @@
then
;
-\ HELPER: get #address-cell value (from parent)
+\ HELPER: get #address-cells value (from parent)
\ Legal values are 1..4 (we may optionally support longer addresses)
: my-#acells ( -- #address-cells )
my-self ?dup if >in.device-node @ else active-package then
@@ -157,6 +157,20 @@
then
;
+\ HELPER: get #size-cells value (from parent)
+\ Legal values are 1..4 (we may optionally support longer addresses)
+: my-#scells ( -- #size-cells )
+ my-self ?dup if >in.device-node @ else active-package then
+ ?dup if >dn.parent @ then
+ ?dup if
+ " #size-cells" rot get-package-property if 2 exit then
+ \ we don't have to support more than 4 (and 0 is illegal)
+ decode-int nip nip 4 min 1 max
+ else
+ 2
+ then
+;
+
: decode-string ( prop-addr1 prop-len1 -- prop-addr2 prop-len2 str len )
dup 0> if
2dup bounds \ check property for 0 bytes
--
1.7.3
More information about the OpenBIOS
mailing list