void initialize_user_process(char **kos_argv) { // zero out the memory bzero(main_memory, MemorySize); PCB *pcb = (PCB *) malloc(sizeof(PCB)); pcb_init(pcb); printf("filename: %s\n", kos_argv[0]); if (load_user_program(kos_argv[0]) < 0) { fprintf(stderr,"Can't load program.\n"); exit(1); } // set up the program counters and the stack register pcb->registers[PCReg] = 0; pcb->registers[NextPCReg] = 4; /* need to back off from top of memory */ /* 12 for argc, argv, envp */ /* 12 for stack frame */ pcb->registers[StackReg] = MemorySize - 24; dll_append(readyq, new_jval_v((void *) pcb)); printf("Running user code.\n"); kt_exit(); }
void *initialize_user_process(void *arg) { PCB *start = (PCB *) malloc(sizeof(PCB)); start->registers = (int *) malloc(NumTotalRegs * sizeof(int)); int i; for (i = 0; i < NumTotalRegs; i++) { start->registers[i] = 0; } int argc = 0; while (kos_argv[argc] != NULL) { argc++; } int tempCount = argc; int fIndex = 0; int ptr[argc]; int topOfStack = MemorySize - 20; while (tempCount != 0) { tempCount--; topOfStack -= strlen(kos_argv[fIndex]) + 1; ptr[tempCount] = topOfStack; strcpy(main_memory + topOfStack, kos_argv[fIndex]); fIndex++; } while (topOfStack % 4) { topOfStack--; } topOfStack -= 4; int machineAddress = WordToMachine(0); memcpy(main_memory + topOfStack, &machineAddress, 4); fIndex = 0; while (fIndex < argc) { topOfStack -= 4; machineAddress = WordToMachine(ptr[fIndex]); memcpy(main_memory + topOfStack, &machineAddress, 4); fIndex++; } int argv = topOfStack; // envp topOfStack -= 4; machineAddress = WordToMachine(0); memcpy(main_memory + topOfStack, &machineAddress, 4); // argv topOfStack -= 4; machineAddress = WordToMachine(argv); memcpy(main_memory + topOfStack, &machineAddress, 4); // argc topOfStack -= 4; machineAddress = WordToMachine(argc); memcpy(main_memory + topOfStack, &machineAddress, 4); if (load_user_program(kos_argv[0]) < 0) { fprintf(stderr, "Error: Unable to load user program.\n"); exit(1); } start->registers[StackReg] = topOfStack - 12; start->registers[PCReg] = 0; start->registers[NextPCReg] = 4; Jval j = new_jval_v((void *)start); dll_append(queue, j); kt_exit(); }
// loads the user program, sets the stack and the registers, and then returns zero int perform_execve(PCB *pcb, char *filename, char **kos_argv) { // printf("Enters perform_execve\n"); int argc = 0; int k, tos, index, memIndex, argv; int tempArgc; //use this to not change your original argc while(kos_argv[argc] != NULL) { // printf("This is kos_argv[%i]: %s\n", argc, kos_argv[argc]); argc++; } // User_Limit = pcb->user_base; //User_Base = pcb->user_limit; //printf("This is the argc: %i\n"); int tosPtr[argc]; //printf("This is the filename: %s\n", filename); //printf("This is User_Base in perform_execve before load user prog: %i\n", User_Base); // printf("This is User_Limit in perform_execve before load user prog: %i\n", User_Limit); int loadProg = load_user_program(kos_argv[0]); if (loadProg < 0) { fprintf(stderr,"Can't load program.\n"); exit(1); } pcb->brk = (int *)loadProg; tos = User_Limit-24; //CHANGED THIS TO -24 /* need to back off from top of memory */ /* 12 for argc, argv, envp */ /* 12 for stack frame */ //Put "plank" on top of the stack tempArgc= argc; //printf("This is tempArgc: %i\n",tempArgc); while (tempArgc!=0) { // printf("Goes into while loop\n"); tempArgc--; //printf("tos: %i\n", tos); // printf("strlen: %i\n", kos_argv[index]); tos -= (strlen(kos_argv[index])+1); // printf("tos : %i, tempArgc : %i\n",tos,tempArgc); tosPtr[tempArgc] = tos; //printf("next\n"); // printf("This is copying onto the stack[%i]: %s\n",main_memory+tos, strcpy(main_memory+tos, kos_argv[index])); strcpy(main_memory+tos+pcb->user_base, kos_argv[index]); index++; } //align the stack ptr while (tos%4) { tos--; } //place NULL terminated ptr before anything else! tos -= 4; k = WordToMachine(0); memcpy(main_memory+tos+pcb->user_base, &k, 4); memIndex = 0; //now placinf ptrs while(memIndex < argc) { tos-= 4; k= WordToMachine(tosPtr[memIndex]); //printf("k: %i\n", k); // printf("This is memcpy[%i]: %c\n", main_memory+tos, memcpy(main_memory+tos, &k, 4)); memcpy(main_memory+tos+pcb->user_base, &k, 4); memIndex++; // PrintStack(pcb->registers[StackReg], pcb->user_base); } argv = tos; //printf("This is argv: %i\n", argv); //Finally place in envp, argv, argc tos -= 4; k= WordToMachine(0); memcpy(main_memory+tos+pcb->user_base, &k, 4); tos -= 4; k= WordToMachine(argv); memcpy(main_memory+tos+pcb->user_base, &k, 4); tos -= 4; k= WordToMachine(argc); memcpy(main_memory+tos+pcb->user_base, &k, 4); pcb->registers[StackReg] = tos -12; // printf("Ending perform_execve\n"); // PrintStack(pcb->registers[StackReg], pcb->user_base); return 0; }
// Loads user program, sets stack and registers // Returns 0 on success, else errno. int perform_execve(PCB *job, char *fn, char **argv_param) { int machine_address; int stack_top, index, count; int program_value; int argv, argc; machine_address = 0; stack_top = 0; index = 0; argv = 0; // Get number of arguments and argv from params argc = 0; while( argv_param[argc] != NULL ) { argc++; } int ptr[argc]; count = argc; User_Base = job->base; User_Limit = job->limit; // Load program program_value = load_user_program(argv_param[0]); if (program_value < 0) { fprintf(stderr, "ERROR: Can't load program into memory.\n"); do_exit((void *)job); } stack_top = job->limit - 24; job->brk = (int *) program_value; while(count != 0) { count--; stack_top -= (strlen(argv_param[index]) + 1); ptr[count] = stack_top; strcpy(main_memory + stack_top + job->base, argv_param[index]); index++; } index = 0; while(stack_top % 4) { stack_top--; } stack_top -= 4; machine_address = WordToMachine(0); memcpy(main_memory + stack_top + job->base, &machine_address, 4); while(index < argc) { stack_top -= 4; machine_address = WordToMachine(ptr[index]); memcpy(main_memory + stack_top + job->base, &machine_address, 4); index++; } // Get argv argv = stack_top; /* Back off from top of memory */ // 12 for argc, argv, envp stack_top -= 4; machine_address = WordToMachine(0); //envp memcpy(main_memory + stack_top + job->base, &machine_address, 4); stack_top -= 4; machine_address = WordToMachine(argv); // argv memcpy(main_memory + stack_top + job->base, &machine_address, 4); stack_top -= 4; machine_address = WordToMachine(argc); // argc memcpy(main_memory + stack_top + job->base, &machine_address, 4); // 12 for stack frame job->registers[StackReg] = stack_top - 12; return 1; }