fix: correction interruptions, version fonctionnelle

This commit is contained in:
Nicolas Hordé 2018-08-17 11:17:24 +02:00
parent b09af8b250
commit d29fa15861
5 changed files with 160 additions and 81 deletions

View File

@ -8,8 +8,15 @@
#define nop() asm("nop"::)
#define iret() asm("addl $0x0C, %esp; \
iret;")
#define pushad() asm("pushal"::)
#define popad() asm("popal"::)
#define pushf() asm("pushf"::)
#define popf() asm("popf"::)
#define iret() asm("iret"::)
#define irqendmaster() asm("movb $0x20,%al; \
outb %al,$0x20;")

101
lib/idt.c
View File

@ -111,7 +111,11 @@ void cpuerror(const u8 *src)
void interruption()
{
cli();
pushf();
pushad();
print("Appel d'une interruption\r\n");
popad();
popf();
sti();
iret();
}
@ -119,260 +123,316 @@ void interruption()
void exception0()
{
print("divide error\r\n");
iret();
}
void exception1()
{
cpuerror("debug exception\r\n");
iret();
}
void exception2()
{
cpuerror("non-maskable hardware interrupt\r\n");
iret();
}
void exception3()
{
cpuerror("INT3 instruction\r\n");
iret();
}
void exception4()
{
cpuerror("INTO instruction detected overflow\r\n");
iret();
}
void exception5()
{
print("BOUND instruction detected overrange\r\n");
iret();
}
void exception6()
{
cpuerror("invalid instruction opcode\r\n");
iret();
}
void exception7()
{
cpuerror("no coprocessor\r\n");
iret();
}
void exception8()
{
cpuerror("double fault\r\n");
iret();
}
void exception9()
{
cpuerror("coprocessor segment overrun\r\n");
iret();
}
void exception10()
{
cpuerror("invalid task state segment (TSS)\r\n");
iret();
}
void exception11()
{
cpuerror("segment not present\r\n");
iret();
}
void exception12()
{
cpuerror("stack fault");
iret();
}
void exception13()
{
cpuerror("general protection fault (GPF)\r\n");
iret();
}
void exception14()
{
cpuerror("page fault\r\n");
iret();
}
void exception15()
{
cpuerror("(reserved)\r\n");
iret();
}
void exception16()
{
cpuerror("coprocessor error\r\n");
iret();
}
void exception17()
{
cpuerror("alignment check\r\n");
iret();
}
void exception18()
{
cpuerror("machine check");
iret();
}
void irq0()
{
cli();
pushf();
pushad();
print("irq 0");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq1()
{
cli();
pushf();
pushad();
print("irq 1");
while ((inb(0x64)&1)==0);
inb(0x60);
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq2()
{
cli();
pushf();
pushad();
print("irq 2");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq3()
{
cli();
pushf();
pushad();
print("irq 3");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq4()
{
cli();
pushf();
pushad();
print("irq 4");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq5()
{
cli();
pushf();
pushad();
print("irq 5");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq6()
{
cli();
pushf();
pushad();
print("irq 6");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq7()
{
cli();
pushf();
pushad();
print("irq 7");
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq8()
{
cli();
pushf();
pushad();
print("irq 8");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq9()
{
cli();
pushf();
pushad();
print("irq 9");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq10()
{
cli();
pushf();
pushad();
print("irq 10");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq11()
{
cli();
pushf();
pushad();
print("irq 11");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq12()
{
cli();
pushf();
pushad();
print("irq 12");
while ((inb(0x64)&1)==0);
inb(0x60);
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq13()
{
cli();
pushf();
pushad();
print("irq 13");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
void irq14()
{
cli();
pushf();
pushad();
print("irq 14");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}
@ -382,7 +442,10 @@ void irq15()
print("irq 15");
irqendslave();
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}

View File

@ -285,7 +285,9 @@ if ((bufferscan[lastscan]==0xE0)||((kbdstatus & STATUS_NUM)&&(key>=0x47)&&(key<=
void keyboard()
{
printf("test");
cli();
pushf();
pushad();
u8 scancode,ascii;
cli();
while ((inb(0x64)&1)==0);
@ -293,13 +295,15 @@ scancode=inb(0x60);
ascii = convert(scancode);
if(ascii != 0)
{
putchar(ascii);
ptrascii++;
if (ptrascii==255) ptrascii==0;
bufferascii[ptrascii]=ascii;
}
irqendmaster();
popad();
popf();
sti();
asm("addl $0x01C, %esp;");
iret();
}

View File

@ -14,9 +14,14 @@ static u8 curspos=0;
void timer()
{
cli();
pushf();
pushad();
showchar(0,0,curs[curspos],7);
curspos=(curspos+1)&0x3;
irqendmaster();
popad();
popf();
sti();
asm("addl $0x1C,%esp;iret;");
asm("addl $0x0C, %esp;");
iret();
}

View File

@ -45,7 +45,7 @@ int main(void) {
ok();
print("Activation de l'IRQ 0\000");
//enableirq(0);
enableirq(0);
ok();
print("Installation du handler clavier\000");