I have a little problem with my IDT, Bochs reboots and gives me the following error message :
">> int 0x00 : CD00"
Here's my code ( most of the work is done by JamesM ) :
Code: Select all
typedef unsigned int u32int;
typedef int s32int;
typedef unsigned short u16int;
typedef short s16int;
typedef unsigned char u8int;
typedef char s8int;
typedef struct registers
{
u32int ds; // Data segment selector
u32int edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha.
u32int int_no, err_code; // Interrupt number and error code (if applicable)
u32int eip, cs, eflags, useresp, ss; // Pushed by the processor automatically.
} registers_t;
struct idt_entry_struct
{
u16int base_lo;
u16int sel;
u8int always0;
u8int flags;
u16int base_hi;
} __attribute__ ((packed));
typedef struct idt_entry_struct idt_entry_t;
struct idt_ptr_struct
{
u16int limit;
u32int base;
} __attribute__ ((packed));
typedef struct idt_ptr_struct idt_ptr_t;
extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();
extern void isr5();
extern void isr6();
extern void isr7();
extern void isr8();
extern void isr9();
extern void isr10();
extern void isr11();
extern void isr12();
extern void isr13();
extern void isr14();
extern void isr15();
extern void isr16();
extern void isr17();
extern void isr18();
extern void isr19();
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();
extern void idt_flush(u32int);
void isr_handler(registers_t);
static void init_idt();
void *memset(void*, int, unsigned int);
static void idt_set_gate(u8int,u32int,u16int,u8int);
idt_entry_t idt_entries[256];
idt_ptr_t idt_ptr;
int kernel_main(void){
init_idt();
printf("Kernel loaded !\n");
asm volatile ("int $0x0");
while(1);
}
void *memset (void *buffer, int ch, unsigned int count)
{
register char *buff = buffer;
while ( count-- ) *buff++ = ch;
return buff;
}
static void init_idt()
{
idt_ptr.limit = sizeof(idt_entry_t) * 256 - 1;
idt_ptr.base = (u32int)&idt_entries;
memset(&idt_entries, 0, sizeof(idt_entry_t)*256);
idt_set_gate(0 , (u32int)isr0, 0x08, 0x0E);
idt_set_gate(1 , (u32int)isr1, 0x08, 0x0E);
idt_set_gate(2 , (u32int)isr2, 0x08, 0x0E);
idt_set_gate(3 , (u32int)isr3, 0x08, 0x0E);
idt_set_gate(4 , (u32int)isr4, 0x08, 0x0E);
idt_set_gate(5 , (u32int)isr5, 0x08, 0x0E);
idt_set_gate(6 , (u32int)isr6, 0x08, 0x0E);
idt_set_gate(7 , (u32int)isr7, 0x08, 0x0E);
idt_set_gate(8 , (u32int)isr8, 0x08, 0x0E);
idt_set_gate(9 , (u32int)isr9, 0x08, 0x0E);
idt_set_gate(10, (u32int)isr10, 0x08, 0x0E);
idt_set_gate(11, (u32int)isr11, 0x08, 0x0E);
idt_set_gate(12, (u32int)isr12, 0x08, 0x0E);
idt_set_gate(13, (u32int)isr13, 0x08, 0x0E);
idt_set_gate(14, (u32int)isr14, 0x08, 0x0E);
idt_set_gate(15, (u32int)isr15, 0x08, 0x0E);
idt_set_gate(16, (u32int)isr16, 0x08, 0x0E);
idt_set_gate(17, (u32int)isr17, 0x08, 0x0E);
idt_set_gate(18, (u32int)isr18, 0x08, 0x0E);
idt_set_gate(19, (u32int)isr19, 0x08, 0x0E);
idt_set_gate(20, (u32int)isr20, 0x08, 0x0E);
idt_set_gate(21, (u32int)isr21, 0x08, 0x0E);
idt_set_gate(22, (u32int)isr22, 0x08, 0x0E);
idt_set_gate(23, (u32int)isr23, 0x08, 0x0E);
idt_set_gate(24, (u32int)isr24, 0x08, 0x0E);
idt_set_gate(25, (u32int)isr25, 0x08, 0x0E);
idt_set_gate(26, (u32int)isr26, 0x08, 0x0E);
idt_set_gate(27, (u32int)isr27, 0x08, 0x0E);
idt_set_gate(28, (u32int)isr28, 0x08, 0x0E);
idt_set_gate(29, (u32int)isr29, 0x08, 0x0E);
idt_set_gate(30, (u32int)isr30, 0x08, 0x0E);
idt_set_gate(31, (u32int)isr31, 0x08, 0x0E);
idt_flush((u32int)&idt_ptr);
}
static void idt_set_gate(u8int num, u32int base, u16int sel, u8int flags)
{
idt_entries[num].base_lo = base & 0xFFFF;
idt_entries[num].base_hi = (base >> 16) & 0xFFFF;
idt_entries[num].sel = sel;
idt_entries[num].always0 = 0;
idt_entries[num].flags = flags;
printf("[idt_init] idt_set_gate n%d\n", num);
}
void isr_handler(registers_t regs)
{
printf("Interrupt: %d \n",regs.int_no);
}
Code: Select all
format elf
public idt_flush
idt_flush:
mov eax, [esp+4]
lidt [eax]
ret
public isr0
isr0:
cli
push 0
push 0
jmp isr_common_stub
rept 31 id
{
public isr#id
isr#id:
cli
if id = 8 | ( id > 9 & id < 15 )
push 0
end if
push id
jmp isr_common_stub
}
isr_common_stub:
pusha
mov ax,ds
push eax
mov ax,0x10 ; ax <== 10h
mov ds,ax ; ds <== 10h
mov es,ax ; es <== 10h
mov fs,ax ; fs <== 10h
mov gs,ax ; eg <== 10h
call isr_handler
pop eax ; restores the old values
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
popa
add esp, 8
sti
iret
Thanks .