Rev 168 | Rev 224 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 168 | Rev 216 | ||
---|---|---|---|
Line 61... | Line 61... | ||
61 | 61 | ||
62 | /* |
62 | /* |
63 | * Called directly from the assembler code. |
63 | * Called directly from the assembler code. |
64 | * CPU is cpu_priority_high(). |
64 | * CPU is cpu_priority_high(). |
65 | */ |
65 | */ |
66 | void trap_dispatcher(__u8 n, __u32 stack[]) |
66 | void trap_dispatcher(__u8 n, __native stack[]) |
67 | { |
67 | { |
68 | ASSERT(n < IVT_ITEMS); |
68 | ASSERT(n < IVT_ITEMS); |
69 | 69 | ||
70 | ivt[n](n, stack); |
70 | ivt[n](n, stack); |
71 | } |
71 | } |
72 | 72 | ||
73 | void null_interrupt(__u8 n, __u32 stack[]) |
73 | void null_interrupt(__u8 n, __native stack[]) |
74 | { |
74 | { |
75 | printf("int %d: null_interrupt\n", n); |
75 | printf("int %d: null_interrupt\n", n); |
76 | printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]); |
76 | printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]); |
77 | panic("unserviced interrupt\n"); |
77 | panic("unserviced interrupt\n"); |
78 | } |
78 | } |
79 | 79 | ||
80 | void gp_fault(__u8 n, __u32 stack[]) |
80 | void gp_fault(__u8 n, __native stack[]) |
81 | { |
81 | { |
82 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
82 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
83 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
83 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
84 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
84 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
85 | panic("general protection fault\n"); |
85 | panic("general protection fault\n"); |
86 | stack[1]++; |
86 | stack[1]++; |
87 | } |
87 | } |
88 | 88 | ||
89 | void ss_fault(__u8 n, __u32 stack[]) |
89 | void ss_fault(__u8 n, __native stack[]) |
90 | { |
90 | { |
91 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
91 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
92 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
92 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
93 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
93 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
94 | panic("stack fault\n"); |
94 | panic("stack fault\n"); |
95 | } |
95 | } |
96 | 96 | ||
97 | 97 | ||
98 | void nm_fault(__u8 n, __u32 stack[]) |
98 | void nm_fault(__u8 n, __native stack[]) |
99 | { |
99 | { |
100 | reset_TS_flag(); |
100 | reset_TS_flag(); |
101 | if ((CPU->fpu_owner)!=NULL) { |
101 | if ((CPU->fpu_owner)!=NULL) { |
102 | fpu_lazy_context_save(&((CPU->fpu_owner)->saved_fpu_context)); |
102 | fpu_lazy_context_save(&((CPU->fpu_owner)->saved_fpu_context)); |
103 | (CPU->fpu_owner)->fpu_context_engaged=0; /* don't prevent migration */ |
103 | (CPU->fpu_owner)->fpu_context_engaged=0; /* don't prevent migration */ |
Line 107... | Line 107... | ||
107 | CPU->fpu_owner=THREAD; |
107 | CPU->fpu_owner=THREAD; |
108 | } |
108 | } |
109 | 109 | ||
110 | 110 | ||
111 | 111 | ||
112 | void page_fault(__u8 n, __u32 stack[]) |
112 | void page_fault(__u8 n, __native stack[]) |
113 | { |
113 | { |
114 | printf("page fault address: %X\n", read_cr2()); |
114 | printf("page fault address: %X\n", read_cr2()); |
115 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
115 | printf("ERROR_WORD=%X, %%eip=%X, %%cs=%X, flags=%X\n", stack[0], stack[1], stack[2], stack[3]); |
116 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
116 | printf("%%eax=%L, %%ebx=%L, %%ecx=%L, %%edx=%L,\n%%edi=%L, %%esi=%L, %%ebp=%L, %%esp=%L\n", stack[-2], stack[-5], stack[-3], stack[-4], stack[-9], stack[-8], stack[-1], stack); |
117 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
117 | printf("stack: %X, %X, %X, %X\n", stack[4], stack[5], stack[6], stack[7]); |
118 | panic("page fault\n"); |
118 | panic("page fault\n"); |
119 | } |
119 | } |
120 | 120 | ||
121 | void syscall(__u8 n, __u32 stack[]) |
121 | void syscall(__u8 n, __native stack[]) |
122 | { |
122 | { |
123 | printf("cpu%d: syscall\n", CPU->id); |
123 | printf("cpu%d: syscall\n", CPU->id); |
124 | thread_usleep(1000); |
124 | thread_usleep(1000); |
125 | } |
125 | } |
126 | 126 | ||
127 | void tlb_shootdown_ipi(__u8 n, __u32 stack[]) |
127 | void tlb_shootdown_ipi(__u8 n, __native stack[]) |
128 | { |
128 | { |
129 | trap_virtual_eoi(); |
129 | trap_virtual_eoi(); |
130 | tlb_shootdown_ipi_recv(); |
130 | tlb_shootdown_ipi_recv(); |
131 | } |
131 | } |
132 | 132 | ||
133 | void wakeup_ipi(__u8 n, __u32 stack[]) |
133 | void wakeup_ipi(__u8 n, __native stack[]) |
134 | { |
134 | { |
135 | trap_virtual_eoi(); |
135 | trap_virtual_eoi(); |
136 | } |
136 | } |
137 | 137 | ||
138 | void trap_virtual_enable_irqs(__u16 irqmask) |
138 | void trap_virtual_enable_irqs(__u16 irqmask) |