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