static int pf( struct registers *r ) { cli(); uint32_t cr2 = getCR2(); pde_t *cr3 = (pde_t *) PA2KVA(GET_BASE_ADDRESS(getCR3())); pte_t *pte = (pte_t *) PA2KVA(GET_BASE_ADDRESS(cr3[ GET_PD_OFFSET(cr2) ])); kprint( r->errcode & 1 ? "Page level protection\n" : "Page not present\n" ); kprint( r->errcode & 2 ? "Write error\n" : "Read error\n" ); kprint( r->errcode & 4 ? "User mode\n" : "Supervisor mode\n" ); kprint( r->errcode & 8 ? "Reserved bits en 1 en PD\n" : "Reserved bits en 0 en PD\n" ); kprint( r->errcode & 16 ? "Instruction Fetch\n" : "No fue Instruction Fetch\n" ); kprint( "CR2: 0x%x\nDir: 0x%x:0x%x\n", cr2, r->cs, r->eip ); if ( r->cs == USER_CS ) { kprint( "Matando tarea %d\n", tarea_activa ); matar_tarea( tarea_activa ); } /*if ( cr2 < KERNEL_MEMMAP ) { kprint ( "PDE Flags: %x\n", cr3[ GET_PD_OFFSET(cr2) ] & 0xF ); kprint ( "PTE Flags: %x\n", pte[ GET_PT_OFFSET(cr2) ] & 0xF ); if ( r->errcode & 1 ) { // Si estaba presente le arreglo esto. kprint ( "Arreglando.\n" ); cr3[ GET_PD_OFFSET(cr2) ] |= PAGE_USER | PAGE_RW; invlpg( GET_BASE_ADDRESS(cr2) ); return 0; } }*/ for (;;) hlt(); }
/** * Called when a pagefault occurs, is in charge of fixing the fault and swapping * if necessary. */ void cPageFault(isrVal_t registers) { addr_t page = getCR2(); addr_t page_addr = page & ~(0xFFF); #ifdef PAGEDBG printf("PG!\n"); printf("Fault addr: %X\nPage index: %X\n", page, page_addr); printf("Fault type: %X\n", registers.errCode); printf("EIP: %X\nESP: %X\nESP: %X\n", registers.eip, registers.procesp, registers.esp); printf("eax: %X\tebx: %X\necx: %X\tedx: %X\n", registers.eax, registers.ebx, registers.ecx, registers.edx); #endif if (registers.cs != 0x8 && registers.cs != 0x18) panic("Incorrect frame!"); if (USER(registers.errCode)) panic("Userspace isn't implemented yet!"); if (RESERVED(registers.errCode)) panic("A reserved bit has been set!\n"); if (PRESENT(registers.errCode)) panic("Illegal operation!"); addr_t pd = getPageDir(); /** * The data bit only works if a specific bit is set. See intel docs volume 3 * for more information. */ if (DATA(registers.errCode)) { #ifdef PAGEDBG printf("Trying to access unimplemented data!\n"); #endif if (WRITE(registers.errCode)) { #ifdef PAGEDBG printf("Faulted a write attempt!\n"); printf("Adding page!\n"); #endif if (USER(registers.errCode)) { //Add a user page! } else { #ifdef PAGEDBG printf("Adding a kernel page!\n"); #endif if (idx_kernel_space == MAP_NOMAP) panic("Kernel page map not correctly initialised!"); int ret = page_alloc_page (idx_kernel_space, page_addr, (void*)pd, FALSE); if (ret != -E_SUCCESS) { printf("ERRCODE: %X\n", -ret); panic("Couldn't alloc page!"); } #ifdef PAGEDBG printf("Phys of %X = %X\n", page, page_phys_addr(page, (void*)pd)); #endif } } else { #ifdef PAGEDBG printf("Faulted a read attempt!\n"); #endif // Assume the page may be read! if (idx_kernel_space == MAP_NOMAP) panic("Kernel page map not correctly initialised!"); int ret = page_alloc_page(idx_kernel_space, page_addr, (void*)pd, FALSE); if (ret != -E_SUCCESS) { printf("ERRCODE: %X\n", -ret); panic("Couldn't alloc page!"); } #ifdef PAGEDBG printf("Phys of %X = %X\n", page, page_phys_addr(page, (void*)pd)); #endif } } else { #ifdef PAGEDBG panic("Trying to run unimplemented code!\n"); #endif } #ifdef UNDEFINED printf("Page faults currently under construction!\n"); #endif }