diff --git a/kernel/hal/x86/asm/snippets.S b/kernel/hal/x86/asm/snippets.S index 0661c68..4303736 100644 --- a/kernel/hal/x86/asm/snippets.S +++ b/kernel/hal/x86/asm/snippets.S @@ -309,6 +309,7 @@ intr_stub 255 //This should cover everything. .extern handleINT intr_common_handler: + cli push %ebp push %edi push %esi diff --git a/kernel/hal/x86/init/idt.cpp b/kernel/hal/x86/init/idt.cpp index 059d541..a138b16 100644 --- a/kernel/hal/x86/init/idt.cpp +++ b/kernel/hal/x86/init/idt.cpp @@ -3,7 +3,9 @@ #include #include #include +#include auto syscall(uint32_t syscall_num, void* handle, void* args) -> void*; +extern void** progs; namespace MTGosHAL { IDT::IDT() { //Init PIC @@ -32,10 +34,27 @@ namespace MTGosHAL { loadIDT((void*)&idtptr); } auto IDT::handle(struct cpu_state* cpu) -> struct cpu_state* { - struct cpu_state* new_cpu=cpu; + struct cpu_state* new_cpu=cpu; debug << "Interrupt 0x" << Base::HEXADECIMAL << (int) cpu->intr << " was raised.\n"; if(cpu->intr<=0x1F) { err << "Exception 0x" << Base::HEXADECIMAL << (int) cpu->intr << "! Kernel halted!\n"; + err << "EAX = 0x" << (int)cpu->eax << " - EBX = 0x" << (int)cpu->ebx << "\n"; + err << "ECX = 0x" << (int)cpu->ecx << " - EDX = 0x" << (int)cpu->edx << "\n"; + err << "ESI = 0x" << (int)cpu->esi << " - EDI = 0x" << (int)cpu->edi << "\n"; + err << "SS:ESP = 0x" << (int)cpu->ss << ":0x" << (int)cpu->esp << " - SS:EBP = 0x" << (int)cpu->ss << ":0x" << (int)cpu->ebp << "\n"; + err << "CS:EIP = 0x" << (int)cpu->cs << ":0x" << (int)cpu->eip << " - INTR:ERR = 0x" << (int)cpu->intr << ":0x" << (int)cpu->error << "\n"; + err << "------ END OF REGISTER DUMP ------ ------ START OF PROGRAM LOADPOINTS ------\n"; + for(int i=0;i<1024;i++) { + if(!progs[i]) + break; + err << "0x" << (int)((uint32_t)progs[i]) << "; "; + } + err << "\n"; + uint16_t counter = 1193180 / 220; //Make an annoying beep + outb(0x43, 0xB6); + outb(0x42, (uint8_t)counter); + outb(0x42, (uint8_t)(counter>>8)); + outb(0x61, inb(0x61) | 3); while(1) { asm volatile("cli; hlt"); } @@ -54,7 +73,7 @@ namespace MTGosHAL { new_cpu=ivt[cpu->intr][i](new_cpu); } if(cpu->intr>=48) - cpu->eax=(uint32_t)(::syscall(cpu->eax, (void*)(cpu->ebx), (void*)(cpu->esp))); + new_cpu->eax=(uint32_t)(::syscall(cpu->eax, (void*)(cpu->ebx), (void*)(cpu->esp))); return new_cpu; } auto IDT::request(uint8_t intr, struct cpu_state* (*handler)(struct cpu_state*)) -> bool { diff --git a/kernel/hal/x86/init/init.cpp b/kernel/hal/x86/init/init.cpp index ce68dcf..3fe6a11 100644 --- a/kernel/hal/x86/init/init.cpp +++ b/kernel/hal/x86/init/init.cpp @@ -11,6 +11,7 @@ #include extern "C" void intr_stub_0(void); void main(void ** programs); +void** progs; namespace MTGosHAL { Serial debug; Screen out; @@ -45,14 +46,14 @@ namespace MTGosHAL { idt.apply(); mm.init(ebx); multiboot_mod_list *mods = (multiboot_mod_list*) ebx->mods_addr; - void** progs=(void**)mm.alloc(4096); - uint32_t i; - for(i=0;i<(ebx->mods_count<1023?ebx->mods_count:1023);i++) { //Basically until MIN(ebx->mods_count, 1023), as we only support loading up to 1023 programs directly. + progs=(void**)mm.alloc(4096); + for(int i=0;i<1024;i++) { + progs[i]=nullptr; + } + for(uint32_t i=0;i<(ebx->mods_count<1023?ebx->mods_count:1023);i++) { //Basically until MIN(ebx->mods_count, 1023), as we only support loading up to 1023 programs directly. progs[i]=(void*)(mods[i].mod_start); debug << "Found module!\n"; } - i++; - progs[i]=nullptr; ::main(progs); sti(); for(;;);