Пример #1
0
addr_t getPageDir()
{
#ifdef PAGEDBG
  printf("WARNING! Page directory address not reliable!\n");
#endif
  return getCR3() + offset;
}
Пример #2
0
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();
}
Пример #3
0
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);
}
Пример #4
0
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;
}