Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 #include "idt.h" 018 #include "idt.h"
019 #include "irq.h" 019 #include "irq.h"
020 020
021 #include <sos/assert.h> 021 #include <sos/assert.h>
022 #include <drivers/bochs.h> <<
023 #include <sos/thread.h> <<
024 <<
025 #include "exception.h" 022 #include "exception.h"
026 023
027 024
028 extern sos_vaddr_t sos_exception_wrapper_array 025 extern sos_vaddr_t sos_exception_wrapper_array[SOS_EXCEPT_NUM];
029 026
030 027
031 sos_exception_handler_t sos_exception_handler_ 028 sos_exception_handler_t sos_exception_handler_array[SOS_EXCEPT_NUM] =
032 { NULL, }; 029 { NULL, };
033 030
034 031
035 static const char * sos_x86_exnames[] = { 032 static const char * sos_x86_exnames[] = {
036 [SOS_EXCEPT_DIVIDE_ERROR] = " 033 [SOS_EXCEPT_DIVIDE_ERROR] = "Division by zero",
037 [SOS_EXCEPT_DEBUG] = " 034 [SOS_EXCEPT_DEBUG] = "Debug",
038 [SOS_EXCEPT_NMI_INTERRUPT] = " 035 [SOS_EXCEPT_NMI_INTERRUPT] = "Non Maskable Interrupt",
039 [SOS_EXCEPT_BREAKPOINT] = " 036 [SOS_EXCEPT_BREAKPOINT] = "Breakpoint",
040 [SOS_EXCEPT_OVERFLOW] = " 037 [SOS_EXCEPT_OVERFLOW] = "Overflow",
041 [SOS_EXCEPT_BOUND_RANGE_EXCEDEED] = " 038 [SOS_EXCEPT_BOUND_RANGE_EXCEDEED] = "Bound Range Exceeded",
042 [SOS_EXCEPT_INVALID_OPCODE] = " 039 [SOS_EXCEPT_INVALID_OPCODE] = "Invalid Opcode",
043 [SOS_EXCEPT_DEVICE_NOT_AVAILABLE] = " 040 [SOS_EXCEPT_DEVICE_NOT_AVAILABLE] = "Device Unavailable",
044 [SOS_EXCEPT_DOUBLE_FAULT] = " 041 [SOS_EXCEPT_DOUBLE_FAULT] = "Double Fault",
045 [SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRUN] = " 042 [SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRUN] = "Coprocessor Segment Overrun",
046 [SOS_EXCEPT_INVALID_TSS] = " 043 [SOS_EXCEPT_INVALID_TSS] = "Invalid TSS",
047 [SOS_EXCEPT_SEGMENT_NOT_PRESENT] = " 044 [SOS_EXCEPT_SEGMENT_NOT_PRESENT] = "Segment Not Present",
048 [SOS_EXCEPT_STACK_SEGMENT_FAULT] = " 045 [SOS_EXCEPT_STACK_SEGMENT_FAULT] = "Stack Segfault",
049 [SOS_EXCEPT_GENERAL_PROTECTION] = " 046 [SOS_EXCEPT_GENERAL_PROTECTION] = "General Protection",
050 [SOS_EXCEPT_PAGE_FAULT] = " 047 [SOS_EXCEPT_PAGE_FAULT] = "Page Fault",
051 [SOS_EXCEPT_INTEL_RESERVED_1] = " 048 [SOS_EXCEPT_INTEL_RESERVED_1] = "INTEL1",
052 [SOS_EXCEPT_FLOATING_POINT_ERROR] = " 049 [SOS_EXCEPT_FLOATING_POINT_ERROR] = "FP Error",
053 [SOS_EXCEPT_ALIGNEMENT_CHECK] = " 050 [SOS_EXCEPT_ALIGNEMENT_CHECK] = "Alignment Check",
054 [SOS_EXCEPT_MACHINE_CHECK] = " 051 [SOS_EXCEPT_MACHINE_CHECK] = "Machine Check",
055 [SOS_EXCEPT_INTEL_RESERVED_2] = " 052 [SOS_EXCEPT_INTEL_RESERVED_2] = "INTEL2",
056 [SOS_EXCEPT_INTEL_RESERVED_3] = " 053 [SOS_EXCEPT_INTEL_RESERVED_3] = "INTEL3",
057 [SOS_EXCEPT_INTEL_RESERVED_4] = " 054 [SOS_EXCEPT_INTEL_RESERVED_4] = "INTEL4",
058 [SOS_EXCEPT_INTEL_RESERVED_5] = " 055 [SOS_EXCEPT_INTEL_RESERVED_5] = "INTEL5",
059 [SOS_EXCEPT_INTEL_RESERVED_6] = " 056 [SOS_EXCEPT_INTEL_RESERVED_6] = "INTEL6",
060 [SOS_EXCEPT_INTEL_RESERVED_7] = " 057 [SOS_EXCEPT_INTEL_RESERVED_7] = "INTEL7",
061 [SOS_EXCEPT_INTEL_RESERVED_8] = " 058 [SOS_EXCEPT_INTEL_RESERVED_8] = "INTEL8",
062 [SOS_EXCEPT_INTEL_RESERVED_9] = " 059 [SOS_EXCEPT_INTEL_RESERVED_9] = "INTEL9",
063 [SOS_EXCEPT_INTEL_RESERVED_10] = " 060 [SOS_EXCEPT_INTEL_RESERVED_10] = "INTEL10",
064 [SOS_EXCEPT_INTEL_RESERVED_11] = " 061 [SOS_EXCEPT_INTEL_RESERVED_11] = "INTEL11",
065 [SOS_EXCEPT_INTEL_RESERVED_12] = " 062 [SOS_EXCEPT_INTEL_RESERVED_12] = "INTEL12",
066 [SOS_EXCEPT_INTEL_RESERVED_13] = " 063 [SOS_EXCEPT_INTEL_RESERVED_13] = "INTEL13",
067 [SOS_EXCEPT_INTEL_RESERVED_14] = " 064 [SOS_EXCEPT_INTEL_RESERVED_14] = "INTEL14"
068 }; 065 };
069 066
070 067
071 068
072 static void sos_generic_ex(int exid, struct so !! 069 static void sos_generic_ex(int exid, const struct sos_cpu_state *ctxt)
073 __attribute__((noreturn)); <<
074 static void sos_generic_ex(int exid, struct so <<
075 { 070 {
076 const char *exname = sos_exception_get_name( 071 const char *exname = sos_exception_get_name(exid);
077 072
078 if (sos_cpu_context_is_in_user_mode(ctxt)) !! 073 sos_display_fatal_error("Exception %s in Kernel at instruction 0x%x (info=%x)!\n",
079 { !! 074 exname,
080 !! 075 sos_cpu_context_get_PC(ctxt),
081 sos_bochs_printf("Exception %s in User m !! 076 (unsigned)sos_cpu_context_get_EX_info(ctxt));
082 exname, <<
083 sos_cpu_context_get_PC( <<
084 (unsigned)sos_cpu_conte <<
085 sos_bochs_printf("Terminating User threa <<
086 sos_thread_exit(); <<
087 } <<
088 else <<
089 sos_display_fatal_error("Exception %s in K <<
090 exname, <<
091 sos_cpu_context_ge <<
092 (unsigned)sos_cpu_ <<
093 } 077 }
094 078
095 079
096 sos_ret_t sos_exception_subsystem_setup(void) 080 sos_ret_t sos_exception_subsystem_setup(void)
097 { 081 {
098 sos_ret_t retval; 082 sos_ret_t retval;
099 int exid; 083 int exid;
100 084
101 085
102 086
103 for (exid = 0 ; exid < SOS_EXCEPT_NUM ; exid 087 for (exid = 0 ; exid < SOS_EXCEPT_NUM ; exid ++)
104 { 088 {
105 089
106 if (exid == SOS_EXCEPT_DOUBLE_FAULT) 090 if (exid == SOS_EXCEPT_DOUBLE_FAULT)
107 continue; 091 continue;
108 092
109 retval = sos_exception_set_routine(exid, 093 retval = sos_exception_set_routine(exid, sos_generic_ex);
110 if (SOS_OK != retval) 094 if (SOS_OK != retval)
111 return retval; 095 return retval;
112 } 096 }
113 097
114 098
115 099
116 100
117 101
118 102
119 return sos_idt_set_handler(SOS_EXCEPT_BASE + 103 return sos_idt_set_handler(SOS_EXCEPT_BASE + SOS_EXCEPT_DOUBLE_FAULT,
120 (sos_vaddr_t) sos_ 104 (sos_vaddr_t) sos_exception_wrapper_array[SOS_EXCEPT_DOUBLE_FAULT],
121 0 105 0 );
122 } 106 }
123 107
124 108
125 sos_ret_t sos_exception_set_routine(int except 109 sos_ret_t sos_exception_set_routine(int exception_number,
126 sos_except 110 sos_exception_handler_t routine)
127 { 111 {
128 sos_ret_t retval; 112 sos_ret_t retval;
129 sos_ui32_t flags; 113 sos_ui32_t flags;
130 114
131 if ((exception_number < 0) || (exception_num 115 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
132 return -SOS_EINVAL; 116 return -SOS_EINVAL;
133 117
134 118
135 if (exception_number == SOS_EXCEPT_DOUBLE_FA 119 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
136 return -SOS_ENOSUP; 120 return -SOS_ENOSUP;
137 121
138 sos_disable_IRQs(flags); 122 sos_disable_IRQs(flags);
139 123
140 retval = SOS_OK; 124 retval = SOS_OK;
141 125
142 126
143 sos_exception_handler_array[exception_number 127 sos_exception_handler_array[exception_number] = routine;
144 128
145 129
146 130
147 if (routine != NULL) 131 if (routine != NULL)
148 retval 132 retval
149 = sos_idt_set_handler(SOS_EXCEPT_BASE + 133 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
150 (sos_vaddr_t) sos_ 134 (sos_vaddr_t) sos_exception_wrapper_array[exception_number],
151 0 135 0 );
152 else 136 else
153 retval 137 retval
154 = sos_idt_set_handler(SOS_EXCEPT_BASE + 138 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
155 (sos_vaddr_t)NULL 139 (sos_vaddr_t)NULL ,
156 0 140 0 );
157 141
158 sos_restore_IRQs(flags); 142 sos_restore_IRQs(flags);
159 return retval; 143 return retval;
160 } 144 }
161 145
162 146
163 sos_exception_handler_t sos_exception_get_rout 147 sos_exception_handler_t sos_exception_get_routine(int exception_number)
164 { 148 {
165 if ((exception_number < 0) || (exception_num 149 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
166 return NULL; 150 return NULL;
167 151
168 152
169 if (exception_number == SOS_EXCEPT_DOUBLE_FA 153 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
170 return NULL; 154 return NULL;
171 155
172 156
173 return sos_exception_handler_array[exception 157 return sos_exception_handler_array[exception_number];
174 } 158 }
175 159
176 160
177 const char * sos_exception_get_name(int except 161 const char * sos_exception_get_name(int exception_number)
178 { 162 {
179 if ((exception_number < 0) || (exception_num 163 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
180 return NULL; 164 return NULL;
181 165
182 return sos_x86_exnames[exception_number]; 166 return sos_x86_exnames[exception_number];
183 } 167 }