Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / forth / util / util.fs
diff --git a/qemu/roms/openbios/forth/util/util.fs b/qemu/roms/openbios/forth/util/util.fs
new file mode 100644 (file)
index 0000000..6f549bf
--- /dev/null
@@ -0,0 +1,95 @@
+\ tag: Utility functions
+\ 
+\ Utility functions
+\ 
+\ Copyright (C) 2003, 2004 Samuel Rydh
+\ 
+\ See the file "COPYING" for further information about
+\ the copyright and warranty status of this work.
+\ 
+
+\ -------------------------------------------------------------------------
+\ package utils
+\ -------------------------------------------------------------------------
+
+( method-str method-len package-str package-len -- xt|0 )
+: $find-package-method
+  find-package 0= if 2drop false exit then
+  find-method 0= if 0 then
+;
+
+\ like $call-parent but takes an xt
+: call-parent ( ... xt -- ??? )
+  my-parent call-package
+;
+
+: [active-package],
+       ['] (lit) , active-package ,
+; immediate
+
+\ -------------------------------------------------------------------------
+\ word creation
+\ -------------------------------------------------------------------------
+
+: ?mmissing ( name len -- 1 name len | 0 )
+  2dup active-package find-method
+  if 3drop false else true then
+;
+
+\ install trivial open and close functions
+: is-open ( -- )
+  " open" ?mmissing if ['] true -rot is-xt-func then
+  " close" ?mmissing if 0 -rot is-xt-func then
+;
+
+\ is-relay installs a relay function (a function that calls
+\ a function with the same name but belonging to a different node).
+\ The execution behaviour of xt should be ( -- ptr-to-ihandle ).
+\ 
+: is-relay ( xt ph name-str name-len -- )
+  rot >r 2dup r> find-method 0= if
+    \ function missing (not necessarily an error)
+    3drop exit
+  then
+
+  -rot is-func-begin
+  ( xt method-xt )
+  ['] (lit) , ,                 \ ['] method
+  , ['] @ ,                     \ xt @
+  ['] call-package ,            \ call-package
+  is-func-end
+;
+
+\ -------------------------------------------------------------------------
+\ install deblocker bindings
+\ -------------------------------------------------------------------------
+
+: (open-deblocker) ( varaddr -- )
+  " deblocker" find-package if
+    0 0 rot open-package
+  else 0 then
+  swap !
+;
+  
+: is-deblocker ( -- )
+  " deblocker" find-package 0= if exit then >r
+  " deblocker" is-ivariable
+
+  \ create open-deblocker
+  " open-deblocker" is-func-begin
+  dup , ['] (open-deblocker) ,
+  is-func-end
+
+  \ create close-deblocker
+  " close-deblocker" is-func-begin
+  dup , ['] @ , ['] close-package ,
+  is-func-end
+  
+  ( save-ph deblk-xt R: deblocker-ph  )
+  r>
+  2dup " read" is-relay
+  2dup " seek" is-relay
+  2dup " write" is-relay
+  2dup " tell" is-relay
+  2drop
+;