Skip to content
Snippets Groups Projects
Commit 8924d5d9 authored by kexu6's avatar kexu6
Browse files

add comments and bug log

parent 6e7f5573
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,8 @@ int32_t fd_check(int32_t fd)
if (fd >= MIN_FILE_NUM && fd < MAX_FILE_NUM )
{
/* Now check if file is present */
if ( terminal[ running_terminal].pcb->fd[fd].flags != 0)
// // use running_terminal instead of visible_terminal !!!
if ( terminal[running_terminal].pcb->fd[fd].flags != 0)
return 0;
}
return -1;
......@@ -44,13 +45,14 @@ int32_t fd_check(int32_t fd)
//clearing fd
void fd_clear(int32_t fd)
{
terminal[ running_terminal].pcb->fd[fd].fileop_ptr.read = 0;
terminal[ running_terminal].pcb->fd[fd].fileop_ptr.write = 0;
terminal[ running_terminal].pcb->fd[fd].fileop_ptr.open = 0;
terminal[ running_terminal].pcb->fd[fd].fileop_ptr.close = 0;
terminal[ running_terminal].pcb->fd[fd].inode_index = 0;
terminal[ running_terminal].pcb->fd[fd].file_pos = 0;
terminal[ running_terminal].pcb->fd[fd].flags = 0;
// use running_terminal instead of visible_terminal !!!
terminal[running_terminal].pcb->fd[fd].fileop_ptr.read = 0;
terminal[running_terminal].pcb->fd[fd].fileop_ptr.write = 0;
terminal[running_terminal].pcb->fd[fd].fileop_ptr.open = 0;
terminal[running_terminal].pcb->fd[fd].fileop_ptr.close = 0;
terminal[running_terminal].pcb->fd[fd].inode_index = 0;
terminal[running_terminal].pcb->fd[fd].file_pos = 0;
terminal[running_terminal].pcb->fd[fd].flags = 0;
return;
}
......
......@@ -6,20 +6,16 @@
*
* DESCRIPTION: This function terminates a process, returning the specified value to its parent process.
*
* INPUT: status --
* INPUT: status
*
* RETURN:
* RETURN: always return 0
*/
int32_t halt (uint8_t status)
{
int32_t halt (uint8_t status) {
int i;
cli();
pcb_t* pcb_cur = terminal[running_terminal].pcb;
// printf("[halt] running_terminal = %d\n", running_terminal);
pcb_t* pcb_prev = pcb_cur->parent_pcb;
/* set all present flags in PCB to "Not In Use" */
......@@ -38,6 +34,7 @@ int32_t halt (uint8_t status)
terminal[pcb_cur->running_terminal].terminal_prog_count--;
}
// exiting "root shell"
if(terminal[running_terminal].terminal_prog_count == 0)
{
printf("[halt] executing new shell...\n");
......@@ -57,13 +54,12 @@ int32_t halt (uint8_t status)
clear_pid(pcb_cur->pid);
//------------------ Jump to execute return --------------------------------
asm volatile(
"movl %0, %%eax;"
"movl %1, %%esp;"
"movl %2, %%ebp;"
"movl %1, %%esp;" // restore parent_esp
"movl %2, %%ebp;" // restore parent_ebp
"jmp exec_ret"
:
:"r"((uint32_t)status), "r"(pcb_cur->parent_esp), "r"(pcb_cur->parent_ebp)
......@@ -94,18 +90,12 @@ int32_t execute(const uint8_t* command)
cli();
// if command == NULL, abort
// invalid command
if(command == NULL) return -1;
// if(strncmp("\n", command, 1) == 0)
// return 0;
if(strlen((int8_t *) command) == 1)
return 0;
// printf("[EXE] running_terminal = %d\n", running_terminal);
// printf("[EXE] (command) = %s\n", command);
//------------------ 0 : Parse args ----------------------------------------
uint8_t parsed_cmd[MAX_COMMAND_SIZE];
......@@ -116,24 +106,15 @@ int32_t execute(const uint8_t* command)
ret = parse_cmd(command, parsed_cmd, argv);
/* For keyboard interrupts */
//sti();
//set argument number for pcb initialization
// set argument number for pcb initialization
arg_num = (ret > -1) ? ret : 0;
if(ret == -1)
return -1;
else if(ret == -2)
if(ret == -1) return -1;
exit();
if(ret == -2) exit();
//------------------ 1: Executable check -----------------------------------
// if cpu reaches its maximum control, abort
if(total_prog_count >= MAX_PROCESS)
{
printf("[execute] Reached maximum number of processes %d\n", MAX_PROCESS);
......@@ -153,20 +134,19 @@ int32_t execute(const uint8_t* command)
{
return -1;
}
// if not an executable file
if ( (buf[0] != AS_DEL) || (buf[1] != AS_E) || (buf[2] != AS_L) || (buf[3] != AS_F) )
{
return -1;
}
// Get free PID index
// Get a new pid
pid = set_pid();
/* Test variables */
total_prog_count++;
terminal[running_terminal].terminal_prog_count++;
//get entry point from bytes 24 to 27 in exe file
read_data( dentry.inode_index, ENTRY_POINT, buf, 4);
entry_point = *((uint32_t*)buf);
//-------------------- 3: Paging -------------------------------------------
......@@ -215,16 +195,7 @@ int32_t execute(const uint8_t* command)
if(strncmp("shell", (int8_t *) parsed_cmd, 5) == 0)
terminal[running_terminal].pcb->shell_flag = 1;
//printf("[EXE] using pcb = %x\n", terminal[running_terminal].pcb);
//printf("[EXE] set pcb ebp to %x , esp to %x\n", terminal[running_terminal].pcb->current_ebp, terminal[running_terminal].pcb->current_esp);
//printf("[EXE] should be ebp %x , esp %x\n", temp_ebp, temp_esp);
//--------------------- 6: scheduling initilization -----------------------
//--------------------- 7: context switch-----------------------------------
//--------------------- 6: context switch-----------------------------------
// update SS0 and ESP0 in Task State Segment when switching context
tss.ss0 = KERNEL_DS;
......@@ -308,8 +279,6 @@ int32_t write (int32_t fd, const void* buf, int32_t nbytes){
int32_t ret;
//printf("[sys write] before = %d\n", running_terminal);
if (fd_check(fd) < 0 || fd == STDIN_FD) return -1; // invalid fd
if (buf == NULL) return -1; // invalid buf
......@@ -318,8 +287,6 @@ int32_t write (int32_t fd, const void* buf, int32_t nbytes){
ret = terminal[running_terminal].pcb->fd[fd].fileop_ptr.write(fd, buf, nbytes);
//printf("[sys write] after = %d\n", running_terminal);
return ret;
}
......@@ -339,41 +306,38 @@ int32_t open (const uint8_t* filename){
int i;
int fd = -1;
int type;
dentry_t dentry;
//terminal[ running_terminal].pcb = current_pcb();
/* Valid file name check */
// invalid file name
if( strlen( (char*)filename ) == 0 ) return -1;
/* File does not exist */
if( read_dentry_by_name(filename, &(dentry)) != 0 ) return -1;
/* File type checks */
type = dentry.file_type;
if( type < 0 || type > 2) return -1;
if( dentry.file_type < 0 || dentry.file_type > 2) return -1;
/* Looking for available space in FD table */
for(i = USER_FILE_START; i < MAX_FILE_NUM; i++){
/* Check if FD table entry is unused */
// if we can find a free fd
if( terminal[ running_terminal].pcb->fd[i].flags == 0)
{
fd = i;
break;
}
/* FD table is full */
// no free fd
if(i == MAX_FILE_NUM-1) return -1;
}
terminal[ running_terminal].pcb->fd[fd].inode_index = (type == 2)? dentry.inode_index : 0;
terminal[ running_terminal].pcb->fd[fd].file_pos = 0;
terminal[ running_terminal].pcb->fd[fd].flags = 1;
// only regular file has inode, for other file types, set inode to 0
terminal[running_terminal].pcb->fd[fd].inode_index = (dentry.file_type == 2)? dentry.inode_index : 0;
terminal[running_terminal].pcb->fd[fd].file_pos = 0;
terminal[running_terminal].pcb->fd[fd].flags = 1;
switch (type) {
// insert file specific operation table
switch (dentry.file_type) {
case 0:
terminal[ running_terminal].pcb->fd[fd].fileop_ptr = rtc_jumptable;
break;
......@@ -385,9 +349,7 @@ int32_t open (const uint8_t* filename){
break;
}
//sti();
terminal[running_terminal].pcb->fd[fd].fileop_ptr.open(filename);
terminal[running_terminal].pcb->fd[fd].fileop_ptr.open(filename);
return fd;
}
......@@ -408,8 +370,10 @@ int32_t open (const uint8_t* filename){
*/
int32_t close (int32_t fd)
{
// invalid fd
if(fd_check(fd) < 0 || fd < USER_FILE_START)
return -1; // invalid fd
return -1;
terminal[running_terminal].pcb->fd[fd].fileop_ptr.close(fd);
......@@ -437,25 +401,19 @@ int32_t getargs (uint8_t* buf, int32_t nbytes){
uint8_t* argument;
//terminal[ running_terminal].pcb = current_pcb();
argument = (uint8_t*) (terminal[running_terminal].pcb->argv);
if( terminal[running_terminal].pcb->arg_num == 0 || nbytes <= 0 )
//If there are no arguments
if ( terminal[running_terminal].pcb->arg_num == 0 || nbytes <= 0 )
{
//printf("[getargs] return -1\n");
return -1; //If there are no arguments
return -1;
}
//if the arguments and a terminal NULL (0-byte) do not fit in the buffer.
// if the arguments and a terminal NULL (0-byte) do not fit in the buffer.
nbytes = (nbytes > MAX_ARGUMENT_SIZE * MAX_ARGUMENT_NUM) ? MAX_ARGUMENT_SIZE * MAX_ARGUMENT_NUM : nbytes;
memcpy(buf, argument, nbytes);
// uint32_t i;
// //printf("[getargs] argument number = %d\n", terminal[ running_terminal].pcb->arg_num);
// for(i = 0; i < terminal[ running_terminal].pcb->arg_num; i++)
// //printf("[getargs] buf[%d] = %s\n", i, buf+i*MAX_ARGUMENT_SIZE);
//printf("[getargs] return 0\n");
return 0;
}
......@@ -467,7 +425,7 @@ int32_t getargs (uint8_t* buf, int32_t nbytes){
* Although the address returned is always the same, it should be written into the memory
* location provided by the caller (which must be checked for validity).
*
* INPUT: screen_start --
* INPUT: screen_start
*
* RETURN: -1 If the location is invalid.
*
......@@ -492,7 +450,7 @@ int32_t vidmap (uint8_t** screen_start)
remap_vidmem();
*screen_start = (uint8_t *)(0x8400000);
*screen_start = (uint8_t *)(0x8400000); // 132MB, video memory starting address
return 0x8400000;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment