00001
00010
00011
00012
00013
00014 #ifndef __L4UTIL_IDT_H
00015 #define __L4UTIL_IDT_H
00016
00017 #include <l4/sys/l4int.h>
00018 #include <l4/sys/compiler.h>
00019
00020 EXTERN_C_BEGIN
00021
00026 typedef struct
00027 {
00028 l4_uint64_t a, b;
00029 } __attribute__ ((packed)) l4util_idt_desc_t;
00030
00033 typedef struct
00034 {
00035 l4_uint16_t limit;
00036 void *base;
00037 l4util_idt_desc_t desc[0];
00038 } __attribute__ ((packed)) l4util_idt_header_t;
00039
00046 static inline void
00047 l4util_idt_entry(l4util_idt_header_t *idt, int nr, void(*handler)(void))
00048 {
00049 idt->desc[nr].a = (l4_uint64_t)handler & 0x0000ffff;
00050 idt->desc[nr].b = 0x0000ef00 | ((l4_uint64_t)handler & 0xffff0000);
00051 }
00052
00058 static inline void
00059 l4util_idt_init(l4util_idt_header_t *idt, int entries)
00060 {
00061 int i;
00062 idt->limit = entries*8 - 1;
00063 idt->base = &idt->desc;
00064
00065 for (i=0; i<entries; i++)
00066 l4util_idt_entry(idt, i, 0);
00067 }
00068
00072 static inline void
00073 l4util_idt_load(l4util_idt_header_t *idt)
00074 {
00075 asm volatile ("lidt (%%rax) \n\t" : : "a" (idt));
00076 }
00077
00078 EXTERN_C_END
00079
00080 #endif
00081