Sill
User
 Fresh Osdever
| Posts: 3 |   | Karma: 0
|
Re:Kernel reboots after keybord IRQ1 - 2008/05/18 15:04
(sorry for big parts of code but i have not idea how to avid this)
In entry.asm (the 'header' linked to the kernel.c) i have:
| Code: | cli
lgdt [gdt_descr]
lidt [idt_descr]
jmp .1
.1:
...
call reroute_irqs
...
[EXTERN __main]
call __main
...
idt_descr:
dw 256*8-1
dd idt
[GLOBAL idt]
idt:
times 256 dd 0,0
...
[GLOBAL _irq1]
_irq1:
(ISR code, I`ve even tried hlt for test purposes)
...
|
Then in C code I set IDT table entry by code like this:
| Code: | #define __byte(x,y) (((unsigned char *)&(y))[x])
#define cached_21 (__byte(0,cached_irq_mask))
#define cached_A1 (__byte(1,cached_irq_mask))
static unsigned int cached_irq_mask = 0xffff;
typedef struct {
unsigned short offset_0;
unsigned short selector;
unsigned short type;
unsigned short offset_16;
} gate_desc[256];
extern gate_desc idt;
void set_gate(int n, unsigned long irq_handle, unsigned short type) {
idt[n].offset_0 = irq_handle;
idt[n].selector = 0x08;
idt[n].type = type;
idt[n].offset_16 = (irq_handle >> 16);
}
void disable_irq(unsigned int irq) {
unsigned int mask = (1 << irq);
cached_irq_mask |= mask;
if (irq & 8) {
outb(cached_A1,0xA1);
} else {
outb(cached_21,0x21);
}
}
void enable_irq(unsigned int irq) {
unsigned int mask = ~(1 << irq);
cached_irq_mask &= mask;
if (irq & 8) {
outb(cached_A1,0xA1);
} else {
outb(cached_21,0x21);
}
}
// entry point of kernel
void __main() {
int i = 0;
for( i = 0; i < 16; i ++ ) {
disable_irq(i);
}
enable_irq(1);
set_gate(0x21, (unsigned long)&_irq1, 0x8E00);
sti();
for( ; ; );
}
|
What can be wrong?
I really have no idea...
|