//funzione che inizializza un'area con il gestore passato come parametro void init_area(memaddr area, memaddr handler){ //i parametri sono l'area da inizializzare e il gestore relativo state_t *newArea = (state_t*) area; STST(newArea); newArea->pc = handler; newArea->sp = RAM_TOP; //interrupt disabilitati e kernel-mode newArea->cpsr = STATUS_ALL_INT_DISABLE((newArea->cpsr) | STATUS_SYS_MODE); }
/* @brief Populate a new processor state area. @param area Physical address of the area. @param handler Physical address of the handler. @return Void. */ HIDDEN void populateArea(memaddr oldArea, memaddr handler) { state_t *newArea; /* The new area points to the old area */ newArea = (state_t *) oldArea; /* Save the current processor state */ STST(newArea); /* Assign to Program Counter the Exception Handler address */ newArea->pc = handler; newArea->sp = RAM_TOP; /* Masked interrupts; Virtual Memory off; Kernel Mode on */ newArea->CP15_Control &= ~(0x1); newArea->cpsr = STATUS_ALL_INT_DISABLE(newArea->cpsr) | STATUS_SYS_MODE; }
void initExceptionHandlers() { state_t handler; // Processor Status Register handler.cpsr = STATUS_SYS_MODE; handler.cpsr = STATUS_ALL_INT_DISABLE(handler.cpsr); handler.cpsr = STATUS_DISABLE_TIMER(handler.cpsr); // System Control Register handler.CP15_Control = CP15_CONTROL_NULL; // Other registers handler.sp = RAM_TOP; handler.pc = (memaddr) excHandleInterrupt; memcpy((state_t *) INT_NEWAREA, &handler, sizeof(state_t)); handler.pc = (memaddr) excHandleTLB; memcpy((state_t *) TLB_NEWAREA, &handler, sizeof(state_t)); handler.pc = (memaddr) excHandlePGMT; memcpy((state_t *) PGMTRAP_NEWAREA, &handler, sizeof(state_t)); handler.pc = (memaddr) excHandleSYSBP; memcpy((state_t *) SYSBK_NEWAREA, &handler, sizeof(state_t)); }