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 <<
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 { <<
071 const char *exname = sos_exception_get_name( <<
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) 031 sos_ret_t sos_exception_subsystem_setup(void)
081 { 032 {
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 033
100 034
101 035
102 036
103 return sos_idt_set_handler(SOS_EXCEPT_BASE + 037 return sos_idt_set_handler(SOS_EXCEPT_BASE + SOS_EXCEPT_DOUBLE_FAULT,
104 (sos_vaddr_t) sos_ 038 (sos_vaddr_t) sos_exception_wrapper_array[SOS_EXCEPT_DOUBLE_FAULT],
105 0 039 0 );
106 } 040 }
107 041
108 042
109 sos_ret_t sos_exception_set_routine(int except 043 sos_ret_t sos_exception_set_routine(int exception_number,
110 sos_except 044 sos_exception_handler_t routine)
111 { 045 {
112 sos_ret_t retval; 046 sos_ret_t retval;
113 sos_ui32_t flags; 047 sos_ui32_t flags;
114 048
115 if ((exception_number < 0) || (exception_num 049 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
116 return -SOS_EINVAL; 050 return -SOS_EINVAL;
117 051
118 052
119 if (exception_number == SOS_EXCEPT_DOUBLE_FA 053 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
120 return -SOS_ENOSUP; 054 return -SOS_ENOSUP;
121 055
122 sos_disable_IRQs(flags); 056 sos_disable_IRQs(flags);
123 057
124 retval = SOS_OK; 058 retval = SOS_OK;
125 059
126 060
127 sos_exception_handler_array[exception_number 061 sos_exception_handler_array[exception_number] = routine;
128 062
129 063
130 064
131 if (routine != NULL) 065 if (routine != NULL)
132 retval 066 retval
133 = sos_idt_set_handler(SOS_EXCEPT_BASE + 067 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
134 (sos_vaddr_t) sos_ 068 (sos_vaddr_t) sos_exception_wrapper_array[exception_number],
135 0 069 0 );
136 else 070 else
137 retval 071 retval
138 = sos_idt_set_handler(SOS_EXCEPT_BASE + 072 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number,
139 (sos_vaddr_t)NULL 073 (sos_vaddr_t)NULL ,
140 0 074 0 );
141 075
142 sos_restore_IRQs(flags); 076 sos_restore_IRQs(flags);
143 return retval; 077 return retval;
144 } 078 }
145 079
146 080
147 sos_exception_handler_t sos_exception_get_rout 081 sos_exception_handler_t sos_exception_get_routine(int exception_number)
148 { 082 {
149 if ((exception_number < 0) || (exception_num 083 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM))
150 return NULL; 084 return NULL;
151 085
152 086
153 if (exception_number == SOS_EXCEPT_DOUBLE_FA 087 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT)
154 return NULL; 088 return NULL;
155 089
156 090
157 return sos_exception_handler_array[exception 091 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 } 092 }