addr_t getPageDir() { #ifdef PAGEDBG printf("WARNING! Page directory address not reliable!\n"); #endif return getCR3() + offset; }
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(); }
void impl_syscall_canonear(unsigned int dirFisicaTarget, unsigned int offsetRelativoContenidoMisil){ unsigned int virtualBuffer = TASK_VIRTUAL_P1 + offsetRelativoContenidoMisil;/*tarea + offset*/ unsigned int bufferPtr = mmu_virtual2physic(virtualBuffer, (pagedir_entry*) getCR3()); memcpy((void*)dirFisicaTarget, (void*) bufferPtr, 97/*97 bytes de misil*/); //notifico a context_manager notificarCanonazo(dirFisicaTarget); }
TCB *createThread( addr_t threadAddr, addr_t addrSpace, addr_t stack, TCB *exHandler ) { TCB * thread = NULL; pde_t pde; #if DEBUG if( exHandler == NULL ) kprintf("createThread(): NULL exception handler.\n"); #endif /* DEBUG */ if( threadAddr == NULL ) RET_MSG(NULL, "NULL thread addr") else if( addrSpace == NULL_PADDR ) RET_MSG(NULL, "NULL addrSpace") assert( (addrSpace & 0xFFFu) == 0u ); thread = popQueue(&freeThreadQueue); if( thread == NULL ) RET_MSG(NULL, "Couldn't get a free thread.") assert( thread->threadState == DEAD ); thread->priority = NORMAL_PRIORITY; thread->cr3.base = (addrSpace >> 12); thread->cr3.pwt = 1; thread->exHandler = exHandler; thread->waitThread = NULL; thread->threadQueue.tail = thread->threadQueue.head = NULL; thread->queueNext = thread->queuePrev = thread->timerNext = NULL; thread->timerDelta = 0u; thread->sig_handler = NULL; assert( (u32)addrSpace == ((u32)addrSpace & ~0xFFFu) ); // Map the page directory into the address space *(u32 *)&pde = (u32)addrSpace | PAGING_PWT | PAGING_RW | PAGING_PRES; writePDE( PAGETAB, &pde, addrSpace ); // Map the kernel into the address space readPDE( KERNEL_VSTART, &pde, (getCR3() & ~0xFFFu) ); writePDE( KERNEL_VSTART, &pde, addrSpace ); #if DEBUG readPDE( 0x00, &pde, (getCR3() & ~0xFFFu) ); writePDE( 0x00, &pde, addrSpace ); #endif /* DEBUG */ memset(&thread->execState.user, 0, sizeof thread->execState.user); thread->execState.user.eflags = 0x0201u; //0x3201u; // XXX: Warning: Magic Number thread->execState.user.eip = ( dword ) threadAddr; /* XXX: This doesn't yet initialize a kernel thread other than the idle thread. */ if( GET_TID(thread) == IDLE_TID ) { thread->execState.user.cs = KCODE; thread->execState.user.ds = thread->execState.user.es = KDATA; thread->execState.user.esp = stack - (sizeof(ExecutionState)-8); memcpy( (void *)thread->execState.user.esp, (void *)&thread->execState, sizeof(ExecutionState) - 8); } else if( ((unsigned int)threadAddr & KERNEL_VSTART) != KERNEL_VSTART ) { thread->execState.user.cs = UCODE; thread->execState.user.ds = thread->execState.user.es = thread->execState.user.userSS = UDATA; thread->execState.user.userEsp = stack; } thread->threadState = PAUSED; return thread; }