|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
001 /* Copyright (C) 2004 David Decotigny 001 /* Copyright (C) 2004 David Decotigny 002 Copyright (C) 1999 Free Software Foundatio 002 Copyright (C) 1999 Free Software Foundation, Inc. 003 003 004 This program is free software; you can redi 004 This program is free software; you can redistribute it and/or 005 modify it under the terms of the GNU Genera 005 modify it under the terms of the GNU General Public License 006 as published by the Free Software Foundatio 006 as published by the Free Software Foundation; either version 2 007 of the License, or (at your option) any lat 007 of the License, or (at your option) any later version. 008 008 009 This program is distributed in the hope tha 009 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the 010 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU General Public License for more details 012 GNU General Public License for more details. 013 013 014 You should have received a copy of the GNU 014 You should have received a copy of the GNU General Public License 015 along with this program; if not, write to t 015 along with this program; if not, write to the Free Software 016 Foundation, Inc., 59 Temple Place - Suite 3 016 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 017 USA. 017 USA. 018 */ 018 */ 019 #include "idt.h" 019 #include "idt.h" 020 #include "irq.h" 020 #include "irq.h" 021 021 022 #include "exception.h" 022 #include "exception.h" 023 023 024 /* array of exception wrappers, defined in exc 024 /* array of exception wrappers, defined in exception_wrappers.S */ 025 extern sos_vaddr_t sos_exception_wrapper_array 025 extern sos_vaddr_t sos_exception_wrapper_array[SOS_EXCEPT_NUM]; 026 026 027 /* arrays of exception handlers, shared with e 027 /* arrays of exception handlers, shared with exception_wrappers.S */ 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 sos_ret_t sos_exceptions_setup(void) 031 sos_ret_t sos_exceptions_setup(void) 032 { 032 { 033 /* We inidicate that the double fault except 033 /* We inidicate that the double fault exception handler is defined, 034 and give its address. this handler is a d 034 and give its address. this handler is a do-nothing handler (see 035 exception_wrappers.S), and it can NOT be 035 exception_wrappers.S), and it can NOT be overriden by the 036 functions below */ 036 functions below */ 037 return sos_idt_set_handler(SOS_EXCEPT_BASE + 037 return sos_idt_set_handler(SOS_EXCEPT_BASE + SOS_EXCEPT_DOUBLE_FAULT, 038 (sos_vaddr_t) sos_ 038 (sos_vaddr_t) sos_exception_wrapper_array[SOS_EXCEPT_DOUBLE_FAULT], 039 0 /* CPL0 routine 039 0 /* CPL0 routine */); 040 } 040 } 041 041 042 042 043 sos_ret_t sos_exception_set_routine(int except 043 sos_ret_t sos_exception_set_routine(int exception_number, 044 sos_except 044 sos_exception_handler_t routine) 045 { 045 { 046 sos_ret_t retval; 046 sos_ret_t retval; 047 sos_ui32_t flags; 047 sos_ui32_t flags; 048 048 049 if ((exception_number < 0) || (exception_num 049 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM)) 050 return -SOS_EINVAL; 050 return -SOS_EINVAL; 051 051 052 /* Double fault not supported */ 052 /* Double fault not supported */ 053 if (exception_number == SOS_EXCEPT_DOUBLE_FA 053 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT) 054 return -SOS_ENOSUP; 054 return -SOS_ENOSUP; 055 055 056 sos_disable_IRQs(flags); 056 sos_disable_IRQs(flags); 057 057 058 retval = SOS_OK; 058 retval = SOS_OK; 059 059 060 /* Set the exception routine to be called by 060 /* Set the exception routine to be called by the exception wrapper */ 061 sos_exception_handler_array[exception_number 061 sos_exception_handler_array[exception_number] = routine; 062 062 063 /* If the exception is to be enabled, update 063 /* If the exception is to be enabled, update the IDT with the exception 064 wrapper */ 064 wrapper */ 065 if (routine != NULL) 065 if (routine != NULL) 066 retval 066 retval 067 = sos_idt_set_handler(SOS_EXCEPT_BASE + 067 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number, 068 (sos_vaddr_t) sos_ 068 (sos_vaddr_t) sos_exception_wrapper_array[exception_number], 069 0 /* CPL0 routine 069 0 /* CPL0 routine */); 070 else /* Disable the IDT entry */ 070 else /* Disable the IDT entry */ 071 retval 071 retval 072 = sos_idt_set_handler(SOS_EXCEPT_BASE + 072 = sos_idt_set_handler(SOS_EXCEPT_BASE + exception_number, 073 (sos_vaddr_t)NULL 073 (sos_vaddr_t)NULL /* No routine => disable IDTE */, 074 0 /* don't care */ 074 0 /* don't care */); 075 075 076 sos_restore_IRQs(flags); 076 sos_restore_IRQs(flags); 077 return retval; 077 return retval; 078 } 078 } 079 079 080 080 081 sos_exception_handler_t sos_exception_get_rout 081 sos_exception_handler_t sos_exception_get_routine(int exception_number) 082 { 082 { 083 if ((exception_number < 0) || (exception_num 083 if ((exception_number < 0) || (exception_number >= SOS_EXCEPT_NUM)) 084 return NULL; 084 return NULL; 085 085 086 /* Double fault not supported */ 086 /* Double fault not supported */ 087 if (exception_number == SOS_EXCEPT_DOUBLE_FA 087 if (exception_number == SOS_EXCEPT_DOUBLE_FAULT) 088 return NULL; 088 return NULL; 089 089 090 /* Expected to be atomic */ 090 /* Expected to be atomic */ 091 return sos_exception_handler_array[exception 091 return sos_exception_handler_array[exception_number]; 092 } 092 }
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |