summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/forth/device/pathres.fs
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/forth/device/pathres.fs')
-rw-r--r--qemu/roms/openbios/forth/device/pathres.fs522
1 files changed, 0 insertions, 522 deletions
diff --git a/qemu/roms/openbios/forth/device/pathres.fs b/qemu/roms/openbios/forth/device/pathres.fs
deleted file mode 100644
index a185b95a1..000000000
--- a/qemu/roms/openbios/forth/device/pathres.fs
+++ /dev/null
@@ -1,522 +0,0 @@
-\ tag: Path resolution
-\
-\ this code implements IEEE 1275-1994 path resolution
-\
-\ Copyright (C) 2003 Samuel Rydh
-\
-\ See the file "COPYING" for further information about
-\ the copyright and warranty status of this work.
-\
-
-0 value interpose-ph
-0 0 create interpose-args , ,
-
-: expand-alias ( alias-addr alias-len -- exp-addr exp-len expanded? )
- 2dup
- " /aliases" find-dev 0= if 2drop false exit then
- get-package-property if
- false
- else
- 2swap 2drop
- \ drop trailing 0 from string
- dup if 1- then
- true
- then
-;
-
-\
-\ 4.3.1 Resolve aliases
-\
-
-\ the returned string is allocated with alloc-mem
-: pathres-resolve-aliases ( path-addr path-len -- path-addr path-len )
- over c@ 2f <> if
- 200 here + >r \ abuse dictionary for temporary storage
-
- \ If the pathname does not begin with "/", and its first node name
- \ component is an alias, replace the alias with its expansion.
- ascii / split-before \ (PATH_NAME, "/") -> (TAIL HEAD)
- ascii : split-before \ (HEAD, ":") -> (ALIAS_ARGS AL_NAME)
- expand-alias ( TAIL ALIAS_ARGS EXP_ALIAS_NAME expanded? )
- if
- 2 pick 0<> if \ If ALIAS_ARGS is not empty
- ascii / split-after \ (ALIAS_NAME, "/") -> (AL_TAIL AL_HEAD/)
- 2swap ( TAIL AL_HEAD/ AL_TAIL )
- ascii : split-before \ (AL_TAIL, ":") -> (DEAD_ARGS AL_TAIL)
- 2swap 2drop ( TAIL AL_ARGS AL_HEAD ALIAS_TAIL )
- 2swap ( TAIL AL_ARGS AL_TAIL AL_HEAD )
- r> tmpstrcat tmpstrcat >r
- else
- 2swap 2drop \ drop ALIAS_ARGS
- then
- r> tmpstrcat drop
- else
- \ put thing back together again
- r> tmpstrcat tmpstrcat drop
- then
- then
-
- strdup
- ( path-addr path-len )
-;
-
-\
-\ search struct
-\
-
-struct ( search information )
- 2 cells field >si.path
- 2 cells field >si.arguments
- 2 cells field >si.unit_addr
- 2 cells field >si.node_name
- 2 cells field >si.free_me
- 4 cells field >si.unit_phys
- /n field >si.unit_phys_len
- /n field >si.save-ihandle
- /n field >si.save-phandle
- /n field >si.top-ihandle
- /n field >si.top-opened \ set after successful open
- /n field >si.child \ node to match
-constant sinfo.size
-
-
-\
-\ 4.3.6 node name match criteria
-\
-
-: match-nodename ( childname len sinfo -- match? )
- >r
- 2dup r@ >si.node_name 2@
- ( [childname] [childname] [nodename] )
- strcmp 0= if r> 3drop true exit then
-
- \ does NODE_NAME contain a comma?
- r@ >si.node_name 2@ ascii , strchr
- if r> 3drop false exit then
-
- ( [childname] )
- ascii , left-split 2drop r@ >si.node_name 2@
- r> drop
- strcmp if false else true then
-;
-
-
-\
-\ 4.3.4 exact match child node
-\
-
-\ If NODE_NAME is not empty, make sure it matches the name property
-: common-match ( sinfo -- )
- >r
- \ a) NODE_NAME nonempty
- r@ >si.node_name 2@ nip if
- " name" r@ >si.child @ get-package-property if -1 throw then
- \ name is supposed to be null-terminated
- dup 0> if 1- then
- \ exit if NODE_NAME does not match
- r@ match-nodename 0= if -2 throw then
- then
- r> drop
-;
-
-: (exact-match) ( sinfo -- )
- >r
- \ a) If NODE_NAME is not empty, make sure it matches the name property
- r@ common-match
-
- \ b) UNIT_PHYS nonempty?
- r@ >si.unit_phys_len @ /l* ?dup if
- \ check if unit_phys matches
- " reg" r@ >si.child @ get-package-property if -3 throw then
- ( unitbytes propaddr proplen )
- rot r@ >si.unit_phys -rot
- ( propaddr unit_phys proplen unitbytes )
- swap over < if -4 throw then
- comp if -5 throw then
- else
- \ c) both NODE_NAME and UNIT_PHYS empty?
- r@ >si.node_name 2@ nip 0= if -6 throw then
- then
-
- r> drop
-;
-
-: exact-match ( sinfo -- match? )
- ['] (exact-match) catch if drop false exit then
- true
-;
-
-\
-\ 4.3.5 wildcard match child node
-\
-
-: (wildcard-match) ( sinfo -- match? )
- >r
- \ a) If NODE_NAME is not empty, make sure it matches the name property
- r@ common-match
-
- \ b) Fail if "reg" property exist
- " reg" r@ >si.child @ get-package-property 0= if -7 throw then
-
- \ c) Fail if both NODE_NAME and UNIT_ADDR are both empty
- r@ >si.unit_phys_len @
- r@ >si.node_name 2@ nip
- or 0= if -1 throw then
-
- \ SUCCESS
- r> drop
-;
-
-: wildcard-match ( sinfo -- match? )
- ['] (wildcard-match) catch if drop false exit then
- true
-;
-
-
-\
-\ 4.3.3 match child node
-\
-
-\ used if package lacks a decode-unit method
-: def-decode-unit ( str len -- unitaddr ... )
- parse-hex
-;
-
-: get-decode-unit-xt ( phandle -- xt )
- " decode-unit" rot find-method
- 0= if ['] def-decode-unit then
-;
-
-: find-child ( sinfo -- phandle )
- >r
- \ decode unit address string
- r@ >si.unit_addr 2@ dup if
- ( str len )
- active-package get-decode-unit-xt
- depth 3 - >r execute depth r@ - r> swap
- ( ... a_lo ... a_hi olddepth n )
- 4 min 0 max
- dup r@ >si.unit_phys_len !
- ( ... a_lo ... a_hi olddepth n )
- r@ >si.unit_phys >r
- begin 1- dup 0>= while
- rot r> dup la1+ >r l!-be
- repeat
- r> 2drop
- depth!
- else
- 2drop
- \ clear unit_phys
- 0 r@ >si.unit_phys_len !
- \ r@ >si.unit_phys 4 cells 0 fill
- then
-
- ( R: sinfo )
- ['] exact-match
- begin dup while
- active-package >dn.child @
- begin ?dup while
- dup r@ >si.child !
- ( xt phandle R: sinfo )
- r@ 2 pick execute if 2drop r> >si.child @ exit then
- >dn.peer @
- repeat
- ['] exact-match = if ['] wildcard-match else 0 then
- repeat
-
- -99 throw
-;
-
-
-\
-\ 4.3.2 Create new linked instance procedure
-\
-
-: link-one ( sinfo -- )
- >r
- active-package create-instance
- dup 0= if -99 throw then
-
- \ change instance parent
- r@ >si.top-ihandle @ over >in.my-parent !
- dup r@ >si.top-ihandle !
- to my-self
-
- \ b) set my-args field
- r@ >si.arguments 2@ strdup my-self >in.arguments 2!
-
- \ e) set my-unit field
- r@ >si.unit_addr 2@ nip if
- \ copy UNIT_PHYS to the my-unit field
- r@ >si.unit_phys my-self >in.my-unit 4 cells move
- else
- \ set unit-addr from reg property
- " reg" active-package get-package-property 0= if
- \ ( ihandle prop proplen )
- \ copy address to my-unit
- 4 cells min my-self >in.my-unit swap move
- else
- \ clear my-unit
- my-self >in.my-unit 4 cells 0 fill
- then
- then
-
- \ top instance has not been opened (yet)
- false r> >si.top-opened !
-;
-
-: invoke-open ( sinfo -- )
- " open" my-self ['] $call-method
- catch if 3drop false then
- 0= if -99 throw then
-
- true swap >si.top-opened !
-;
-
-\
-\ 4.3.7 Handle interposers procedure (supplement)
-\
-
-: handle-interposers ( sinfo -- )
- >r
- begin
- interpose-ph ?dup
- while
- 0 to interpose-ph
- active-package swap active-package!
-
- \ clear unit address and set arguments
- 0 0 r@ >si.unit_addr 2!
- interpose-args 2@ r@ >si.arguments 2!
- r@ link-one
- true my-self >in.interposed !
- interpose-args 2@ free-mem
- r@ invoke-open
-
- active-package!
- repeat
-
- r> drop
-;
-
-\
-\ 4.3.1 Path resolution procedure
-\
-
-\ close-dev ( ihandle -- )
-\
-: close-dev
- begin
- dup
- while
- dup >in.my-parent @
- swap close-package
- repeat
- drop
-;
-
-: path-res-cleanup ( sinfo close? )
-
- \ tear down all instances if close? is set
- if
- dup >si.top-opened @ if
- dup >si.top-ihandle @
- ?dup if close-dev then
- else
- dup >si.top-ihandle @ dup
- ( sinfo ihandle ihandle )
- dup if >in.my-parent @ swap then
- ( sinfo parent ihandle )
- ?dup if destroy-instance then
- ?dup if close-dev then
- then
- then
-
- \ restore active-package and my-self
- dup >si.save-ihandle @ to my-self
- dup >si.save-phandle @ active-package!
-
- \ free any allocated memory
- dup >si.free_me 2@ free-mem
- sinfo.size free-mem
-;
-
-: (path-resolution) ( context sinfo -- )
- >r r@ >si.path 2@
- ( context pathstr pathlen )
-
- \ this allocates a copy of the string
- pathres-resolve-aliases
- 2dup r@ >si.free_me 2!
-
- \ If the pathname, after possible alias expansion, begins with "/",
- \ begin the search at the root node. Otherwise, begin at the active
- \ package.
-
- dup if \ make sure string is not empty
- over c@ 2f = if
- swap char+ swap /c - \ Remove the "/" from PATH_NAME.
- \ Set the active package to the root node.
- device-tree @ active-package!
- then
- then
-
- r@ >si.path 2!
- 0 0 r@ >si.unit_addr 2!
- 0 0 r@ >si.arguments 2!
- 0 r@ >si.top-ihandle !
-
- \ If there is no active package, exit this procedure, returning false.
- ( context )
- active-package 0= if -99 throw then
-
- \ Begin the creation of an instance chain.
- \ NOTE--If, at this step, the active package is not the root node and
- \ we are in open-dev or execute-device-method contexts, the instance
- \ chain that results from the path resolution process may be incomplete.
-
- active-package swap
- ( virt-active-node context )
- begin
- r@ >si.path 2@ nip \ nonzero path?
- while
- \ ( active-node context )
- \ is this open-dev or execute-device-method context?
- dup if
- r@ link-one
- over active-package <> my-self >in.interposed !
- r@ invoke-open
- r@ handle-interposers
- then
- over active-package!
-
- r@ >si.path 2@ ( PATH )
-
- ascii / left-split ( PATH COMPONENT )
- ascii : left-split ( PATH ARGS NODE_ADDR )
- ascii @ left-split ( PATH ARGS UNIT_ADDR NODE_NAME )
-
- r@ >si.node_name 2!
- r@ >si.unit_addr 2!
- r@ >si.arguments 2!
- r@ >si.path 2!
-
- ( virt-active-node context )
-
- \ 4.3.1 i) pathname has a leading %?
- r@ >si.node_name 2@ 2dup 2dup ascii % strchr nip = if
- 1- swap 1+ swap r@ >si.node_name 2!
- " /packages" find-dev drop active-package!
- r@ find-child
- else
- 2drop
- nip r@ find-child swap over
- ( new-node context new-node )
- then
-
- \ (optional: open any nodes between parent and child )
-
- active-package!
- repeat
-
- ( virt-active-node type )
- dup if r@ link-one then
- 1 = if
- dup active-package <> my-self >in.interposed !
- r@ invoke-open
- r@ handle-interposers
- then
- active-package!
-
- r> drop
-;
-
-: path-resolution ( context path-addr path-len -- sinfo true | false )
- \ allocate and clear the search block
- sinfo.size alloc-mem >r
- r@ sinfo.size 0 fill
-
- \ store path
- r@ >si.path 2!
-
- \ save ihandle and phandle
- my-self r@ >si.save-ihandle !
- active-package r@ >si.save-phandle !
-
- \ save context (if we take an exception)
- dup
-
- r@ ['] (path-resolution)
- catch ?dup if
- ( context xxx xxx error )
- r> true path-res-cleanup
-
- \ rethrow everything except our "cleanup throw"
- dup -99 <> if throw then
- 3drop
-
- \ ( context ) throw an exception if this is find-device context
- if false else -22 throw then
- exit
- then
-
- \ ( context )
- drop r> true
- ( sinfo true )
-;
-
-
-: open-dev ( dev-str dev-len -- ihandle | 0 )
- 1 -rot path-resolution 0= if false exit then
-
- ( sinfo )
- my-self swap
- false path-res-cleanup
-
- ( ihandle )
-;
-
-: execute-device-method
-( ... dev-str dev-len met-str met-len -- ... false | ?? true )
- 2swap
- 2 -rot path-resolution 0= if 2drop false exit then
- ( method-str method-len sinfo )
- >r
- my-self ['] $call-method catch
- if 3drop false else true then
- r> true path-res-cleanup
-;
-
-: find-device ( dev-str dev-len -- )
- 2dup " .." strcmp 0= if
- 2drop
- active-package dup if >dn.parent @ then
- \ ".." in root note?
- dup 0= if -22 throw then
- active-package!
- exit
- then
- 0 -rot path-resolution 0= if false exit then
- ( sinfo )
- active-package swap
- true path-res-cleanup
- active-package!
-;
-
-\ find-device, but without side effects
-: (find-dev) ( dev-str dev-len -- phandle true | false )
- active-package -rot
- ['] find-device catch if 3drop false exit then
- active-package swap active-package! true
-;
-
-\ Tuck on a node at the end of the chain being created.
-\ This implementation follows the interpose recommended practice
-\ (v0.2 draft).
-
-: interpose ( arg-str arg-len phandle -- )
- to interpose-ph
- strdup interpose-args 2!
-;
-
-['] (find-dev) to find-dev