Changeset 874621f in mainline
- Timestamp:
- 2006-06-06T07:40:51Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0dbc4e7
- Parents:
- 6f9a9bc
- Files:
-
- 2 added
- 29 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r6f9a9bc r874621f 123 123 generic/src/console/console.c \ 124 124 generic/src/console/kconsole.c \ 125 generic/src/console/klog.c \ 125 126 generic/src/console/cmd.c \ 126 127 generic/src/cpu/cpu.c \ -
arch/amd64/include/interrupt.h
r6f9a9bc r874621f 87 87 }; 88 88 89 /** Return true if exception happened while in userspace */ 90 static inline int istate_from_uspace(istate_t *istate) 91 { 92 return !(istate->rip & 0x8000000000000000); 93 } 94 89 95 static inline void istate_set_retaddr(istate_t *istate, __address retaddr) 90 96 { 91 97 istate->rip = retaddr; 98 } 99 static inline __native istate_get_pc(istate_t *istate) 100 { 101 return istate->rip; 92 102 } 93 103 -
arch/amd64/src/interrupt.c
r6f9a9bc r874621f 80 80 void null_interrupt(int n, istate_t *istate) 81 81 { 82 fault_if_from_uspace(istate, "unserviced interrupt: %d", n); 82 83 print_info_errcode(n, istate); 83 84 panic("unserviced interrupt\n"); … … 105 106 return; 106 107 } 108 fault_if_from_uspace(istate, "general protection fault"); 107 109 } 108 110 … … 113 115 void ss_fault(int n, istate_t *istate) 114 116 { 117 fault_if_from_uspace(istate, "stack fault"); 115 118 print_info_errcode(n, istate); 116 119 panic("stack fault\n"); … … 122 125 scheduler_fpu_lazy_request(); 123 126 #else 127 fault_if_from_uspace(istate, "fpu fault"); 124 128 panic("fpu fault"); 125 129 #endif -
arch/amd64/src/mm/page.c
r6f9a9bc r874621f 184 184 185 185 if (as_page_fault(page, access, istate) == AS_PF_FAULT) { 186 fault_if_from_uspace(istate, "Page fault: %#x", page); 187 186 188 print_info_errcode(n, istate); 187 189 printf("Page fault address: %llX\n", page); -
arch/ia32/include/interrupt.h
r6f9a9bc r874621f 84 84 }; 85 85 86 /** Return true if exception happened while in userspace */ 87 static inline int istate_from_uspace(istate_t *istate) 88 { 89 return !(istate->eip & 0x80000000); 90 } 91 86 92 static inline void istate_set_retaddr(istate_t *istate, __address retaddr) 87 93 { 88 94 istate->eip = retaddr; 95 } 96 97 static inline __native istate_get_pc(istate_t *istate) 98 { 99 return istate->eip; 89 100 } 90 101 -
arch/ia32/src/interrupt.c
r6f9a9bc r874621f 80 80 void null_interrupt(int n, istate_t *istate) 81 81 { 82 fault_if_from_uspace(istate, "unserviced interrupt: %d", n); 83 82 84 PRINT_INFO_ERRCODE(istate); 83 85 panic("unserviced interrupt: %d\n", n); … … 105 107 return; 106 108 } 109 fault_if_from_uspace(istate, "general protection fault"); 107 110 } 108 111 … … 113 116 void ss_fault(int n, istate_t *istate) 114 117 { 118 fault_if_from_uspace(istate, "stack fault"); 119 115 120 PRINT_INFO_ERRCODE(istate); 116 121 panic("stack fault\n"); … … 119 124 void simd_fp_exception(int n, istate_t *istate) 120 125 { 121 122 PRINT_INFO_ERRCODE(istate);123 126 __u32 mxcsr; 124 127 asm … … 127 130 :"=m"(mxcsr) 128 131 ); 132 fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zX", 133 (__native)mxcsr); 134 135 PRINT_INFO_ERRCODE(istate); 129 136 printf("MXCSR: %#zX\n",(__native)(mxcsr)); 130 137 panic("SIMD FP exception(19)\n"); … … 136 143 scheduler_fpu_lazy_request(); 137 144 #else 145 fault_if_from_uspace(istate, "fpu fault"); 138 146 panic("fpu fault"); 139 147 #endif -
arch/ia32/src/mm/page.c
r6f9a9bc r874621f 104 104 105 105 if (as_page_fault(page, access, istate) == AS_PF_FAULT) { 106 fault_if_from_uspace(istate, "Page fault: %#x", page); 107 106 108 PRINT_INFO_ERRCODE(istate); 107 109 printf("page fault address: %#x\n", page); -
arch/ia64/include/interrupt.h
r6f9a9bc r874621f 114 114 } 115 115 116 static inline __native istate_get_pc(istate_t *istate) 117 { 118 return istate->cr_iip; 119 } 120 #include <panic.h> 121 static inline int istate_from_uspace(istate_t *istate) 122 { 123 panic("TODO: istate_from_uspace not yet implemented"); 124 return 0; 125 } 126 116 127 extern void *ivt; 117 128 -
arch/ia64/src/interrupt.c
r6f9a9bc r874621f 47 47 #include <ipc/irq.h> 48 48 #include <ipc/ipc.h> 49 #include <interrupt.h> 49 50 50 51 … … 151 152 char *desc = ""; 152 153 153 dump_interrupted_context(istate);154 155 154 switch (istate->cr_isr.ge_code) { 156 155 case GE_ILLEGALOP: … … 177 176 } 178 177 178 fault_if_from_uspace(istate, "General Exception (%s)", desc); 179 180 dump_interrupted_context(istate); 179 181 panic("General Exception (%s)\n", desc); 180 182 } … … 187 189 scheduler_fpu_lazy_request(); 188 190 #else 191 fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (__u16) vector, vector_to_string(vector)); 189 192 dump_interrupted_context(istate); 190 193 panic("Interruption: %#hx (%s)\n", (__u16) vector, vector_to_string(vector)); … … 268 271 /* TODO */ 269 272 } 270 271 272 -
arch/mips32/include/arg.h
r6f9a9bc r874621f 45 45 (((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((__address)((ap) + 2*4 - 1) & (~3)) : ((__address)((ap) + 2*8 -1) & (~7)) )))[-1]) 46 46 47 #define va_copy(dst,src) ((dst)=(src)) 48 47 49 #define va_end(ap) 48 50 -
arch/mips32/include/exception.h
r6f9a9bc r874621f 35 35 36 36 #include <typedefs.h> 37 #include <arch/cp0.h> 37 38 38 39 #define EXC_Int 0 … … 99 100 } 100 101 102 /** Return true if exception happened while in userspace */ 103 static inline int istate_from_uspace(istate_t *istate) 104 { 105 return istate->status & cp0_status_um_bit; 106 } 107 static inline __native istate_get_pc(istate_t *istate) 108 { 109 return istate->epc; 110 } 111 101 112 extern void exception(istate_t *istate); 102 113 extern void tlb_refill_entry(void); -
arch/mips32/src/exception.c
r6f9a9bc r874621f 79 79 static void unhandled_exception(int n, istate_t *istate) 80 80 { 81 fault_if_from_uspace(istate, "unhandled exception %s", exctable[n]); 82 81 83 print_regdump(istate); 82 84 panic("unhandled exception %s\n", exctable[n]); … … 120 122 if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id) 121 123 scheduler_fpu_lazy_request(); 122 else 124 else { 125 fault_if_from_uspace(istate, "unhandled Coprocessor Unusable Exception"); 123 126 panic("unhandled Coprocessor Unusable Exception\n"); 127 } 124 128 } 125 129 #endif -
arch/mips32/src/mm/tlb.c
r6f9a9bc r874621f 40 40 #include <debug.h> 41 41 #include <align.h> 42 #include <interrupt.h> 42 43 43 44 static void tlb_refill_fail(istate_t *istate); … … 337 338 if (s) 338 339 sym2 = s; 340 341 fault_if_from_uspace(istate, "TLB Refill Exception on %P", cp0_badvaddr_read()); 339 342 panic("%X: TLB Refill Exception at %X(%s<-%s)\n", cp0_badvaddr_read(), istate->epc, symbol, sym2); 340 343 } … … 348 351 if (s) 349 352 symbol = s; 353 fault_if_from_uspace(istate, "TLB Invalid Exception on %P", cp0_badvaddr_read()); 350 354 panic("%X: TLB Invalid Exception at %X(%s)\n", cp0_badvaddr_read(), istate->epc, symbol); 351 355 } … … 358 362 if (s) 359 363 symbol = s; 364 fault_if_from_uspace(istate, "TLB Modified Exception on %P", cp0_badvaddr_read()); 360 365 panic("%X: TLB Modified Exception at %X(%s)\n", cp0_badvaddr_read(), istate->epc, symbol); 361 366 } -
arch/ppc32/include/exception.h
r6f9a9bc r874621f 81 81 istate->pc = retaddr; 82 82 } 83 /** Return true if exception happened while in userspace */ 84 #include <panic.h> 85 static inline int istate_from_uspace(istate_t *istate) 86 { 87 panic("istate_from_uspace not yet implemented"); 88 return 0; 89 } 90 static inline __native istate_get_pc(istate_t *istate) 91 { 92 return istate->pc; 93 } 83 94 84 95 #endif -
arch/ppc32/src/interrupt.c
r6f9a9bc r874621f 67 67 } 68 68 69 #include <print.h>70 69 /** Handler of externul interrupts */ 71 70 void extint_handler(int n, istate_t *istate) -
arch/ppc64/include/exception.h
r6f9a9bc r874621f 81 81 istate->pc = retaddr; 82 82 } 83 /** Return true if exception happened while in userspace */ 84 #include <panic.h> 85 static inline int istate_from_uspace(istate_t *istate) 86 { 87 panic("istate_from_uspace not yet implemented"); 88 return 0; 89 } 90 static inline __native istate_get_pc(istate_t *istate) 91 { 92 return istate->pc; 93 } 83 94 84 95 #endif -
arch/sparc64/include/interrupt.h
r6f9a9bc r874621f 52 52 /* TODO */ 53 53 } 54 static inline int istate_from_uspace(istate_t *istate) 55 { 56 /* TODO */ 57 } 58 static inline __native istate_get_pc(istate_t *istate) 59 { 60 /* TODO */ 61 } 62 54 63 55 64 extern void interrupt_register(int n, const char *name, iroutine f); -
generic/include/interrupt.h
r6f9a9bc r874621f 33 33 #include <typedefs.h> 34 34 #include <arch/types.h> 35 #include <proc/task.h> 36 #include <proc/thread.h> 37 #include <arch.h> 38 #include <console/klog.h> 39 #include <ipc/irq.h> 35 40 36 41 #ifndef IVT_ITEMS … … 42 47 #endif 43 48 49 #define fault_if_from_uspace(istate, cmd, ...) \ 50 { \ 51 if (istate_from_uspace(istate)) { \ 52 klog_printf(cmd, ##__VA_ARGS__); \ 53 klog_printf("Task %lld got exception at PC:%P. Task killed.", TASK->taskid, istate_get_pc(istate)); \ 54 task_kill(TASK->taskid); \ 55 thread_exit(); \ 56 } \ 57 } 58 59 44 60 extern iroutine exc_register(int n, const char *name, iroutine f); 45 61 extern void exc_dispatch(int n, istate_t *t); -
generic/include/ipc/irq.h
r6f9a9bc r874621f 30 30 #define __IRQ_H__ 31 31 32 /** Maximum length of IPC IRQ program */ 32 33 #define IRQ_MAX_PROG_SIZE 10 34 35 /** Reserved 'virtual' messages for kernel notifications */ 36 #define IPC_IRQ_RESERVED_VIRTUAL 10 37 38 #define IPC_IRQ_KLOG (-1) 33 39 34 40 typedef enum { … … 60 66 #ifdef KERNEL 61 67 68 #include <ipc/ipc.h> 69 62 70 extern void ipc_irq_make_table(int irqcount); 63 71 extern int ipc_irq_register(answerbox_t *box, int irq, irq_code_t *ucode); 64 72 extern void ipc_irq_send_notif(int irq); 73 extern void ipc_irq_send_msg(int irq, __native a2, __native a3); 65 74 extern void ipc_irq_unregister(answerbox_t *box, int irq); 66 75 extern void irq_ipc_bind_arch(__native irq); -
generic/include/ipc/sysipc.h
r6f9a9bc r874621f 48 48 __native method, __native arg1); 49 49 __native sys_ipc_hangup(int phoneid); 50 __native sys_ipc_register_irq( __nativeirq, irq_code_t *ucode);51 __native sys_ipc_unregister_irq( __nativeirq);50 __native sys_ipc_register_irq(int irq, irq_code_t *ucode); 51 __native sys_ipc_unregister_irq(int irq); 52 52 53 53 #endif -
generic/include/proc/thread.h
r6f9a9bc r874621f 151 151 extern thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags, char *name); 152 152 extern void thread_ready(thread_t *t); 153 extern void thread_exit(void) ;153 extern void thread_exit(void) __attribute__((noreturn)); 154 154 155 155 #ifndef thread_create_arch -
generic/include/stackarg.h
r6f9a9bc r874621f 50 50 (*((type *)((ap).last + ((ap).pos += sizeof(type) ) - sizeof(type)))) 51 51 52 #define va_copy(dst,src) dst=src 52 53 #define va_end(ap) 53 54 -
generic/include/stdarg.h
r6f9a9bc r874621f 41 41 #define va_arg(ap, type) __builtin_va_arg(ap, type) 42 42 #define va_end(ap) __builtin_va_end(ap) 43 #define va_copy(dst,src) __builtin_va_copy(dst,src) 43 44 44 45 #endif -
generic/src/interrupt/interrupt.c
r6f9a9bc r874621f 91 91 static void exc_undef(int n, istate_t *istate) 92 92 { 93 fault_if_from_uspace(istate, "Unhandled exception %d.", n); 93 94 panic("Unhandled exception %d.", n); 94 95 } -
generic/src/ipc/ipc.c
r6f9a9bc r874621f 336 336 list_append(&request->link, &box->dispatched_calls); 337 337 } else { 338 /* This can happen regularly after ipc_cleanup, remove 339 * the warning in the future when the IPC is 340 * more debugged */ 341 printf("WARNING: Spurious IPC wakeup.\n"); 338 /* This can happen regularly after ipc_cleanup */ 342 339 spinlock_unlock(&box->lock); 343 340 goto restart; -
generic/src/ipc/irq.c
r6f9a9bc r874621f 157 157 { 158 158 ipl_t ipl; 159 int mq = irq + IPC_IRQ_RESERVED_VIRTUAL; 159 160 160 161 ipl = interrupts_disable(); 161 spinlock_lock(&irq_conns[ irq].lock);162 if (irq_conns[ irq].box == box) {163 irq_conns[ irq].box = NULL;164 code_free(irq_conns[ irq].code);165 irq_conns[ irq].code = NULL;166 } 167 168 spinlock_unlock(&irq_conns[ irq].lock);162 spinlock_lock(&irq_conns[mq].lock); 163 if (irq_conns[mq].box == box) { 164 irq_conns[mq].box = NULL; 165 code_free(irq_conns[mq].code); 166 irq_conns[mq].code = NULL; 167 } 168 169 spinlock_unlock(&irq_conns[mq].lock); 169 170 interrupts_restore(ipl); 170 171 } … … 175 176 ipl_t ipl; 176 177 irq_code_t *code; 178 int mq = irq + IPC_IRQ_RESERVED_VIRTUAL; 177 179 178 180 ASSERT(irq_conns); … … 186 188 187 189 ipl = interrupts_disable(); 188 spinlock_lock(&irq_conns[ irq].lock);189 190 if (irq_conns[ irq].box) {191 spinlock_unlock(&irq_conns[ irq].lock);190 spinlock_lock(&irq_conns[mq].lock); 191 192 if (irq_conns[mq].box) { 193 spinlock_unlock(&irq_conns[mq].lock); 192 194 interrupts_restore(ipl); 193 195 code_free(code); 194 196 return EEXISTS; 195 197 } 196 irq_conns[ irq].box = box;197 irq_conns[ irq].code = code;198 atomic_set(&irq_conns[ irq].counter, 0);199 spinlock_unlock(&irq_conns[ irq].lock);198 irq_conns[mq].box = box; 199 irq_conns[mq].code = code; 200 atomic_set(&irq_conns[mq].counter, 0); 201 spinlock_unlock(&irq_conns[mq].lock); 200 202 interrupts_restore(ipl); 201 203 … … 203 205 } 204 206 205 /** Notify process that an irq had happend 206 * 207 * We expect interrupts to be disabled 208 */ 209 void ipc_irq_send_notif(int irq) 207 /** Add call to proper answerbox queue 208 * 209 * Assume irq_conns[mq].lock is locked */ 210 static void send_call(int mq, call_t *call) 211 { 212 spinlock_lock(&irq_conns[mq].box->irq_lock); 213 list_append(&call->link, &irq_conns[mq].box->irq_notifs); 214 spinlock_unlock(&irq_conns[mq].box->irq_lock); 215 216 waitq_wakeup(&irq_conns[mq].box->wq, 0); 217 } 218 219 /** Send notification message 220 * 221 */ 222 void ipc_irq_send_msg(int irq, __native a2, __native a3) 210 223 { 211 224 call_t *call; 212 213 ASSERT(irq_conns); 214 spinlock_lock(&irq_conns[ irq].lock);215 216 if (irq_conns[ irq].box) {225 int mq = irq + IPC_IRQ_RESERVED_VIRTUAL; 226 227 spinlock_lock(&irq_conns[mq].lock); 228 229 if (irq_conns[mq].box) { 217 230 call = ipc_call_alloc(FRAME_ATOMIC); 218 231 if (!call) { 219 spinlock_unlock(&irq_conns[ irq].lock);232 spinlock_unlock(&irq_conns[mq].lock); 220 233 return; 221 234 } … … 223 236 IPC_SET_METHOD(call->data, IPC_M_INTERRUPT); 224 237 IPC_SET_ARG1(call->data, irq); 225 IPC_SET_ARG3(call->data, atomic_preinc(&irq_conns[irq].counter)); 238 IPC_SET_ARG2(call->data, a2); 239 IPC_SET_ARG3(call->data, a3); 240 241 send_call(mq, call); 242 } 243 spinlock_unlock(&irq_conns[mq].lock); 244 } 245 246 /** Notify process that an irq had happend 247 * 248 * We expect interrupts to be disabled 249 */ 250 void ipc_irq_send_notif(int irq) 251 { 252 call_t *call; 253 int mq = irq + IPC_IRQ_RESERVED_VIRTUAL; 254 255 ASSERT(irq_conns); 256 spinlock_lock(&irq_conns[mq].lock); 257 258 if (irq_conns[mq].box) { 259 call = ipc_call_alloc(FRAME_ATOMIC); 260 if (!call) { 261 spinlock_unlock(&irq_conns[mq].lock); 262 return; 263 } 264 call->flags |= IPC_CALL_NOTIF; 265 IPC_SET_METHOD(call->data, IPC_M_INTERRUPT); 266 IPC_SET_ARG1(call->data, irq); 267 IPC_SET_ARG3(call->data, atomic_preinc(&irq_conns[mq].counter)); 226 268 227 269 /* Execute code to handle irq */ 228 code_execute(call, irq_conns[irq].code); 229 230 spinlock_lock(&irq_conns[irq].box->irq_lock); 231 list_append(&call->link, &irq_conns[irq].box->irq_notifs); 232 spinlock_unlock(&irq_conns[irq].box->irq_lock); 233 234 waitq_wakeup(&irq_conns[irq].box->wq, 0); 235 } 270 code_execute(call, irq_conns[mq].code); 236 271 237 spinlock_unlock(&irq_conns[irq].lock); 238 } 239 240 241 /** Initialize table of interrupt handlers */ 272 send_call(mq, call); 273 } 274 275 spinlock_unlock(&irq_conns[mq].lock); 276 } 277 278 279 /** Initialize table of interrupt handlers 280 * 281 * @param irqcount Count of required hardware IRQs to be supported 282 */ 242 283 void ipc_irq_make_table(int irqcount) 243 284 { 244 285 int i; 286 287 irqcount += IPC_IRQ_RESERVED_VIRTUAL; 245 288 246 289 irq_conns_size = irqcount; -
generic/src/ipc/sysipc.c
r6f9a9bc r874621f 554 554 555 555 /** Connect irq handler to task */ 556 __native sys_ipc_register_irq( __nativeirq, irq_code_t *ucode)556 __native sys_ipc_register_irq(int irq, irq_code_t *ucode) 557 557 { 558 558 if (!(cap_get(TASK) & CAP_IRQ_REG)) 559 559 return EPERM; 560 560 561 if (irq >= IRQ_COUNT )561 if (irq >= IRQ_COUNT || irq <= -IPC_IRQ_RESERVED_VIRTUAL) 562 562 return (__native) ELIMIT; 563 563 564 564 irq_ipc_bind_arch(irq); 565 565 … … 568 568 569 569 /* Disconnect irq handler from task */ 570 __native sys_ipc_unregister_irq( __nativeirq)570 __native sys_ipc_unregister_irq(int irq) 571 571 { 572 572 if (!(cap_get(TASK) & CAP_IRQ_REG)) 573 573 return EPERM; 574 574 575 if (irq >= IRQ_COUNT )575 if (irq >= IRQ_COUNT || irq <= -IPC_IRQ_RESERVED_VIRTUAL) 576 576 return (__native) ELIMIT; 577 577 -
generic/src/main/main.c
r6f9a9bc r874621f 75 75 #include <macros.h> 76 76 #include <adt/btree.h> 77 #include <console/klog.h> 77 78 78 79 #ifdef CONFIG_SMP … … 219 220 thread_init(); 220 221 futex_init(); 222 klog_init(); 221 223 222 224 for (i = 0; i < init.cnt; i++) -
generic/src/proc/thread.c
r6f9a9bc r874621f 389 389 spinlock_unlock(&THREAD->lock); 390 390 scheduler(); 391 392 /* Not reached */ 393 while (1) 394 ; 391 395 } 392 396
Note:
See TracChangeset
for help on using the changeset viewer.