[OpenBIOS] "next-property" reloaded !
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Mon Mar 3 22:12:41 CET 2014
On 18/02/14 01:08, Olivier Danet wrote:
> Hello !
> I have tried to recreate the 3 known variants of next-property:
>
> Standard : a) true "string" b) false c) false
> Sun Ultra10 : a) -1 "string" b) nothing c) nothing
> PowerPC iBook : a) -1 "string" b) -1 0 0 c) 0
>
> Here is a tentative patch :
>
> Index: forth/admin/devices.fs
> ===================================================================
> --- forth/admin/devices.fs (révision 1269)
> +++ forth/admin/devices.fs (copie de travail)
> @@ -451,7 +451,7 @@
> ?active-package dup >r if
> 0 0
> begin
> - r@ next-property
> + r@ next-property-std
> while
> cr 2dup dup -rot type
> begin ." " 1+ dup d# 26 >= until drop
> Index: forth/device/property.fs
> ===================================================================
> --- forth/device/property.fs (révision 1269)
> +++ forth/device/property.fs (copie de travail)
> @@ -63,14 +63,14 @@
> ;
>
> \ From package (5.3.4.1)
> -: next-property
> +: next-property-std
> ( previous-str previous-len phandle -- false | name-str name-len true )
> >r
> 2dup 0= swap 0= or if
> 2drop r> >dn.properties @
> else
> r> find-property dup if @ then
> - ?dup if >prop.next @ then
> + dup if >prop.next @ then
> then
>
> ?dup if
> @@ -81,7 +81,57 @@
> then
> ;
>
> +: next-property-ppc
> +( previous-str previous-len phandle -- false | name-str name-len true |
> 0 0 true )
> + >r
> + 2dup 0= swap 0= or if
> + 2drop r> >dn.properties @ true
> + else
> + r> find-property dup if @ then
> + dup if >prop.next @ true then
> + then
>
> + if
> + dup if
> + >prop.name @ dup cstrlen
> + ( phandle name-str name-len )
> + else
> + 0
> + ( 0 0 )
> + then
> + true
> + else
> + false
> + then
> +;
> +
> +: next-property-std-bis
> + next-property-ppc
> + dup
> + if over 0=
> + if
> + 2drop
> + then
> + then
> +;
> +
> +: next-property-s64
> + next-property-std
> + ?dup drop
> +;
> +
> +: next-property
> + [IFDEF] CONFIG_PPC
> + next-property-ppc
> + [ELSE]
> + [IFDEF] CONFIG_SPARC64
> + next-property-s64
> + [ELSE]
> + next-property-std
> + [THEN]
> + [THEN]
> +;
> +
> \
> \ 5.3.5.4 Property value access
> \
> Index: forth/system/ciface.fs
> ===================================================================
> --- forth/system/ciface.fs (révision 1269)
> +++ forth/system/ciface.fs (copie de travail)
> @@ -121,7 +121,7 @@
>
> ( buf prev prev_len )
>
> - r> next-property if
> + r> next-property-std if
> ( buf name name_len )
> dup 1+ -rot ci-strcpy drop 1
> else
> ===================================================================
>
> there are :
> next-property-std = standard, used by Sparc32 "romvec" C code and by
> forth code, like ".properties"
> next-property-s64 = Sparc64 version, built from next-property-std
> next-property-ppc = PowerPC version
> next-property-std-bis = Alternate standard version, built from the PPC
> one (e.g. when compiling for PPC target)
>
> Tests :
>
> showstack
> cd screen
>
> \ Sparc32
> " " ?active-package next-property-std cr . type cr
> " name" ?active-package next-property-std cr . type cr
> " interrupts" ?active-package next-property-std cr . cr
> " ttttt" ?active-package next-property-std cr . cr
>
> \ PowerPC
> " " ?active-package next-property-ppc cr . type cr
> " name" ?active-package next-property-ppc cr . type cr
> " interrupts" ?active-package next-property-ppc cr . . . cr
> " ttttt" ?active-package next-property-ppc cr . cr
>
> \ Sparc64
> " " ?active-package next-property-s64 cr . type cr
> " name" ?active-package next-property-s64 cr . type cr
> " interrupts" ?active-package next-property-s64 cr
> " ttttt" ?active-package next-property-s64 cr
>
>
> " " ?active-package next-property-std-bis cr . type cr
> " name" ?active-package next-property-std-bis cr . type cr
> " interrupts" ?active-package next-property-std-bis cr . cr
> " ttttt" ?active-package next-property-std-bis cr . cr
>
> Currently all variants are available simultaneously.
> Additional [IFDEF] can be used to hide some variants according
> to compilation options, generate the -std from the -ppc,..
>
> One more oddity:
> NetBSD is not the only one to do strange things with properties.
> In OpenBSD, one can find :
> arch/sparc/dev/sbus.c:int sbus_testdma(sc, ca)
> ...
> getpropint(0, "slave-only", 0)
> ...
> arch/sparc/dev/sbus.c:int sbus_print(args, sbus)
> ...
> getpropint(0, sl, 0)
> ...
> Here, 0 should select the 'root' node.
> It really looks like a bug in OpenBSD.
> It does not prevent the OS from running though.
>
> Olivier
Hi Olivier,
Thanks for doing this patch, and apologies for the delay in getting back
to you as it has given me quite a few things to think about!
My current thoughts at the moment are that the reason these particular
differences in next-property have only just been discovered is because
it is extremely unlikely that anyone would call it directly. So as we
discovered from Zoltan, PPC/SPARC64 would call next-property via the
client interface, and we know that SPARC32 would call next-property via
the romvec block.
I guess the only way these bugs could be encountered would be if someone
evaluated a Forth string containing next-property directly, and why
would they bother if OpenBIOS already provides a method to do this via
CIF/romvec?
Therefore what I would suggest is that we hold on this patch for the
moment and instead could you provide an alternative that fixes the
return from next-property in obp_nextprop instead? That way we have the
results of your research preserved in the archives in case we need to
rethink this later, plus the patch itself is much simpler making it much
less likely to affect other platforms.
ATB,
Mark.
More information about the OpenBIOS
mailing list