Beispiel #1
0
void exception_init(void)
{
	unsigned int i;
	
	/* Clear exception table */
	for (i = 0; i < IVT_ITEMS; i++)
		exc_register(i, "undef", false,
		    (iroutine_t) unhandled_exception);
	
	exc_register(EXC_Bp, "bkpoint", true,
	    (iroutine_t) breakpoint_exception);
	exc_register(EXC_RI, "resinstr", true,
	    (iroutine_t) reserved_instr_exception);
	exc_register(EXC_Mod, "tlb_mod", true,
	    (iroutine_t) tlbmod_exception);
	exc_register(EXC_TLBL, "tlbinvl", true,
	    (iroutine_t) tlbinv_exception);
	exc_register(EXC_TLBS, "tlbinvl", true,
	    (iroutine_t) tlbinv_exception);
	exc_register(EXC_Int, "interrupt", true,
	    (iroutine_t) interrupt_exception);
	
#ifdef CONFIG_FPU_LAZY
	exc_register(EXC_CpU, "cpunus", true,
	    (iroutine_t) cpuns_exception);
#endif
	
	exc_register(EXC_Sys, "syscall", true,
	    (iroutine_t) syscall_exception);
}
Beispiel #2
0
void page_arch_init(void)
{
	if (config.cpu_active > 1) {
		write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
		return;
	}

	uintptr_t cur;
	unsigned int identity_flags =
	    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ;
		
	page_mapping_operations = &pt_mapping_operations;
		
	page_table_lock(AS_KERNEL, true);
		
	/*
	 * PA2KA(identity) mapping for all low-memory frames.
	 */
	for (cur = 0; cur < min(config.identity_size, config.physmem_end);
	    cur += FRAME_SIZE)
		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags);
		
	page_table_unlock(AS_KERNEL, true);
		
	exc_register(14, "page_fault", true, (iroutine_t) page_fault);
	write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
}
Beispiel #3
0
void noc_receive() {
  int id = get_cpuid();
  done[id] = 0;
  exc_register(18,&__data_resp_handler);
  //exc_register(19,&__data_resp_handler);
  intr_unmask_all();
  intr_enable();
  //puts("Interrupt handler setup");
  while(done[id] != 1){;}

  intr_disable();
  return;
}
Beispiel #4
0
int main(void) {
  // register exception handlers
  for (unsigned i = 0; i < 32; i++) {
	exc_register(i, &fault_handler);
  }
  exc_register(8, &trap_handler);
  exc_register(18, &intr_handler);
  exc_register(19, &intr_handler);
  exc_register(20, &intr_handler);
  exc_register(21, &intr_handler);

  // unmask interrupts
  intr_unmask_all();
  // clear pending flags
  intr_clear_all_pending();
  // enable interrupts
  intr_enable();

  // go to user mode
  EXC_STATUS &= ~0x2;

  // a that prints "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" N times and does some self-checking
  volatile unsigned starts = 0;
  volatile unsigned ends = 0;
  volatile unsigned sent = 0;

  for (unsigned k = 0; k < N; k++) {
    starts++;
    for (unsigned i = 0; i < 32; i++) {
      putchar('@'+i);
      sent+=i;
    }
    putchar('\n');
    ends++;

    if (sent != 496*(k+1) || starts != ends) {
      LEDS = 0x55;
      abort();
    }
  }

  // disabling interrupts again only works in privileged mode
  /* intr_disable(); */

  // call exception vector number 8
  trap(8);

  // trigger illegal operation fault
  asm volatile(".word 0xffffffff"); // illegal operation
  // trigger illegal memory access fault, never reached
  (*((volatile _IODEV unsigned *)0xffffffff)) = 0;

  return 0;
}
Beispiel #5
0
void interrupt_init(void)
{
	unsigned int i;
	
	for (i = 0; i < IVT_ITEMS; i++)
		exc_register(i, "null", false, (iroutine_t) null_interrupt);
	
	for (i = 0; i < IRQ_COUNT; i++) {
		if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1))
			exc_register(IVT_IRQBASE + i, "irq", true,
			    (iroutine_t) irq_interrupt);
	}
	
	exc_register(0, "de_fault", true, (iroutine_t) de_fault);
	exc_register(7, "nm_fault", true, (iroutine_t) nm_fault);
	exc_register(12, "ss_fault", true, (iroutine_t) ss_fault);
	exc_register(13, "gp_fault", true, (iroutine_t) gp_fault);
	
#ifdef CONFIG_SMP
	exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true,
	    (iroutine_t) tlb_shootdown_ipi);
#endif
}