155 lines
4.8 KiB
C
155 lines
4.8 KiB
C
|
/*
|
||
|
* Creation Date: <2003/12/19 23:09:56 samuel>
|
||
|
* Time-stamp: <2004/01/07 19:36:42 samuel>
|
||
|
*
|
||
|
* <bindings.h>
|
||
|
*
|
||
|
* 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
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _H_BINDINGS
|
||
|
#define _H_BINDINGS
|
||
|
|
||
|
#include "kernel/stack.h"
|
||
|
#include "kernel/kernel.h"
|
||
|
|
||
|
#define PUSH3(a,b,c) do { PUSH((a)); PUSH((b)); PUSH((c)); } while(0)
|
||
|
#define PUSH2(a,b) do { PUSH((a)); PUSH((b)); } while(0)
|
||
|
#define RET( v ) do { PUSH(v); return; } while(0)
|
||
|
|
||
|
/* initialization */
|
||
|
extern int initialize_forth( void );
|
||
|
|
||
|
/* panic */
|
||
|
extern int forth_segv_handler( char *segv_addr );
|
||
|
|
||
|
/* active package */
|
||
|
extern phandle_t find_dev( const char *path );
|
||
|
extern phandle_t get_cur_dev( void );
|
||
|
extern phandle_t activate_device( const char *str );
|
||
|
extern void device_end( void );
|
||
|
extern void activate_dev( phandle_t ph );
|
||
|
|
||
|
|
||
|
/* ihandle related */
|
||
|
extern phandle_t ih_to_phandle( ihandle_t ih );
|
||
|
extern ihandle_t my_parent( void );
|
||
|
extern ihandle_t my_self( void );
|
||
|
extern char *my_args_copy( void );
|
||
|
|
||
|
extern xt_t find_package_method( const char *meth, phandle_t ph );
|
||
|
extern xt_t find_ih_method( const char *method, ihandle_t ih );
|
||
|
extern xt_t find_parent_method( const char *method );
|
||
|
extern void call_package( xt_t xt, ihandle_t ihandle );
|
||
|
extern void call_parent( xt_t xt );
|
||
|
extern void call_parent_method( const char *method );
|
||
|
|
||
|
/* package */
|
||
|
extern ihandle_t open_package( const char *argstr, phandle_t ph );
|
||
|
extern ihandle_t open_dev( const char *spec );
|
||
|
extern void close_package( ihandle_t ih );
|
||
|
extern void close_dev( ihandle_t ih );
|
||
|
extern char *get_path_from_ph( phandle_t ph );
|
||
|
|
||
|
/* property access */
|
||
|
extern void set_property( phandle_t ph, const char *name,
|
||
|
const char *buf, int len );
|
||
|
extern void set_int_property( phandle_t ph, const char *name,
|
||
|
u32 val );
|
||
|
extern u32 get_int_property( phandle_t ph, const char *name,
|
||
|
int *retlen );
|
||
|
extern char *get_property( phandle_t ph, const char *name,
|
||
|
int *retlen );
|
||
|
|
||
|
/* device tree iteration */
|
||
|
extern phandle_t dt_iter_begin( void );
|
||
|
extern phandle_t dt_iterate( phandle_t last_tree );
|
||
|
extern phandle_t dt_iterate_type( phandle_t last_tree,
|
||
|
const char *type );
|
||
|
static inline phandle_t dt_find_type( const char *type ) {
|
||
|
return dt_iterate_type( 0, type );
|
||
|
}
|
||
|
|
||
|
/* forth bindings */
|
||
|
extern cell feval( const char *str );
|
||
|
extern void bind_xtfunc( const char *name, xt_t xt,
|
||
|
ucell arg, void (*func)(void) );
|
||
|
extern void bind_func( const char *name, void (*func)(void) );
|
||
|
extern xt_t bind_noname_func( void (*func)(void) );
|
||
|
extern void push_str( const char *str );
|
||
|
extern char *pop_fstr_copy( void );
|
||
|
|
||
|
extern int _fword( const char *word, xt_t *cache_xt );
|
||
|
extern cell _eword( const char *word, xt_t *cache_xt, int nargs );
|
||
|
extern int _selfword( const char *method, xt_t *cache_xt );
|
||
|
extern int _parword( const char *method, xt_t *cache_xt );
|
||
|
|
||
|
#define fword(w) ({ static xt_t cache_xt = 0; _fword(w, &cache_xt); })
|
||
|
#define eword(w, nargs) ({ static xt_t cache_xt = 0; _eword(w, &cache_xt, nargs); })
|
||
|
#define selfword(w) ({ static xt_t cache_xt = 0; _selfword(w, &cache_xt); })
|
||
|
#define parword(w) ({ static xt_t cache_xt = 0; _parword(w, &cache_xt); })
|
||
|
|
||
|
extern void throw( int error );
|
||
|
|
||
|
|
||
|
/* node bindings */
|
||
|
extern void make_openable( int only_parents );
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
const char *name;
|
||
|
void *func;
|
||
|
} method_t;
|
||
|
|
||
|
#define REGISTER_NODE_METHODS( name, path ) do { \
|
||
|
const char *paths[1]; \
|
||
|
\
|
||
|
paths[0] = path; \
|
||
|
bind_node( name##_flags_, name##_size_, \
|
||
|
paths, 1, name##_m, sizeof(name##_m)/sizeof(method_t)); \
|
||
|
} while(0)
|
||
|
|
||
|
#define BIND_NODE_METHODS(ph, name) do { \
|
||
|
bind_node_methods(ph, name##_flags_, name##_size_, \
|
||
|
name##_m, sizeof(name##_m)/sizeof(method_t)); \
|
||
|
} while(0)
|
||
|
|
||
|
#define DECLARE_UNNAMED_NODE( name, flags, size ) \
|
||
|
static const int name##_flags_ = flags; \
|
||
|
static const int name##_size_ = size;
|
||
|
|
||
|
#define DECLARE_NODE( name, flags, size, paths... ) \
|
||
|
static const char * const name##_p[] = { paths }; \
|
||
|
DECLARE_UNNAMED_NODE(name, flags, size)
|
||
|
|
||
|
#define NODE_METHODS( name ) \
|
||
|
static const method_t name##_m[]
|
||
|
|
||
|
#define REGISTER_NODE( name ) do { \
|
||
|
bind_node( name##_flags_, name##_size_, \
|
||
|
name##_p, sizeof(name##_p)/sizeof(char*), \
|
||
|
name##_m, sizeof(name##_m)/sizeof(method_t) ); \
|
||
|
} while(0)
|
||
|
|
||
|
extern void
|
||
|
bind_node_methods(phandle_t ph, int flags, int size, const method_t *methods, int nmet);
|
||
|
|
||
|
extern void bind_node( int flags, int size, const char * const *paths, int npaths,
|
||
|
const method_t *methods, int nmethods );
|
||
|
|
||
|
extern phandle_t bind_new_node( int flags, int size, const char *name,
|
||
|
const method_t *methods, int nmethods );
|
||
|
|
||
|
#define INSTALL_OPEN 1 /* install trivial open and close methods */
|
||
|
|
||
|
|
||
|
|
||
|
#endif /* _H_BINDINGS */
|