/* process.c */ #include "process.h" #include "asm.h" #include "main.h" #include "message.h" #include "program.h" #include "registers.h" #include "scheduler.h" #include "string.h" #include "types.h" #include "tty3.h" PCB PCB_list[PROCESSES]; int is_supervisor(int pid) { int i; for (i = 0; i < PROCESSES; i++) { if (PCB_list[i].supervisor_pid == pid) { return 1; } } return 0; } void ps() { print_string("Processes: \n"); int i; for (i = 0; i < PROCESSES; i++) { if (PCB_list[i].pid) { print_int(PCB_list[i].pid); print_string(". "); print_string(PCB_list[i].name); print_string(" - priority "); print_int(PCB_list[i].priority); NEWLINE; } } } void clear_PCB(int pid) { int id = pid - 1; PCB_list[id].status = TERMINATED; PCB_list[id].priority = 0; PCB_list[id].delay_time = 0; PCB_list[id].wait_time = 0; PCB_list[id].address = 0; PCB_list[id].name[0] = '\0'; PCB_list[id].input[0] = '\0'; PCB_list[id].supervisor_pid = -1; PCB_list[id].pid = 0; PCB_list[id].toggle = 0; erase_all_messages(pid); erase_IO_entries(pid); } void terminate(int pid) { int id = pid - 1; if (PCB_list[id].supervisor_pid != -1) { send_message("Done!", 1, PCB_list[id].supervisor_pid); } clear_PCB(pid); } void init_PCB() { int i; for (i = 1; i <= PROCESSES; i++) { clear_PCB(i); } } int new_p(char name[MAX_STR_LEN], char argv[2][MAX_STR_LEN]) { int i; for (i = 0; i < PROCESSES; i++) { if (PCB_list[i].pid == 0) { clear_PCB(PCB_list[i].pid); PCB_list[i].address = get_program_address(name); PCB_list[i].regs.epc_reg = PCB_list[i].address; PCB_list[i].regs.sp_reg = (uint32_t)PCB_list[i].stack + STACK_SIZE; PCB_list[i].pid = i + 1; PCB_list[i].status = WAITING; PCB_list[i].priority = get_program_standard_priority(name); string_memcpy(PCB_list[i].name, name); string_memcpy(PCB_list[i].arg_1, argv[0]); string_memcpy(PCB_list[i].arg_2, argv[1]); return PCB_list[i].pid; } } return -1; } void registers_memcpy(registers_t *dst, const registers_t *src) { dst->at_reg = src->at_reg; int i; for (i = 0; i < 2; i++) { dst->v_reg[i] = src->v_reg[i]; } for (i = 0; i < 4; i++) { dst->a_reg[i] = src->a_reg[i]; } for (i = 0; i < 10; i++) { dst->t_reg[i] = src->t_reg[i]; } for (i = 0; i < 8; i++) { dst->s_reg[i] = src->s_reg[i]; } dst->sp_reg = src->sp_reg; dst->fp_reg = src->fp_reg; dst->ra_reg = src->ra_reg; dst->epc_reg = src->epc_reg; dst->gp_reg = src->gp_reg; }