diff options
Diffstat (limited to 'qemu/roms/openbios/libopenbios/bindings.c')
-rw-r--r-- | qemu/roms/openbios/libopenbios/bindings.c | 532 |
1 files changed, 0 insertions, 532 deletions
diff --git a/qemu/roms/openbios/libopenbios/bindings.c b/qemu/roms/openbios/libopenbios/bindings.c deleted file mode 100644 index 4f7a99379..000000000 --- a/qemu/roms/openbios/libopenbios/bindings.c +++ /dev/null @@ -1,532 +0,0 @@ -/* - * Creation Date: <2003/11/24 12:30:18 samuel> - * Time-stamp: <2004/01/07 19:37:38 samuel> - * - * <bindings.c> - * - * Forth bindings - * - * Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 - * - */ - -#include "config.h" -#include "libopenbios/bindings.h" -#include "libc/string.h" -#include "libc/stdlib.h" -#include "libc/byteorder.h" - - -/************************************************************************/ -/* forth interface glue */ -/************************************************************************/ - -void -push_str( const char *str ) -{ - PUSH( pointer2cell(str) ); - PUSH( str ? strlen(str) : 0 ); -} - -/* WARNING: sloooow - AVOID */ -cell -feval( const char *str ) -{ - push_str( str ); - return eword("evaluate", 2); -} - -cell -_eword( const char *word, xt_t *cache_xt, int nargs ) -{ - static xt_t catch_xt = 0; - cell ret = -1; - - if( !catch_xt ) - catch_xt = findword("catch"); - if( !*cache_xt ) - *cache_xt = findword( (char*)word ); - - if( *cache_xt ) { - PUSH_xt( *cache_xt ); - enterforth( catch_xt ); - if( (ret=POP()) ) - dstackcnt -= nargs; - } - return ret; -} - -/* note: only the built-in dictionary is searched */ -int -_fword( const char *word, xt_t *cache_xt ) -{ - if( !*cache_xt ) - *cache_xt = findword( (char*)word ); - - if( *cache_xt ) { - enterforth( *cache_xt ); - return 0; - } - return -1; -} - -int -_selfword( const char *method, xt_t *cache_xt ) -{ - if( !*cache_xt ) - *cache_xt = find_ih_method( method, my_self() ); - if( *cache_xt ) { - enterforth( *cache_xt ); - return 0; - } - return -1; -} - -int -_parword( const char *method, xt_t *cache_xt ) -{ - if( !*cache_xt ) - *cache_xt = find_ih_method( method, my_parent() ); - if( *cache_xt ) { - enterforth( *cache_xt ); - return 0; - } - return -1; -} - -void -bind_func( const char *name, void (*func)(void) ) -{ - PUSH( pointer2cell(func) ); - push_str( name ); - fword("is-cfunc"); -} - -void -bind_xtfunc( const char *name, xt_t xt, ucell arg, void (*func)(void) ) -{ - PUSH_xt( xt ); - PUSH( arg ); - PUSH( pointer2cell(func) ); - push_str( name ); - fword("is-xt-cfunc"); -} - -xt_t -bind_noname_func( void (*func)(void) ) -{ - PUSH( pointer2cell(func) ); - fword("is-noname-cfunc"); - return POP_xt(); -} - -void -throw( int error ) -{ - PUSH( error ); - fword("throw"); -} - - -/************************************************************************/ -/* ihandle related */ -/************************************************************************/ - -phandle_t -ih_to_phandle( ihandle_t ih ) -{ - PUSH_ih( ih ); - fword("ihandle>phandle"); - return POP_ph(); -} - -ihandle_t -my_parent( void ) -{ - fword("my-parent"); - return POP_ih(); -} - -ihandle_t -my_self( void ) -{ - fword("my-self"); - return POP_ih(); -} - -xt_t -find_package_method( const char *method, phandle_t ph ) -{ - push_str( method ); - PUSH_ph( ph ); - fword("find-method"); - if( POP() ) - return POP_xt(); - return 0; -} - -xt_t -find_ih_method( const char *method, ihandle_t ih ) -{ - return find_package_method( method, ih_to_phandle(ih) ); -} - - -xt_t -find_parent_method( const char *method ) -{ - return find_ih_method( method, my_parent() ); -} - -void -call_package( xt_t xt, ihandle_t ihandle ) -{ - PUSH_xt( xt ); - PUSH_ih( ihandle ); - fword("call-package"); -} - -void -call_parent( xt_t xt ) -{ - PUSH_xt( xt ); - fword("call-parent"); -} - -void -call_parent_method( const char *method ) -{ - push_str( method ); - fword("$call-parent"); -} - - -/************************************************************************/ -/* open/close package/dev */ -/************************************************************************/ - -ihandle_t -open_dev( const char *spec ) -{ - push_str( spec ); - fword("open-dev"); - return POP_ih(); -} - -void -close_dev( ihandle_t ih ) -{ - PUSH_ih( ih ); - fword("close-dev"); -} - -ihandle_t -open_package( const char *argstr, phandle_t ph ) -{ - push_str( argstr ); - PUSH_ph( ph ); - fword("open-package"); - return POP_ih(); -} - -void -close_package( ihandle_t ih ) -{ - PUSH_ih( ih ); - fword("close-package"); -} - - -/************************************************************************/ -/* ihandle arguments */ -/************************************************************************/ - -char * -pop_fstr_copy( void ) -{ - int len = POP(); - char *str, *p = (char*)cell2pointer(POP()); - if( !len ) - return NULL; - str = malloc( len + 1 ); - if( !str ) - return NULL; - memcpy( str, p, len ); - str[len] = 0; - return str; -} - -char * -my_args_copy( void ) -{ - fword("my-args"); - return pop_fstr_copy(); -} - - -/************************************************************************/ -/* properties */ -/************************************************************************/ - -void -set_property( phandle_t ph, const char *name, const char *buf, int len ) -{ - if( !ph ) { - printk("set_property: NULL phandle\n"); - return; - } - PUSH(pointer2cell(buf)); - PUSH(len); - push_str( name ); - PUSH_ph(ph); - fword("set-property"); -} - -void -set_int_property( phandle_t ph, const char *name, u32 val ) -{ - u32 swapped=__cpu_to_be32(val); - set_property( ph, name, (char*)&swapped, sizeof(swapped) ); -} - -char * -get_property( phandle_t ph, const char *name, int *retlen ) -{ - int len; - - if( retlen ) - *retlen = -1; - - push_str( name ); - PUSH_ph( ph ); - fword("get-package-property"); - if( POP() ) - return NULL; - len = POP(); - if( retlen ) - *retlen = len; - return (char*)cell2pointer(POP()); -} - -u32 -get_int_property( phandle_t ph, const char *name, int *retlen ) -{ - u32 *p; - - if( !(p=(u32 *)get_property(ph, name, retlen)) ) - return 0; - return __be32_to_cpu(*p); -} - - -/************************************************************************/ -/* device selection / iteration */ -/************************************************************************/ - -void -activate_dev( phandle_t ph ) -{ - PUSH_ph( ph ); - fword("active-package!"); -} - -phandle_t -activate_device( const char *str ) -{ - phandle_t ph = find_dev( str ); - activate_dev( ph ); - return ph; -} - -void -device_end( void ) -{ - fword("device-end"); -} - -phandle_t -get_cur_dev( void ) -{ - fword("active-package"); - return POP_ph(); -} - -phandle_t -find_dev( const char *path ) -{ - phandle_t ret = 0; - push_str( path ); - fword("(find-dev)"); - if( POP() ) - return POP_ph(); - return ret; -} - -char * -get_path_from_ph( phandle_t ph ) -{ - PUSH(ph); - fword("get-package-path"); - return pop_fstr_copy(); -} - -phandle_t -dt_iter_begin( void ) -{ - fword("iterate-tree-begin"); - return POP_ph(); -} - -phandle_t -dt_iterate( phandle_t last_tree ) -{ - if( !last_tree ) - return dt_iter_begin(); - - PUSH_ph( last_tree ); - fword("iterate-tree"); - return POP_ph(); -} - -phandle_t -dt_iterate_type( phandle_t last_tree, const char *type ) -{ - if( !last_tree ) - last_tree = dt_iter_begin(); - - /* root node is never matched but we don't care about that */ - while( (last_tree = dt_iterate(last_tree)) ) { - char *s = get_property( last_tree, "device_type", NULL ); - if( s && !strcmp(type, s) ) - break; - } - return last_tree; -} - - -/************************************************************************/ -/* node methods */ -/************************************************************************/ - -void -make_openable( int only_parents ) -{ - phandle_t ph, save_ph = get_cur_dev(); - PUSH_ph( save_ph ); - - for( ;; ) { - if( only_parents++ ) - fword("parent"); - if( !(ph=POP_ph()) ) - break; - activate_dev( ph ); - PUSH_ph( ph ); - fword("is-open"); - } - activate_dev( save_ph ); -} - -static void -call1_func( void ) -{ - void (*func)(cell v); - func = (void*)cell2pointer(POP()); - - (*func)( POP() ); -} - - -static void -add_methods( int flags, int size, const method_t *methods, int nmet ) -{ - xt_t xt=0; - int i; - - /* nodes might be matched multiple times */ - if( find_package_method(methods[0].name, get_cur_dev()) ) - return; - - if( size ) { - PUSH( size ); - fword("is-ibuf"); - xt = POP_xt(); - } - - for( i=0; i<nmet; i++ ) { - /* null-name methods specify static initializers */ - if( !methods[i].name ) { - typedef void (*initfunc)( void *p ); - char *buf = NULL; - if( xt ) { - enterforth( xt ); - buf = (char*)cell2pointer(POP()); - } - (*(initfunc)methods[i].func)( buf ); - continue; - } - if( !size ) - bind_func( methods[i].name, methods[i].func ); - else - bind_xtfunc( methods[i].name, xt, pointer2cell(methods[i].func), - &call1_func ); - } - - if( flags & INSTALL_OPEN ) - make_openable(0); -} - -void -bind_node( int flags, int size, const char * const *paths, int npaths, - const method_t *methods, int nmet ) -{ - phandle_t save_ph = get_cur_dev(); - int i; - - for( i=0; i<npaths; i++ ) { - const char *name = paths[i]; - - /* type matching? */ - if( *name == 'T' ) { - phandle_t ph = 0; - name++; - while( (ph=dt_iterate_type(ph, name)) ) { - activate_dev( ph ); - add_methods( flags, size, methods, nmet ); - } - continue; - } - - /* path patching */ - if( activate_device(name) ) - add_methods( flags, size, methods, nmet ); - else if( *name == '+' ) { - /* create node (and missing parents) */ - if( !activate_device(++name) ) { - push_str( name ); - fword("create-node"); - } - add_methods( flags, size, methods, nmet ); - } - } - activate_dev( save_ph ); -} - -phandle_t -bind_new_node( int flags, int size, const char *name, - const method_t *methods, int nmet ) -{ - phandle_t save_ph = get_cur_dev(); - phandle_t new_ph; - /* create node */ - push_str( name ); - fword("create-node"); - add_methods( flags, size, methods, nmet ); - new_ph = get_cur_dev(); - - activate_dev( save_ph ); - return new_ph; -} |