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
018 #include "idt.h" 019 #include "idt.h"
019 #include "irq.h" 020 #include "irq.h"
020 021
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 sos_ret_t sos_exceptions_setup(void)
035 static const char * sos_x86_exnames[] = { <<
036 [SOS_EXCEPT_DIVIDE_ERROR] = " <<
037 [SOS_EXCEPT_DEBUG] = " <<
038 [SOS_EXCEPT_NMI_INTERRUPT] = " <<
039 [SOS_EXCEPT_BREAKPOINT] = " <<
040 [SOS_EXCEPT_OVERFLOW] = " <<
041 [SOS_EXCEPT_BOUND_RANGE_EXCEDEED] = " <<
042 [SOS_EXCEPT_INVALID_OPCODE] = " <<
043 [SOS_EXCEPT_DEVICE_NOT_AVAILABLE] = " <<
044 [SOS_EXCEPT_DOUBLE_FAULT] = " <<
045 [SOS_EXCEPT_COPROCESSOR_SEGMENT_OVERRUN] = " <<
046 [SOS_EXCEPT_INVALID_TSS] = " <<
047 [SOS_EXCEPT_SEGMENT_NOT_PRESENT] = " <<
048 [SOS_EXCEPT_STACK_SEGMENT_FAULT] = " <<
049 [SOS_EXCEPT_GENERAL_PROTECTION] = " <<
050 [SOS_EXCEPT_PAGE_FAULT] = " <<
051 [SOS_EXCEPT_INTEL_RESERVED_1] = " <<
052 [SOS_EXCEPT_FLOATING_POINT_ERROR] = " <<
053 [SOS_EXCEPT_ALIGNEMENT_CHECK] = " <<
054 [SOS_EXCEPT_MACHINE_CHECK] = " <<
055 [SOS_EXCEPT_INTEL_RESERVED_2] = " <<
056 [SOS_EXCEPT_INTEL_RESERVED_3] = " <<
057 [SOS_EXCEPT_INTEL_RESERVED_4] = " <<
058 [SOS_EXCEPT_INTEL_RESERVED_5] = " <<
059 [SOS_EXCEPT_INTEL_RESERVED_6] = " <<
060 [SOS_EXCEPT_INTEL_RESERVED_7] = " <<
061 [SOS_EXCEPT_INTEL_RESERVED_8] = " <<
062 [SOS_EXCEPT_INTEL_RESERVED_9] = " <<
063 [SOS_EXCEPT_INTEL_RESERVED_10] = " <<
064 [SOS_EXCEPT_INTEL_RESERVED_11] = " <<
065 [SOS_EXCEPT_INTEL_RESERVED_12] = " <<
066 [SOS_EXCEPT_INTEL_RESERVED_13] = " <<
067 [SOS_EXCEPT_INTEL_RESERVED_14] = " <<
068 }; <<
069 <<
070 <<
071 <<
072 static void sos_generic_ex(int exid, struct so <<
073 { <<
074 const char *exname = sos_exception_get_name( <<
075 <<
076 if (sos_cpu_context_is_in_user_mode(ctxt)) <<
077 { <<
078 <<
079 sos_bochs_printf("Exception %s in User m <<
080 exname, <<
081 sos_cpu_context_get_PC( <<
082 (unsigned)sos_cpu_conte <<
083 sos_bochs_printf("Terminating User threa <<
084 sos_thread_exit(); <<
085 } <<
086 else <<
087 sos_display_fatal_error("Exception %s in K <<
088 exname, <<
089 sos_cpu_context_ge <<
090 (unsigned)sos_cpu_ <<
091 } <<
092 <<
093 <<
094 sos_ret_t sos_exception_subsystem_setup(void) <<
095 { 032 {
096 sos_ret_t retval; <<
097 int exid; <<
098 <<
099 <<
100 <<
101 for (exid = 0 ; exid < SOS_EXCEPT_NUM ; exid <<
102 { <<
103 <<
104 if (exid == SOS_EXCEPT_DOUBLE_FAULT) <<
105 continue; <<
106 <<
107 retval = sos_exception_set_routine(exid, <<
108 if (SOS_OK != retval) <<
109 return retval; <<
110 } <<
111 <<
112 <<
113 033
114 034
115 035
116 036
117 return sos_idt_set_handler(SOS_EXCEPT_BASE + 037 return sos_idt_set_handler(SOS_EXCEPT_BASE + SOS_EXCEPT_DOUBLE_FAULT,
118 (sos_vaddr_t) sos_ 038 (sos_vaddr_t) sos_exception_wrapper_array[SOS_EXCEPT_DOUBLE_FAULT],
119 0 039 0 );
120 } 040 }
121 041
122 042
123 sos_ret_t sos_exception_set_routine(int except 043 sos_ret_t sos_exception_set_routine(int exception_number,
124 sos_except 044 sos_exception_handler_t routine)
125 { 045 {
126 sos_ret_t retval; 046 sos_ret_t retval;
127 sos_ui32_t flags; 047 sos_ui32_t flags;
128 048
129 if ((exception_number < 0) || (exception_num 049 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
130 return -SOS_EINVAL; 050 return -SOS_EINVAL;
131 051
132 052
133 if (exception_number == SOS_EXCEPT_DOUBLE_FA 053 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
134 return -SOS_ENOSUP; 054 return -SOS_ENOSUP;
135 055
136 sos_disable_IRQs(flags); 056 sos_disable_IRQs(flags);
137 057
138 retval = SOS_OK; 058 retval = SOS_OK;
139 059
140 060
141 sos_exception_handler_array[exception_number 061 sos_exception_handler_array[exception_number] = routine;
142 062
143 063
144 064
145 if (routine != NULL) 065 if (routine != NULL)
146 retval 066 retval
147 = sos_idt_set_handler(SOS_EXCEPT_BASE + 067 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
148 (sos_vaddr_t) sos_ 068 (sos_vaddr_t) sos_exception_wrapper_array[exception_number],
149 0 069 0 );
150 else 070 else
151 retval 071 retval
152 = sos_idt_set_handler(SOS_EXCEPT_BASE + 072 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
153 (sos_vaddr_t)NULL 073 (sos_vaddr_t)NULL ,
154 0 074 0 );
155 075
156 sos_restore_IRQs(flags); 076 sos_restore_IRQs(flags);
157 return retval; 077 return retval;
158 } 078 }
159 079
160 080
161 sos_exception_handler_t sos_exception_get_rout 081 sos_exception_handler_t sos_exception_get_routine(int exception_number)
162 { 082 {
163 if ((exception_number < 0) || (exception_num 083 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
164 return NULL; 084 return NULL;
165 085
166 086
167 if (exception_number == SOS_EXCEPT_DOUBLE_FA 087 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
168 return NULL; 088 return NULL;
169 089
170 090
171 return sos_exception_handler_array[exception 091 return sos_exception_handler_array[exception_number];
172 } <<
173 <<
174 <<
175 const char * sos_exception_get_name(int except <<
176 { <<
177 if ((exception_number < 0) || (exception_num <<
178 return NULL; <<
179 <<
180 return sos_x86_exnames[exception_number]; <<
181 } 092 }