10 #include "qm_soc_regs.h"
13 #define IDT_NUM_GATES (68)
15 #define IDT_NUM_GATES (52)
18 #define IDT_SIZE (sizeof(intr_gate_desc_t) * IDT_NUM_GATES)
23 } __attribute__((packed)) idtr_t;
25 typedef struct intr_gate_desc {
43 } __attribute__((packed)) intr_gate_desc_t;
45 extern intr_gate_desc_t __idt_start[];
50 static __inline__
void idt_set_intr_gate_desc(uint32_t vector, uint32_t isr)
52 intr_gate_desc_t *desc;
55 desc = __idt_start + vector;
57 desc->isr_low = isr & 0xFFFF;
58 desc->selector = 0x08;
66 desc->isr_high = (isr >> 16) & 0xFFFF;
71 idtr.limit = IDT_SIZE - 1;
72 idtr.base = (uint32_t)__idt_start;
73 __asm__ __volatile__(
"lidt %0\n\t" ::
"m"(idtr));
81 static __inline__
void idt_init(
void)
85 memset(__idt_start, 0x00, IDT_SIZE);
88 idtr.limit = IDT_SIZE - 1;
89 idtr.base = (uint32_t)__idt_start;
92 __asm__ __volatile__(
"lidt %0\n\t" ::
"m"(idtr));