diff options
Diffstat (limited to 'arch')
-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, 70 insertions, 66 deletions
diff --git a/arch/cris/arch-v32/mach-fs/vcs_hook.c b/arch/cris/arch-v32/mach-fs/vcs_hook.c index 64d71c54c22c..593b10f07ef1 100644 --- a/arch/cris/arch-v32/mach-fs/vcs_hook.c +++ b/arch/cris/arch-v32/mach-fs/vcs_hook.c | |||
@@ -1,96 +1,100 @@ | |||
1 | // $Id: vcs_hook.c,v 1.2 2003/08/12 12:01:06 starvik Exp $ | 1 | /* |
2 | // | 2 | * Call simulator hook. This is the part running in the |
3 | // Call simulator hook. This is the part running in the | 3 | * simulated program. |
4 | // simulated program. | 4 | */ |
5 | // | ||
6 | 5 | ||
7 | #include "vcs_hook.h" | 6 | #include "vcs_hook.h" |
8 | #include <stdarg.h> | 7 | #include <stdarg.h> |
9 | #include <asm/arch-v32/hwregs/reg_map.h> | 8 | #include <asm/arch-v32/hwregs/reg_map.h> |
10 | #include <asm/arch-v32/hwregs/intr_vect_defs.h> | 9 | #include <asm/arch-v32/hwregs/intr_vect_defs.h> |
11 | 10 | ||
12 | #define HOOK_TRIG_ADDR 0xb7000000 /* hook cvlog model reg address */ | 11 | #define HOOK_TRIG_ADDR 0xb7000000 /* hook cvlog model reg address */ |
13 | #define HOOK_MEM_BASE_ADDR 0xa0000000 /* csp4 (shared mem) base addr */ | 12 | #define HOOK_MEM_BASE_ADDR 0xa0000000 /* csp4 (shared mem) base addr */ |
14 | 13 | ||
15 | #define HOOK_DATA(offset) ((unsigned*) HOOK_MEM_BASE_ADDR)[offset] | 14 | #define HOOK_DATA(offset) ((unsigned *)HOOK_MEM_BASE_ADDR)[offset] |
16 | #define VHOOK_DATA(offset) ((volatile unsigned*) HOOK_MEM_BASE_ADDR)[offset] | 15 | #define VHOOK_DATA(offset) ((volatile unsigned *)HOOK_MEM_BASE_ADDR)[offset] |
17 | #define HOOK_TRIG(funcid) do { *((unsigned *) HOOK_TRIG_ADDR) = funcid; } while(0) | 16 | #define HOOK_TRIG(funcid) \ |
18 | #define HOOK_DATA_BYTE(offset) ((unsigned char*) HOOK_MEM_BASE_ADDR)[offset] | 17 | do { \ |
18 | *((unsigned *) HOOK_TRIG_ADDR) = funcid; \ | ||
19 | } while (0) | ||
20 | #define HOOK_DATA_BYTE(offset) ((unsigned char *)HOOK_MEM_BASE_ADDR)[offset] | ||
19 | 21 | ||
20 | 22 | int hook_call(unsigned id, unsigned pcnt, ...) | |
21 | // ------------------------------------------------------------------ hook_call | 23 | { |
22 | int hook_call( unsigned id, unsigned pcnt, ...) { | 24 | va_list ap; |
23 | va_list ap; | 25 | unsigned i; |
24 | unsigned i; | 26 | unsigned ret; |
25 | unsigned ret; | ||
26 | #ifdef USING_SOS | 27 | #ifdef USING_SOS |
27 | PREEMPT_OFF_SAVE(); | 28 | PREEMPT_OFF_SAVE(); |
28 | #endif | 29 | #endif |
29 | 30 | ||
30 | // pass parameters | 31 | /* pass parameters */ |
31 | HOOK_DATA(0) = id; | 32 | HOOK_DATA(0) = id; |
32 | 33 | ||
33 | /* Have to make hook_print_str a special case since we call with a | 34 | /* Have to make hook_print_str a special case since we call with a |
34 | parameter of byte type. Should perhaps be a separate | 35 | * parameter of byte type. Should perhaps be a separate |
35 | hook_call. */ | 36 | * hook_call. */ |
36 | 37 | ||
37 | if (id == hook_print_str) { | 38 | if (id == hook_print_str) { |
38 | int i; | 39 | int i; |
39 | char *str; | 40 | char *str; |
40 | 41 | ||
41 | HOOK_DATA(1) = pcnt; | 42 | HOOK_DATA(1) = pcnt; |
42 | 43 | ||
43 | va_start(ap, pcnt); | 44 | va_start(ap, pcnt); |
44 | str = (char*)va_arg(ap,unsigned); | 45 | str = (char *)va_arg(ap, unsigned); |
45 | 46 | ||
46 | for (i=0; i!=pcnt; i++) { | 47 | for (i = 0; i != pcnt; i++) |
47 | HOOK_DATA_BYTE(8+i) = str[i]; | 48 | HOOK_DATA_BYTE(8 + i) = str[i]; |
48 | } | ||
49 | HOOK_DATA_BYTE(8+i) = 0; /* null byte */ | ||
50 | } | ||
51 | else { | ||
52 | va_start(ap, pcnt); | ||
53 | for( i = 1; i <= pcnt; i++ ) HOOK_DATA(i) = va_arg(ap,unsigned); | ||
54 | va_end(ap); | ||
55 | } | ||
56 | 49 | ||
57 | // read from mem to make sure data has propagated to memory before trigging | 50 | HOOK_DATA_BYTE(8 + i) = 0; /* null byte */ |
58 | *((volatile unsigned*) HOOK_MEM_BASE_ADDR); | 51 | } else { |
52 | va_start(ap, pcnt); | ||
53 | for (i = 1; i <= pcnt; i++) | ||
54 | HOOK_DATA(i) = va_arg(ap, unsigned); | ||
55 | va_end(ap); | ||
56 | } | ||
59 | 57 | ||
60 | // trigger hook | 58 | /* read from mem to make sure data has propagated to memory before |
61 | HOOK_TRIG(id); | 59 | * trigging */ |
60 | ret = *((volatile unsigned *)HOOK_MEM_BASE_ADDR); | ||
62 | 61 | ||
63 | // wait for call to finish | 62 | /* trigger hook */ |
64 | while( VHOOK_DATA(0) > 0 ) {} | 63 | HOOK_TRIG(id); |
65 | 64 | ||
66 | // extract return value | 65 | /* wait for call to finish */ |
66 | while (VHOOK_DATA(0) > 0) ; | ||
67 | 67 | ||
68 | ret = VHOOK_DATA(1); | 68 | /* extract return value */ |
69 | |||
70 | ret = VHOOK_DATA(1); | ||
69 | 71 | ||
70 | #ifdef USING_SOS | 72 | #ifdef USING_SOS |
71 | PREEMPT_RESTORE(); | 73 | PREEMPT_RESTORE(); |
72 | #endif | 74 | #endif |
73 | return ret; | 75 | return ret; |
74 | } | 76 | } |
75 | 77 | ||
76 | unsigned | 78 | unsigned hook_buf(unsigned i) |
77 | hook_buf(unsigned i) | ||
78 | { | 79 | { |
79 | return (HOOK_DATA(i)); | 80 | return (HOOK_DATA(i)); |
80 | } | 81 | } |
81 | 82 | ||
82 | void print_str( const char *str ) { | 83 | void print_str(const char *str) |
83 | int i; | 84 | { |
84 | for (i=1; str[i]; i++); /* find null at end of string */ | 85 | int i; |
85 | hook_call(hook_print_str, i, str); | 86 | /* find null at end of string */ |
87 | for (i = 1; str[i]; i++) ; | ||
88 | hook_call(hook_print_str, i, str); | ||
86 | } | 89 | } |
87 | 90 | ||
88 | // --------------------------------------------------------------- CPU_KICK_DOG | 91 | void CPU_KICK_DOG(void) |
89 | void CPU_KICK_DOG(void) { | 92 | { |
90 | (void) hook_call( hook_kick_dog, 0 ); | 93 | (void)hook_call(hook_kick_dog, 0); |
91 | } | 94 | } |
92 | 95 | ||
93 | // ------------------------------------------------------- CPU_WATCHDOG_TIMEOUT | 96 | void CPU_WATCHDOG_TIMEOUT(unsigned t) |
94 | void CPU_WATCHDOG_TIMEOUT( unsigned t ) { | 97 | { |
95 | (void) hook_call( hook_dog_timeout, 1, t ); | 98 | (void)hook_call(hook_dog_timeout, 1, t); |
96 | } | 99 | } |
100 | |||
diff --git a/arch/cris/arch-v32/mach-fs/vcs_hook.h b/arch/cris/arch-v32/mach-fs/vcs_hook.h index 7d73709e3cc6..c000b9fece41 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 @@ | |||
1 | // $Id: vcs_hook.h,v 1.1 2003/08/12 12:01:06 starvik Exp $ | 1 | /* |
2 | // | 2 | * Call simulator hook functions |
3 | // Call simulator hook functions | 3 | */ |
4 | 4 | ||
5 | #ifndef HOOK_H | 5 | #ifndef HOOK_H |
6 | #define HOOK_H | 6 | #define HOOK_H |
7 | 7 | ||
8 | int hook_call( unsigned id, unsigned pcnt, ...); | 8 | int hook_call(unsigned id, unsigned pcnt, ...); |
9 | 9 | ||
10 | enum hook_ids { | 10 | enum hook_ids { |
11 | hook_debug_on = 1, | 11 | hook_debug_on = 1, |