Rev 1019 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
490 | giacomo | 1 | #include <kernel/int_sem.h> |
2 | #include <stdlib.h> |
||
496 | giacomo | 3 | #include <kernel/func.h> |
4 | #include <ll/sys/ll/event.h> |
||
540 | giacomo | 5 | #include <ll/i386/pic.h> |
905 | mauro | 6 | #include <tracer.h> |
490 | giacomo | 7 | |
526 | giacomo | 8 | #include <linuxcomp.h> |
9 | |||
1007 | mauro | 10 | extern int add_interrupt_job(int no); |
11 | extern void set_noint_handler(void * new_handler); |
||
540 | giacomo | 12 | |
1007 | mauro | 13 | extern int intr_count; |
513 | giacomo | 14 | |
1019 | mauro | 15 | //#define DEBUG_SHARK_GLUE |
513 | giacomo | 16 | |
514 | giacomo | 17 | /* 1-15 for IRQ and 16-63 for timers */ |
1007 | mauro | 18 | void *timer_arg_table[MAX_TIMER_TABLE]; |
19 | void *timer_func_table[MAX_TIMER_TABLE]; |
||
20 | int timer_table[MAX_TIMER_TABLE]; |
||
21 | int intr_table[NR_IRQS]; |
||
513 | giacomo | 22 | |
1007 | mauro | 23 | int use_intdrive = 0; |
24 | static int current_timer = 0; |
||
514 | giacomo | 25 | |
1007 | mauro | 26 | void shark_internal_sem_create(void **sem, int init) { |
27 | *sem = (void *)malloc(sizeof(internal_sem_t)); |
||
28 | internal_sem_init((internal_sem_t *)(*sem),init); |
||
29 | } |
||
513 | giacomo | 30 | |
1007 | mauro | 31 | void shark_internal_sem_wait(void *sem) { |
32 | internal_sem_wait((internal_sem_t *)(sem)); |
||
513 | giacomo | 33 | } |
34 | |||
1007 | mauro | 35 | void shark_internal_sem_post(void *sem) { |
36 | internal_sem_post((internal_sem_t *)(sem)); |
||
513 | giacomo | 37 | } |
38 | |||
1007 | mauro | 39 | /* Timers */ |
559 | giacomo | 40 | |
514 | giacomo | 41 | int get_free_timer_slot() |
42 | { |
||
1007 | mauro | 43 | int i = current_timer; |
514 | giacomo | 44 | |
559 | giacomo | 45 | while(timer_table[i] != -1) { |
1007 | mauro | 46 | if (i < MAX_TIMER_TABLE) { |
559 | giacomo | 47 | i++; |
48 | } else { |
||
1007 | mauro | 49 | i = 0; |
559 | giacomo | 50 | } |
1007 | mauro | 51 | if (i == current_timer) return -1; |
559 | giacomo | 52 | } |
53 | |||
54 | current_timer = i+1; |
||
1007 | mauro | 55 | if (current_timer >= MAX_TIMER_TABLE) current_timer = 0; |
559 | giacomo | 56 | |
514 | giacomo | 57 | return i; |
58 | } |
||
59 | |||
1007 | mauro | 60 | void shark_timer_exec(int n) |
513 | giacomo | 61 | { |
1007 | mauro | 62 | int no = n - 16; |
63 | void(*tmp_func)(void*) = timer_func_table[no]; |
||
513 | giacomo | 64 | |
1007 | mauro | 65 | #ifdef DEBUG_SHARK_GLUE |
66 | cprintf("(Timer EXEC %d)", no); |
||
67 | #endif |
||
513 | giacomo | 68 | |
1007 | mauro | 69 | if (tmp_func != NULL){ |
70 | intr_count++; |
||
71 | (tmp_func)(timer_arg_table[no]); |
||
72 | intr_count--; |
||
513 | giacomo | 73 | } |
74 | |||
1007 | mauro | 75 | timer_table[no] = -1; |
76 | timer_func_table[no] = NULL; |
||
77 | timer_arg_table[no] = NULL; |
||
513 | giacomo | 78 | } |
79 | |||
514 | giacomo | 80 | void fast_call_timer(void *arg) |
496 | giacomo | 81 | { |
1007 | mauro | 82 | int no = (int)arg; |
83 | int res; |
||
514 | giacomo | 84 | |
1007 | mauro | 85 | #ifdef DEBUG_SHARK_GLUE |
86 | cprintf("(Timer fast %d)", no); |
||
87 | #endif |
||
514 | giacomo | 88 | |
525 | giacomo | 89 | timer_table[no] = -2; |
90 | |||
1007 | mauro | 91 | if (use_intdrive == TRUE) { |
92 | res = add_interrupt_job(no+16); |
||
93 | } else { |
||
94 | shark_timer_exec(no+16); |
||
95 | } |
||
490 | giacomo | 96 | } |
97 | |||
514 | giacomo | 98 | int shark_timer_set(const struct timespec *time, void *handler, void *arg) |
496 | giacomo | 99 | { |
514 | giacomo | 100 | SYS_FLAGS f; |
101 | int i; |
||
102 | |||
103 | f = kern_fsave(); |
||
104 | |||
105 | i = get_free_timer_slot(); |
||
106 | |||
107 | if (i == -1) { |
||
108 | kern_frestore(f); |
||
109 | return -1; |
||
110 | } |
||
111 | |||
1007 | mauro | 112 | timer_func_table[i] = handler; |
113 | timer_arg_table[i] = arg; |
||
514 | giacomo | 114 | |
1007 | mauro | 115 | timer_table[i] = kern_event_post(time, fast_call_timer, (void *)(i)); |
514 | giacomo | 116 | |
117 | if (timer_table[i] == -1) { |
||
118 | kern_frestore(f); |
||
1007 | mauro | 119 | return -1; |
120 | } |
||
514 | giacomo | 121 | |
122 | kern_frestore(f); |
||
123 | |||
124 | return i; |
||
496 | giacomo | 125 | } |
490 | giacomo | 126 | |
514 | giacomo | 127 | int shark_timer_delete(int index) |
513 | giacomo | 128 | { |
514 | giacomo | 129 | SYS_FLAGS f; |
1018 | mauro | 130 | |
1007 | mauro | 131 | f = kern_fsave(); |
514 | giacomo | 132 | |
1078 | fabio | 133 | if (index < 0 || index >= MAX_TIMER_TABLE) { |
522 | mauro | 134 | kern_frestore(f); |
135 | return -1; |
||
136 | } |
||
137 | |||
1007 | mauro | 138 | #ifdef DEBUG_SHARK_GLUE |
1018 | mauro | 139 | cprintf("(Timer Del %d)", index); |
1007 | mauro | 140 | #endif |
540 | giacomo | 141 | |
525 | giacomo | 142 | if (timer_table[index] != -1 && timer_table[index] != -2) { |
1007 | mauro | 143 | timer_func_table[index] = NULL; |
144 | timer_arg_table[index] = NULL; |
||
1018 | mauro | 145 | |
514 | giacomo | 146 | kern_event_delete(timer_table[index]); |
147 | timer_table[index] = -1; |
||
1018 | mauro | 148 | } |
1007 | mauro | 149 | kern_frestore(f); |
514 | giacomo | 150 | |
151 | return 0; |
||
152 | } |
||
153 | |||
154 | /* Interrupt */ |
||
1007 | mauro | 155 | int shark_handler_set(int no, void *fast){ |
514 | giacomo | 156 | |
1007 | mauro | 157 | if ((no >= 1) && (no < 16) && (intr_table[no] <= 0)) { |
158 | if (use_intdrive == TRUE) { |
||
159 | intr_table[no] = handler_set(no, NULL, TRUE, NIL, fast); |
||
160 | #ifdef DEBUG_SHARK_GLUE |
||
161 | cprintf("(shark_handler_set - INT: %d - %d)", no, intr_table[no]); |
||
162 | #endif |
||
163 | } else { |
||
164 | intr_table[no] = handler_set(no, fast, TRUE, NIL, NULL); |
||
165 | #ifdef DEBUG_SHARK_GLUE |
||
166 | cprintf("(Shark_Handler_Set - NOINT: %d - %d)", no, intr_table[no]); |
||
167 | #endif |
||
168 | } |
||
169 | return intr_table[no]; |
||
170 | } else { |
||
171 | #ifdef DEBUG_SHARK_GLUE |
||
172 | cprintf("(shark_handler_set - ERR: %d - %d)", no, intr_table[no]); |
||
173 | #endif |
||
174 | return -1; |
||
175 | } |
||
496 | giacomo | 176 | } |
490 | giacomo | 177 | |
1007 | mauro | 178 | int shark_handler_remove(int no){ |
513 | giacomo | 179 | |
1007 | mauro | 180 | if (intr_table[no] == 1) { |
181 | handler_remove(no); |
||
182 | #ifdef DEBUG_SHARK_GLUE |
||
183 | cprintf("(shark_handler_remove: %d)", no); |
||
184 | #endif |
||
185 | intr_table[no] = 0; |
||
513 | giacomo | 186 | } |
187 | |||
1007 | mauro | 188 | return 0; |
513 | giacomo | 189 | } |
1007 | mauro | 190 | |
191 | /* Boot function */ |
||
192 | int shark_interrupt_server(int use_intdrv) { |
||
193 | int i; |
||
513 | giacomo | 194 | |
1007 | mauro | 195 | for(i=0; i<MAX_TIMER_TABLE; i++) { |
196 | timer_arg_table[i] = NULL; |
||
197 | timer_func_table[i] = NULL; |
||
198 | timer_table[i] = -1; |
||
199 | } |
||
200 | for(i=0; i<NR_IRQS; i++) { |
||
201 | intr_table[i] = 0; |
||
202 | } |
||
203 | |||
204 | use_intdrive = use_intdrv; |
||
205 | #ifdef DEBUG_SHARK_GLUE |
||
206 | cprintf("(Use_intdrive: %d)", use_intdrive); |
||
207 | #endif |
||
208 | if (use_intdrive == TRUE) |
||
209 | set_noint_handler(shark_timer_exec); |
||
514 | giacomo | 210 | |
211 | return 0; |
||
490 | giacomo | 212 | } |
496 | giacomo | 213 |