Example #1
0
File: kos.c Project: cbia4/KOS
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();
}
Example #2
0
// 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;
}
Example #3
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;
  
}