diff --git a/student-distrib/lib.c b/student-distrib/lib.c index ee909f3876bcc20c710894f3ee838ba473d1be58..3fd4942a8cc9e9bc0047529cf75cffbc61ff4558 100644 --- a/student-distrib/lib.c +++ b/student-distrib/lib.c @@ -78,7 +78,7 @@ void scroll_up(int32_t term_id) uint8_t * video_memory; - if(term_id == -1 || term_id == control.cur_terminal /*|| control.cur_terminal == control.running_terminal*/) + if(term_id == -1) video_memory = video_mem; else video_memory = control.terminal[term_id].vid_mem; @@ -272,10 +272,18 @@ void putc(uint8_t c, int32_t term_id) { uint8_t * video_memory; - if(term_id == -1 || term_id == control.cur_terminal /*|| control.cur_terminal == control.running_terminal*/) + int32_t terminal_to_write; + + if(term_id == -1) + { + terminal_to_write = control.cur_terminal; video_memory = video_mem; + } else + { + terminal_to_write = term_id; video_memory = control.terminal[term_id].vid_mem; + } // if(init_ready) // video_memory = control.terminal[control.cur_terminal].vid_mem; @@ -289,42 +297,42 @@ void putc(uint8_t c, int32_t term_id) { if(c == '\n' || c == '\r') { - control.terminal[control.cur_terminal].terminal_y++; - control.terminal[control.cur_terminal].terminal_x = 0; + control.terminal[terminal_to_write].terminal_y++; + control.terminal[terminal_to_write].terminal_x = 0; } else { - *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[control.cur_terminal].terminal_y - + control.terminal[control.cur_terminal].terminal_x) << 1)) = c; + *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[terminal_to_write].terminal_y + + control.terminal[terminal_to_write].terminal_x) << 1)) = c; - *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[control.cur_terminal].terminal_y - + control.terminal[control.cur_terminal].terminal_x) << 1) + 1) = ATTRIB; + *(uint8_t *)(video_memory + ((NUM_COLS * control.terminal[terminal_to_write].terminal_y + + control.terminal[terminal_to_write].terminal_x) << 1) + 1) = ATTRIB; - control.terminal[control.cur_terminal].terminal_x++; + control.terminal[terminal_to_write].terminal_x++; //control.terminal[control.cur_terminal].terminal_x %= NUM_COLS; - control.terminal[control.cur_terminal].terminal_y = - (control.terminal[control.cur_terminal].terminal_y + - ((control.terminal[control.cur_terminal].terminal_x%NUM_COLS) / NUM_COLS)) % NUM_ROWS; + control.terminal[terminal_to_write].terminal_y = + (control.terminal[terminal_to_write].terminal_y + + ((control.terminal[terminal_to_write].terminal_x%NUM_COLS) / NUM_COLS)) % NUM_ROWS; } - if(control.terminal[control.cur_terminal].terminal_x == NUM_COLS && - control.terminal[control.cur_terminal].terminal_y < NUM_ROWS-1) + if(control.terminal[terminal_to_write].terminal_x == NUM_COLS && + control.terminal[terminal_to_write].terminal_y < NUM_ROWS-1) { - control.terminal[control.cur_terminal].terminal_y++; - control.terminal[control.cur_terminal].terminal_x = 0; + control.terminal[terminal_to_write].terminal_y++; + control.terminal[terminal_to_write].terminal_x = 0; } - else if((control.terminal[control.cur_terminal].terminal_x == NUM_COLS && - control.terminal[control.cur_terminal].terminal_y == NUM_ROWS-1) || - control.terminal[control.cur_terminal].terminal_y > NUM_ROWS-1) + else if((control.terminal[terminal_to_write].terminal_x == NUM_COLS && + control.terminal[terminal_to_write].terminal_y == NUM_ROWS-1) || + control.terminal[terminal_to_write].terminal_y > NUM_ROWS-1) { scroll_up(term_id); - control.terminal[control.cur_terminal].terminal_x = 0; - control.terminal[control.cur_terminal].terminal_y = NUM_ROWS-1; + control.terminal[terminal_to_write].terminal_x = 0; + control.terminal[terminal_to_write].terminal_y = NUM_ROWS-1; } - - update_cursor(); + if(term_id == -1) + update_cursor(); } /* int8_t* itoa(uint32_t value, int8_t* buf, int32_t radix); diff --git a/student-distrib/proc.c b/student-distrib/proc.c index c232e2b4875d5ea0251605fffd07c9d697cf3893..d363798237d922b3698fa0fb7e3f034d7f84dbb6 100644 --- a/student-distrib/proc.c +++ b/student-distrib/proc.c @@ -21,7 +21,7 @@ void control_initilization(void) control.total_prog_count = 0; control.cur_terminal = 0; control.visible_terminal = 0; - control.running_terminal = 0; + //control.running_terminal = 0; } /* Checks if FD is valid @@ -84,8 +84,14 @@ void pcb_init(pcb_t* pcb , uint8_t* parsed_cmd, uint8_t (*argv)[MAX_ARGUMENT_SIZ pcb->parent_pid = 0; pcb->arg_num = arg_num; + + pcb->running_terminal = control.cur_terminal; + pcb->shell_flag = 0; + memcpy(pcb->cmd, parsed_cmd, MAX_COMMAND_SIZE); - for(i = 0; i < MAX_ARGUMENT_NUM; i++) memcpy(pcb->argv[i],argv[i], MAX_ARGUMENT_SIZE); + + for(i = 0; i < MAX_ARGUMENT_NUM; i++) + memcpy(pcb->argv[i],argv[i], MAX_ARGUMENT_SIZE); pcb->parent_esp = 0; pcb->parent_ebp = 0; diff --git a/student-distrib/syscall.c b/student-distrib/syscall.c index c470d105a51bd4fcfa60d2dda4464730cd88e5bc..c570b260c3971f781afc9dce1dcca9c6b5fe25a3 100644 --- a/student-distrib/syscall.c +++ b/student-distrib/syscall.c @@ -14,8 +14,11 @@ int32_t halt (uint8_t status){ cli(); pcb_t* pcb_cur = control.terminal[control.cur_terminal].pcb; + //pcb_t * pcb_cur = control.curr_pcb; pcb_t* pcb_prev = pcb_cur->parent_pcb; + printf("[halt] entered halt with pcb = %x\n", pcb_cur); + /* set all present flags in PCB to "Not In Use" */ for (i = 0; i < MAX_FILE_NUM; i++) { @@ -117,10 +120,13 @@ int32_t execute(const uint8_t* command){ arg_num = (ret > -1) ? ret : 0; - if(ret == -2) - { + if(ret == -1) + + return -1; + + else if(ret == -2) + exit(); - } //------------------ 1: Executable check ----------------------------------- dentry_t dentry; @@ -170,6 +176,9 @@ int32_t execute(const uint8_t* command){ pcb_init(&pcb, parsed_cmd, argv, pid, arg_num); pcb_t* pcb_ptr = get_pcb(pid); + //control.curr_pcb = pcb_ptr; + + pcb_ptr->running_terminal = control.cur_terminal; // Save current ESP, EBP asm volatile(" \n\ @@ -183,12 +192,17 @@ int32_t execute(const uint8_t* command){ control.terminal[control.cur_terminal].pcb = pcb_ptr; + if (strncmp("shell", (int8_t*)parsed_cmd, 5) == 0) + { + printf("entered shell if\n"); + control.terminal[control.cur_terminal].pcb->shell_flag = 1; + } + //--------------------- 6: context switch----------------------------------- //set running terminal - if(ret != -1) - control.running_terminal = control.cur_terminal; + //control.running_terminal = control.cur_terminal; // update SS0 and ESP0 in Task State Segment when switching context tss.ss0 = KERNEL_DS; @@ -255,7 +269,7 @@ int32_t read (int32_t fd_n, void* buf, int32_t nbytes){ /* Enable for keyboard interrupts */ sti(); - ret = control.terminal[control.cur_terminal].pcb->fd[fd_n].fileop_ptr.read(fd_n, buf, nbytes); + ret = control.terminal[control.cur_terminal].pcb->fd[fd_n].fileop_ptr.read(fd_n, buf, nbytes); return ret; diff --git a/student-distrib/terminal.c b/student-distrib/terminal.c index 5efb86de5c2086ce5c44458b8322d49b5051544a..aa196f115e87640690b98a1ba2554e560fba76cc 100644 --- a/student-distrib/terminal.c +++ b/student-distrib/terminal.c @@ -91,6 +91,16 @@ int32_t terminal_read(int32_t fd, void* buf, int32_t nbytes) int32_t terminal_write(int32_t fd, const void* buf, int32_t nbytes) { + pcb_t * pcb_ptr = current_pcb(); + + int32_t terminal_to_write = (pcb_ptr->running_terminal == control.cur_terminal) ? -1 : control.cur_terminal; + + if(pcb_ptr->shell_flag) + terminal_to_write = -1; + + //printf("[terminal_write] shell_flag = %d\n", pcb_ptr->shell_flag); + //printf("[terminal_write] cur_terminal %d , running_terminal = %d , terminal_to_write = %d\n", control.cur_terminal, pcb_ptr->running_terminal, terminal_to_write); + // checks if buf is null or overflow if((int8_t*)buf == NULL /*|| nbytes > MAX_BUF_SIZE-1*/) return -1; @@ -98,7 +108,7 @@ int32_t terminal_write(int32_t fd, const void* buf, int32_t nbytes) int i; // prints content to terminal for(i = 0; i < nbytes; i++) - putc( ((int8_t*)buf)[i] , control.cur_terminal); + putc( ((int8_t*)buf)[i] , terminal_to_write); return nbytes; } diff --git a/student-distrib/types.h b/student-distrib/types.h index e7aba01c8e4da3cccf26e511408fc41fc3d5e130..13e79f2dafde29dd2c7ab5b6346fbf715c3f970d 100644 --- a/student-distrib/types.h +++ b/student-distrib/types.h @@ -139,6 +139,9 @@ typedef struct pcb { file_object_t fd[MAX_FILE_NUM]; /* File descriptor array */ + int32_t running_terminal; + int32_t shell_flag; + uint32_t pid; /* Holds current process ID */ uint32_t current_esp; //newly added, need initilization uint32_t current_ebp; //newly added, need initilization @@ -179,9 +182,10 @@ volatile int32_t buffer_index; typedef struct control { terminal_t terminal[MAX_TERMINAL]; + pcb_t * curr_pcb; int32_t cur_terminal; int32_t visible_terminal; - int32_t running_terminal; + //int32_t running_terminal; int32_t total_prog_count; uint32_t filesys_start; int32_t pid_array[MAX_PROCESS];