|
[ 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 << 003 002 004 This program is free software; you can redi 003 This program is free software; you can redistribute it and/or 005 modify it under the terms of the GNU Genera 004 modify it under the terms of the GNU General Public License 006 as published by the Free Software Foundatio 005 as published by the Free Software Foundation; either version 2 007 of the License, or (at your option) any lat 006 of the License, or (at your option) any later version. 008 007 009 This program is distributed in the hope tha 008 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the 009 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR 010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU General Public License for more details 011 GNU General Public License for more details. 013 012 014 You should have received a copy of the GNU 013 You should have received a copy of the GNU General Public License 015 along with this program; if not, write to t 014 along with this program; if not, write to the Free Software 016 Foundation, Inc., 59 Temple Place - Suite 3 015 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 017 USA. 016 USA. 018 */ 017 */ 019 #ifndef _SOS_IDT_H_ 018 #ifndef _SOS_IDT_H_ 020 #define _SOS_IDT_H_ 019 #define _SOS_IDT_H_ 021 020 022 /** 021 /** 023 * @file idt.h 022 * @file idt.h 024 * 023 * 025 * Manage the x86 Interrupt Descriptor Table, 024 * Manage the x86 Interrupt Descriptor Table, the table which maps the 026 * hardware interrupt lines, hardware exceptio 025 * hardware interrupt lines, hardware exceptions, and software 027 * interrupts, to software routines. We only d 026 * interrupts, to software routines. We only define "interrupt gate" 028 * IDT entries. Don't use it directly; refer i 027 * IDT entries. Don't use it directly; refer instead to interrupt.c, 029 * exceptions.c and syscall.c. 028 * exceptions.c and syscall.c. 030 * 029 * 031 * @see Intel x86 doc, Vol 3, chapter 5 030 * @see Intel x86 doc, Vol 3, chapter 5 032 */ 031 */ 033 032 034 #include <sos/errno.h> 033 #include <sos/errno.h> 035 #include <sos/types.h> 034 #include <sos/types.h> 036 035 037 /* Mapping of the CPU exceptions in the IDT (i 036 /* Mapping of the CPU exceptions in the IDT (imposed by Intel 038 standards) */ 037 standards) */ 039 #define SOS_EXCEPT_BASE 0 038 #define SOS_EXCEPT_BASE 0 040 #define SOS_EXCEPT_NUM 32 039 #define SOS_EXCEPT_NUM 32 041 #define SOS_EXCEPT_MAX (SOS_HWEXCEPT_BASE + S 040 #define SOS_EXCEPT_MAX (SOS_HWEXCEPT_BASE + SOS_HWEXCEPT_NUM - 1) 042 041 043 /* Mapping of the IRQ lines in the IDT */ 042 /* Mapping of the IRQ lines in the IDT */ 044 #define SOS_IRQ_BASE 32 043 #define SOS_IRQ_BASE 32 045 #define SOS_IRQ_NUM 16 044 #define SOS_IRQ_NUM 16 046 #define SOS_IRQ_MAX (SOS_IRQ_BASE + SOS_IR 045 #define SOS_IRQ_MAX (SOS_IRQ_BASE + SOS_IRQ_NUM - 1) 047 046 048 /** 047 /** 049 * Number of IDT entries. 048 * Number of IDT entries. 050 * 049 * 051 * @note Must be large enough to map the hw in 050 * @note Must be large enough to map the hw interrupts, the exceptions 052 * (=> total is 48 entries), and the syscall(s 051 * (=> total is 48 entries), and the syscall(s). Since our syscall 053 * will be 0x42, it must be >= 0x43. Intel doc 052 * will be 0x42, it must be >= 0x43. Intel doc limits this to 256 054 * entries, we use this limit. 053 * entries, we use this limit. 055 */ 054 */ 056 #define SOS_IDTE_NUM 256 /* 0x100 */ 055 #define SOS_IDTE_NUM 256 /* 0x100 */ 057 056 058 /** Initialization routine: all the IDT entrie 057 /** Initialization routine: all the IDT entries (or "IDTE") are marked 059 "not present". */ 058 "not present". */ 060 sos_ret_t sos_idt_subsystem_setup(void); 059 sos_ret_t sos_idt_subsystem_setup(void); 061 060 062 /** 061 /** 063 * Enable the IDT entry if handler_address != 062 * Enable the IDT entry if handler_address != NULL, with the given 064 * lowest_priviledge.\ Disable the IDT entry w 063 * lowest_priviledge.\ Disable the IDT entry when handler_address == 065 * NULL (the lowest_priviledge parameter is th 064 * NULL (the lowest_priviledge parameter is then ignored). Intel doc 066 * says that there must not be more than 256 e 065 * says that there must not be more than 256 entries. 067 * 066 * 068 * @note IRQ Unsafe 067 * @note IRQ Unsafe 069 */ 068 */ 070 sos_ret_t sos_idt_set_handler(int index, 069 sos_ret_t sos_idt_set_handler(int index, 071 sos_vaddr_t hand 070 sos_vaddr_t handler_address, 072 int lowest_privi 071 int lowest_priviledge /* 0..3 */); 073 072 074 073 075 /** 074 /** 076 * @note IRQ Unsafe 075 * @note IRQ Unsafe 077 * 076 * 078 * @return the handler address and DPL in the 077 * @return the handler address and DPL in the 2nd and 3rd 079 * parameters 078 * parameters 080 */ 079 */ 081 sos_ret_t sos_idt_get_handler(int index, 080 sos_ret_t sos_idt_get_handler(int index, 082 sos_vaddr_t *han 081 sos_vaddr_t *handler_address, 083 int *lowest_priv 082 int *lowest_priviledge); 084 083 085 #endif /* _SOS_IDT_H_ */ 084 #endif /* _SOS_IDT_H_ */
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |