diff options
Diffstat (limited to 'arch/cris')
-rw-r--r-- | arch/cris/arch-v32/mach-fs/vcs_hook.c | 128 | ||||
-rw-r--r-- | arch/cris/arch-v32/mach-fs/vcs_hook.h | 8 |
2 files changed, 66 insertions, 70 deletions
diff --git a/arch/cris/arch-v32/mach-fs/vcs_hook.c b/arch/cris/arch-v32/mach-fs/vcs_hook.c index 593b10f07ef1..64d71c54c22c 100644 --- a/arch/cris/arch-v32/mach-fs/vcs_hook.c +++ b/arch/cris/arch-v32/mach-fs/vcs_hook.c @@ -1,100 +1,96 @@ -/* - * Call simulator hook. This is the part running in the - * simulated program. - */ +// $Id: vcs_hook.c,v 1.2 2003/08/12 12:01:06 starvik Exp $ +// +// Call simulator hook. This is the part running in the +// simulated program. +// #include "vcs_hook.h" #include <stdarg.h> #include <asm/arch-v32/hwregs/reg_map.h> #include <asm/arch-v32/hwregs/intr_vect_defs.h> -#define HOOK_TRIG_ADDR 0xb7000000 /* hook cvlog model reg address */ -#define HOOK_MEM_BASE_ADDR 0xa0000000 /* csp4 (shared mem) base addr */ +#define HOOK_TRIG_ADDR 0xb7000000 /* hook cvlog model reg address */ +#define HOOK_MEM_BASE_ADDR 0xa0000000 /* csp4 (shared mem) base addr */ -#define HOOK_DATA(offset) ((unsigned *)HOOK_MEM_BASE_ADDR)[offset] -#define VHOOK_DATA(offset) ((volatile unsigned *)HOOK_MEM_BASE_ADDR)[offset] -#define HOOK_TRIG(funcid) \ - do { \ - *((unsigned *) HOOK_TRIG_ADDR) = funcid; \ - } while (0) -#define HOOK_DATA_BYTE(offset) ((unsigned char *)HOOK_MEM_BASE_ADDR)[offset] +#define HOOK_DATA(offset) ((unsigned*) HOOK_MEM_BASE_ADDR)[offset] +#define VHOOK_DATA(offset) ((volatile unsigned*) HOOK_MEM_BASE_ADDR)[offset] +#define HOOK_TRIG(funcid) do { *((unsigned *) HOOK_TRIG_ADDR) = funcid; } while(0) +#define HOOK_DATA_BYTE(offset) ((unsigned char*) HOOK_MEM_BASE_ADDR)[offset] -int hook_call(unsigned id, unsigned pcnt, ...) -{ - va_list ap; - unsigned i; - unsigned ret; + +// ------------------------------------------------------------------ hook_call +int hook_call( unsigned id, unsigned pcnt, ...) { + va_list ap; + unsigned i; + unsigned ret; #ifdef USING_SOS - PREEMPT_OFF_SAVE(); + PREEMPT_OFF_SAVE(); #endif - /* pass parameters */ - HOOK_DATA(0) = id; + // pass parameters + HOOK_DATA(0) = id; - /* Have to make hook_print_str a special case since we call with a - * parameter of byte type. Should perhaps be a separate - * hook_call. */ + /* Have to make hook_print_str a special case since we call with a + parameter of byte type. Should perhaps be a separate + hook_call. */ - if (id == hook_print_str) { - int i; - char *str; + if (id == hook_print_str) { + int i; + char *str; - HOOK_DATA(1) = pcnt; + HOOK_DATA(1) = pcnt; - va_start(ap, pcnt); - str = (char *)va_arg(ap, unsigned); + va_start(ap, pcnt); + str = (char*)va_arg(ap,unsigned); - for (i = 0; i != pcnt; i++) - HOOK_DATA_BYTE(8 + i) = str[i]; + for (i=0; i!=pcnt; i++) { + HOOK_DATA_BYTE(8+i) = str[i]; + } + HOOK_DATA_BYTE(8+i) = 0; /* null byte */ + } + else { + va_start(ap, pcnt); + for( i = 1; i <= pcnt; i++ ) HOOK_DATA(i) = va_arg(ap,unsigned); + va_end(ap); + } - HOOK_DATA_BYTE(8 + i) = 0; /* null byte */ - } else { - va_start(ap, pcnt); - for (i = 1; i <= pcnt; i++) - HOOK_DATA(i) = va_arg(ap, unsigned); - va_end(ap); - } + // read from mem to make sure data has propagated to memory before trigging + *((volatile unsigned*) HOOK_MEM_BASE_ADDR); - /* read from mem to make sure data has propagated to memory before - * trigging */ - ret = *((volatile unsigned *)HOOK_MEM_BASE_ADDR); + // trigger hook + HOOK_TRIG(id); - /* trigger hook */ - HOOK_TRIG(id); + // wait for call to finish + while( VHOOK_DATA(0) > 0 ) {} - /* wait for call to finish */ - while (VHOOK_DATA(0) > 0) ; + // extract return value - /* extract return value */ - - ret = VHOOK_DATA(1); + ret = VHOOK_DATA(1); #ifdef USING_SOS - PREEMPT_RESTORE(); + PREEMPT_RESTORE(); #endif - return ret; + return ret; } -unsigned hook_buf(unsigned i) +unsigned +hook_buf(unsigned i) { - return (HOOK_DATA(i)); + return (HOOK_DATA(i)); } -void print_str(const char *str) -{ - int i; - /* find null at end of string */ - for (i = 1; str[i]; i++) ; - hook_call(hook_print_str, i, str); +void print_str( const char *str ) { + int i; + for (i=1; str[i]; i++); /* find null at end of string */ + hook_call(hook_print_str, i, str); } -void CPU_KICK_DOG(void) -{ - (void)hook_call(hook_kick_dog, 0); +// --------------------------------------------------------------- CPU_KICK_DOG +void CPU_KICK_DOG(void) { + (void) hook_call( hook_kick_dog, 0 ); } -void CPU_WATCHDOG_TIMEOUT(unsigned t) -{ - (void)hook_call(hook_dog_timeout, 1, t); +// ------------------------------------------------------- CPU_WATCHDOG_TIMEOUT +void CPU_WATCHDOG_TIMEOUT( unsigned t ) { + (void) hook_call( hook_dog_timeout, 1, t ); } - diff --git a/arch/cris/arch-v32/mach-fs/vcs_hook.h b/arch/cris/arch-v32/mach-fs/vcs_hook.h index c000b9fece41..7d73709e3cc6 100644 --- a/arch/cris/arch-v32/mach-fs/vcs_hook.h +++ b/arch/cris/arch-v32/mach-fs/vcs_hook.h @@ -1,11 +1,11 @@ -/* - * Call simulator hook functions - */ +// $Id: vcs_hook.h,v 1.1 2003/08/12 12:01:06 starvik Exp $ +// +// Call simulator hook functions #ifndef HOOK_H #define HOOK_H -int hook_call(unsigned id, unsigned pcnt, ...); +int hook_call( unsigned id, unsigned pcnt, ...); enum hook_ids { hook_debug_on = 1, |