Moved reading file from disk to its own super visor terminal command
- Updated gdt assembly - Updated Interrupt service request handlers - Improved virtual memory manager - NOTE: we're dependent on identity mappings for the heap to work
This commit is contained in:
@ -2,8 +2,7 @@
|
||||
#include "../../drivers/pit/pit.h"
|
||||
#include "../../drivers/ps-2/keyboard.h"
|
||||
#include "../../cpu.h"
|
||||
#include "../../drivers/ps-2/keyboard.h"
|
||||
|
||||
#include "../../memory/VirtualMemoryManager.h"
|
||||
IDT_entry idt_table[256];
|
||||
IDT_ptr idt_ptr;
|
||||
|
||||
@ -17,25 +16,25 @@ void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags){
|
||||
|
||||
};
|
||||
|
||||
void irs_handler (registers regs) {
|
||||
void irs_handler (registers* regs) {
|
||||
uint32_t FaultingAddress;
|
||||
//printf("(IRS) Interrupt number: %d \r", regs.int_no);
|
||||
switch (regs.int_no)
|
||||
switch (regs->int_no)
|
||||
{
|
||||
case 0:
|
||||
// Divide Error #DE
|
||||
printf("#DE\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
// Debug Exception #DB
|
||||
printf("#DB\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
@ -46,49 +45,50 @@ void irs_handler (registers regs) {
|
||||
case 3:
|
||||
// Breakpoint Exception #BP
|
||||
printf("#BP\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
// Overflow Exception #OF
|
||||
printf("#OF\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
// BOUND Range Exceeded Exception #BR
|
||||
printf("#BR\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
// Invalid OpCode Exception #UD
|
||||
printf("#UD\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
// Device Not Available Exception #NM
|
||||
printf("#NM\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
// Double Fault Exception #DF
|
||||
printf("#DF\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
while(true);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
@ -99,64 +99,74 @@ void irs_handler (registers regs) {
|
||||
case 10:
|
||||
// Invalid TSS Exception #TS
|
||||
printf("#TS\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||
break;
|
||||
|
||||
case 11:
|
||||
// Segment Not Present #NP
|
||||
printf("#NP\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 12:
|
||||
// Stack Fault Exception #SS
|
||||
printf("#SS\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 13:
|
||||
case 13:{
|
||||
// General Protection Exception #GP
|
||||
printf("#GP\n");
|
||||
|
||||
printf("Accessing memory caused a general protectuion exception.\n");
|
||||
|
||||
printf("Fault due to entry at index: %d", (regs.err_code >> 3 & 0xFFF ) );
|
||||
printf("Accessing memory caused a general protection exception.\n");
|
||||
printf("Faulting instruction at addres: 0x%x\n", regs->eip );
|
||||
printf("Error code: 0x%x\n", regs->err_code);
|
||||
|
||||
if(regs.err_code & 0x3 >> 1 == 0 ){
|
||||
printf("* Index references GDT");
|
||||
}
|
||||
if(regs.err_code & 0x3 >> 1 == 1 ){
|
||||
printf("* Index references IDT");
|
||||
}
|
||||
if (regs->err_code != 0){
|
||||
printf("Fault due to entry at index: 0x%x (%d)\n", (regs->err_code >> 3 & 0xFFF ) , regs->err_code);
|
||||
|
||||
if(regs.err_code & 0x3 >> 1 == 2 ){
|
||||
printf("* Index references LDT");
|
||||
}
|
||||
|
||||
if(regs.err_code & 0x3 >> 1 == 4 ){
|
||||
printf("* Index references IDT");
|
||||
}
|
||||
uint8_t table = regs->err_code >> 1 & 0x3 ;
|
||||
|
||||
if(table == 0 ){
|
||||
printf("* Index references GDT\n");
|
||||
}
|
||||
if(table == 1 ){
|
||||
printf("* Index references IDT\n");
|
||||
}
|
||||
|
||||
if( regs.err_code & 0x1)
|
||||
{
|
||||
printf("* Originated externally!");
|
||||
if(table == 2 ){
|
||||
printf("* Index references LDT\n");
|
||||
}
|
||||
|
||||
if(table == 3 ){
|
||||
printf("* Index references IDT\n");
|
||||
}
|
||||
|
||||
if( regs->err_code & 0x1)
|
||||
{
|
||||
printf("* Originated externally!\n");
|
||||
}
|
||||
}
|
||||
|
||||
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 14:
|
||||
// Page Fault Exception #PF
|
||||
printf("#PF\n");
|
||||
|
||||
#define ALIGN(addr, align) (((addr) & ~((align) - 1)) + (align))
|
||||
FaultingAddress = GetCR2();
|
||||
|
||||
printf("Accessing the linear address 0x%x resulted in a page fault!\n\n", FaultingAddress);
|
||||
|
||||
// Error code of 32 bits are on the stack
|
||||
@ -174,89 +184,86 @@ void irs_handler (registers regs) {
|
||||
printf("REASON: \n\n");
|
||||
|
||||
|
||||
if (regs.err_code & PF_ERR_PRESENT_BIT ){
|
||||
if (regs->err_code & PF_ERR_PRESENT_BIT ){
|
||||
printf("* Page protection violation!\n");
|
||||
} else{
|
||||
printf("* Page not-present!\n");
|
||||
Immediate_Map(FaultingAddress, FaultingAddress - 0xC0000000);
|
||||
|
||||
}
|
||||
|
||||
if(regs.err_code & PF_ERR_WRITE_BIT){
|
||||
if(regs->err_code & PF_ERR_WRITE_BIT){
|
||||
printf("* Write access violation!\n");
|
||||
} else{
|
||||
printf("* Read access violation!\n");
|
||||
}
|
||||
|
||||
if(regs.err_code & PF_ERR_USER_BIT){
|
||||
if(regs->err_code & PF_ERR_USER_BIT){
|
||||
printf("* Violation from user-space (CPL=3)\n");
|
||||
}
|
||||
|
||||
if(regs.err_code & PF_ERR_INSTRUCTION_FETCH_BIT){
|
||||
if(regs->err_code & PF_ERR_INSTRUCTION_FETCH_BIT){
|
||||
printf("* Caused by an instruction fetch. \n");
|
||||
}
|
||||
|
||||
/*
|
||||
Check the error code to figure out what happened here
|
||||
*/
|
||||
|
||||
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||
|
||||
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case 16:
|
||||
// x87 FPU Floating-point Error #MF
|
||||
printf("#MF\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 17:
|
||||
// Alignment Check Exception #AC
|
||||
printf("#AC\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 18:
|
||||
// Machine-Check Exception #MC
|
||||
printf("#MC\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 19:
|
||||
// SIMD Floating-point Exception #XM
|
||||
printf("#XM\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 20:
|
||||
// Virtualization Exception #VE
|
||||
printf("#VE\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
case 21:
|
||||
// Control Protection Exception #CP
|
||||
printf("#CP\n");
|
||||
printf("EIP: 0x%x\n", regs.eip);
|
||||
printf("EAX: 0x%x\n", regs.eax);
|
||||
printf("EBP: 0x%x\n", regs.ebp);
|
||||
printf("EIP: 0x%x\n", regs->eip);
|
||||
printf("EAX: 0x%x\n", regs->eax);
|
||||
printf("EBP: 0x%x\n", regs->ebp);
|
||||
break;
|
||||
|
||||
default:
|
||||
// PANIC!!!
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ extern "C" {
|
||||
|
||||
void irq_handler (registers regs);
|
||||
|
||||
void irs_handler (registers regs);
|
||||
void irs_handler (registers* regs);
|
||||
|
||||
extern void irs0 ();
|
||||
extern void irs1 ();
|
||||
|
Reference in New Issue
Block a user