pcb_t *makeInit() { // Init the first process pcb_t *pcb = allocPcb(); pcb->p_pid = 1; // Processor Status Register pcb->p_s.cpsr = STATUS_SYS_MODE; pcb->p_s.cpsr = STATUS_ALL_INT_ENABLE(pcb->p_s.cpsr); pcb->p_s.cpsr = STATUS_ENABLE_TIMER(pcb->p_s.cpsr); // System Control Register pcb->p_s.CP15_Control = CP15_CONTROL_NULL; // Other registers pcb->p_s.pc = (memaddr) init; pcb->p_s.sp = RAM_TOP-FRAMESIZE; return pcb; }
void processSet( struct pcb_t *p, memaddr start, int priority){ // Abilita gli interrupt, il Local Timer e la kernel-mode p->p_s.cpsr = STATUS_ALL_INT_ENABLE(p->p_s.cpsr) | STATUS_SYS_MODE; // Disabilita la memoria virtuale p->p_s.CP15_Control = (p->p_s.CP15_Control) & ~(ENABLE_VM); p->p_s.cpsr = STATUS_ENABLE_TIMER(p->p_s.cpsr); p->p_s.sp = RAM_TOP - FRAME_SIZE; // Assegna a PC l'indirizzo della funzione esterna test() p->p_s.pc = (memaddr) start; p->priority = priority; //assegno un pid al processo p->pid = newpid(); activeProcesses[first->pid-1] = p; //inserisco il processo dove di competenza insertProcQ(priority_queue( priority ), p); }