diff --git a/student-distrib/paging.c b/student-distrib/paging.c index de330a322808d157f9e48990d4763a2598310cb9..d451d094cb2fd9e74e6aeec4e779ae858d6d5f27 100644 --- a/student-distrib/paging.c +++ b/student-distrib/paging.c @@ -22,7 +22,7 @@ void paging_initi(void){ } /* First page table entry need to be 0 */ - page_table[0] = 0x0; + // page_table[0] = 0x0; /* Set page table for video memory */ page_table[VIDEO_MEM + 0] |= USER | PRESENT; @@ -80,18 +80,22 @@ void remap2(int32_t term_id){ * Return Value: void * Function: Initialises page for video memory */ -uint8_t* remap_vidmem(uint32_t pid){ +void remap_vidmem(){ - int32_t addr = VIDEO_MEM + pid * 4 + 3; //3 = offset for multiple terminals + page_directory[33] = (uint32_t)(uint32_t)page_table | USER | READ_WRITE | PRESENT; - page_table[addr] = VIDEO_ADDR | USER | READ_WRITE | PRESENT; + if(visible_terminal == running_terminal) + + page_table[0] = ((uint32_t)0xB8000) | USER | READ_WRITE | PRESENT; - page_directory[0] = ((uint32_t)page_table) | USER | READ_WRITE | PRESENT; + else + + page_table[0] = ((uint32_t)(0xB8000 + (running_terminal+1)*0x1000 )) | USER | READ_WRITE | PRESENT; // flush TLB flush_tlb(); - return (uint8_t*)(addr << 12); + return; } /* remap_program diff --git a/student-distrib/paging.h b/student-distrib/paging.h index 3bae8d9ed19b08f59e2290e7e9ed2f66cc89a716..8db45b5ef9ba012d2817d45e9f81eb20994a4369 100644 --- a/student-distrib/paging.h +++ b/student-distrib/paging.h @@ -62,7 +62,7 @@ extern void remap1(int32_t term_id); extern void remap2(int32_t term_id); -extern uint8_t* remap_vidmem(uint32_t pid); +extern void remap_vidmem(); extern int32_t remap_proc(int32_t pid); extern void remap_program(uint32_t pid); extern void remap_term(int32_t term_id); diff --git a/student-distrib/scheduler.c b/student-distrib/scheduler.c index e642ad33ebf518931830be12d1688bab43c50bbb..23ad1dce5c7aa30720f14e2e37d7c34b3dee735a 100644 --- a/student-distrib/scheduler.c +++ b/student-distrib/scheduler.c @@ -52,6 +52,7 @@ void scheduler(void){ return; } + remap_vidmem(); remap2(running_terminal); pcb_t* next_pcb = terminal[running_terminal].pcb; diff --git a/student-distrib/syscall.c b/student-distrib/syscall.c index 778005ab055d42c62c28556c697a80b13b68d93d..82e01b04abce0d913f4576c40ce89f5df756d9d2 100644 --- a/student-distrib/syscall.c +++ b/student-distrib/syscall.c @@ -98,7 +98,7 @@ int32_t execute(const uint8_t* command){ return 0; printf("[EXE] running_terminal = %d\n", running_terminal); - printf("[EXE] strlen(command) = %d\n", strlen(command)); + printf("[EXE] (command) = %s\n", command); // if cpu reaches its maximum control, abort if( total_prog_count >= MAX_PROCESS) @@ -485,15 +485,14 @@ int32_t vidmap (uint8_t** screen_start){ if ( addr < VID_STA || addr > VID_END) return -1; - terminal[ visible_terminal].pcb = current_pcb(); + remap_vidmem(); - *screen_start = remap_vidmem( terminal[ visible_terminal].pcb->pid); + *screen_start = (uint8_t *)(0x8400000); //screen_start = terminal[ running_terminal].vid_mem; - flush_tlb(); - return 0; + return 0x8400000; } /* diff --git a/student-distrib/syscall.h b/student-distrib/syscall.h index 940f1b702250b7b24251dc2a3825565385b52a09..206269693e9a2fc43859d71fe96eb87590d7c8d8 100644 --- a/student-distrib/syscall.h +++ b/student-distrib/syscall.h @@ -37,7 +37,7 @@ extern int32_t sigreturn (void); //from paging.h void flush_tlb(void); void remap_program(uint32_t pid); -uint8_t* remap_vidmem(uint32_t pid); +//uint8_t* remap_vidmem(uint32_t pid); //from proc.h int32_t parse_cmd(const uint8_t* command, uint8_t* cmd, uint8_t (*argv)[MAX_ARGUMENT_SIZE]); /* Function for parsing commands */