fix usertests to pass all the riscv-sol-fall20 solutions.
This commit is contained in:
		
							parent
							
								
									0bb2533f73
								
							
						
					
					
						commit
						0b4e78f3a9
					
				
					 1 changed files with 98 additions and 23 deletions
				
			
		
							
								
								
									
										121
									
								
								user/usertests.c
									
										
									
									
									
								
							
							
						
						
									
										121
									
								
								user/usertests.c
									
										
									
									
									
								
							| 
						 | 
					@ -997,6 +997,11 @@ mem(char *s)
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    int xstatus;
 | 
					    int xstatus;
 | 
				
			||||||
    wait(&xstatus);
 | 
					    wait(&xstatus);
 | 
				
			||||||
 | 
					    if(xstatus == -1){
 | 
				
			||||||
 | 
					      // probably page fault, so might be lazy lab,
 | 
				
			||||||
 | 
					      // so OK.
 | 
				
			||||||
 | 
					      exit(0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    exit(xstatus);
 | 
					    exit(xstatus);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1955,9 +1960,31 @@ sbrkbasic(char *s)
 | 
				
			||||||
  char *c, *a, *b;
 | 
					  char *c, *a, *b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // does sbrk() return the expected failure value?
 | 
					  // does sbrk() return the expected failure value?
 | 
				
			||||||
  a = sbrk(TOOMUCH);
 | 
					  pid = fork();
 | 
				
			||||||
  if(a != (char*)0xffffffffffffffffL){
 | 
					  if(pid < 0){
 | 
				
			||||||
    printf("%s: sbrk(<toomuch>) returned %p\n", a);
 | 
					    printf("fork failed in sbrkbasic\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if(pid == 0){
 | 
				
			||||||
 | 
					    a = sbrk(TOOMUCH);
 | 
				
			||||||
 | 
					    if(a == (char*)0xffffffffffffffffL){
 | 
				
			||||||
 | 
					      // it's OK if this fails.
 | 
				
			||||||
 | 
					      exit(0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for(b = a; b < a+TOOMUCH; b += 4096){
 | 
				
			||||||
 | 
					      *b = 99;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // we should not get here! either sbrk(TOOMUCH)
 | 
				
			||||||
 | 
					    // should have failed, or (with lazy allocation)
 | 
				
			||||||
 | 
					    // a pagefault should have killed this process.
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wait(&xstatus);
 | 
				
			||||||
 | 
					  if(xstatus == 1){
 | 
				
			||||||
 | 
					    printf("%s: too much memory allocated!\n", s);
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2093,12 +2120,7 @@ sbrkfail(char *s)
 | 
				
			||||||
  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
 | 
					  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
 | 
				
			||||||
    if((pids[i] = fork()) == 0){
 | 
					    if((pids[i] = fork()) == 0){
 | 
				
			||||||
      // allocate a lot of memory
 | 
					      // allocate a lot of memory
 | 
				
			||||||
      char *p0 = sbrk(BIG - (uint64)sbrk(0));
 | 
					      sbrk(BIG - (uint64)sbrk(0));
 | 
				
			||||||
      if((uint64)p0 != 0xffffffffffffffffLL){
 | 
					 | 
				
			||||||
        char *p1 = sbrk(0);
 | 
					 | 
				
			||||||
        for(char *p2 = p0; p2 < p1; p2 += 4096)
 | 
					 | 
				
			||||||
          *p2 = 1;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      write(fds[1], "x", 1);
 | 
					      write(fds[1], "x", 1);
 | 
				
			||||||
      // sit around until killed
 | 
					      // sit around until killed
 | 
				
			||||||
      for(;;) sleep(1000);
 | 
					      for(;;) sleep(1000);
 | 
				
			||||||
| 
						 | 
					@ -2128,18 +2150,22 @@ sbrkfail(char *s)
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if(pid == 0){
 | 
					  if(pid == 0){
 | 
				
			||||||
    // allocate a lot of memory
 | 
					    // allocate a lot of memory.
 | 
				
			||||||
 | 
					    // this should produce a page fault,
 | 
				
			||||||
 | 
					    // and thus not complete.
 | 
				
			||||||
    a = sbrk(0);
 | 
					    a = sbrk(0);
 | 
				
			||||||
    sbrk(10*BIG);
 | 
					    sbrk(10*BIG);
 | 
				
			||||||
    int n = 0;
 | 
					    int n = 0;
 | 
				
			||||||
    for (i = 0; i < 10*BIG; i += PGSIZE) {
 | 
					    for (i = 0; i < 10*BIG; i += PGSIZE) {
 | 
				
			||||||
      n += *(a+i);
 | 
					      n += *(a+i);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // print n so the compiler doesn't optimize away
 | 
				
			||||||
 | 
					    // the for loop.
 | 
				
			||||||
    printf("%s: allocate a lot of memory succeeded %d\n", n);
 | 
					    printf("%s: allocate a lot of memory succeeded %d\n", n);
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  wait(&xstatus);
 | 
					  wait(&xstatus);
 | 
				
			||||||
  if(xstatus != -1)
 | 
					  if(xstatus != -1 && xstatus != 2)
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2502,23 +2528,67 @@ execout(char *s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// use sbrk() to count how many free physical memory pages there are.
 | 
					// use sbrk() to count how many free physical memory pages there are.
 | 
				
			||||||
 | 
					// touches the pages to force allocation.
 | 
				
			||||||
 | 
					// because out of memory with lazy allocation results in the process
 | 
				
			||||||
 | 
					// taking a fault and being killed, fork and report back.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
countfree()
 | 
					countfree()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  uint64 sz0 = (uint64)sbrk(0);
 | 
					  int fds[2];
 | 
				
			||||||
  int n = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while(1){
 | 
					  if(pipe(fds) < 0){
 | 
				
			||||||
    uint64 a = (uint64) sbrk(4096);
 | 
					    printf("pipe() failed in countfree()\n");
 | 
				
			||||||
    if(a == 0xffffffffffffffff){
 | 
					    exit(1);
 | 
				
			||||||
      break;
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  int pid = fork();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(pid < 0){
 | 
				
			||||||
 | 
					    printf("fork failed in countfree()\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(pid == 0){
 | 
				
			||||||
 | 
					    close(fds[0]);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    while(1){
 | 
				
			||||||
 | 
					      uint64 a = (uint64) sbrk(4096);
 | 
				
			||||||
 | 
					      if(a == 0xffffffffffffffff){
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // modify the memory to make sure it's really allocated.
 | 
				
			||||||
 | 
					      *(char *)(a + 4096 - 1) = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // report back one more page.
 | 
				
			||||||
 | 
					      if(write(fds[1], "x", 1) != 1){
 | 
				
			||||||
 | 
					        printf("write() failed in countfree()\n");
 | 
				
			||||||
 | 
					        exit(1);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // modify the memory to make sure it's really allocated.
 | 
					
 | 
				
			||||||
    *(char *)(a + 4096 - 1) = 1;
 | 
					    exit(0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  close(fds[1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int n = 0;
 | 
				
			||||||
 | 
					  while(1){
 | 
				
			||||||
 | 
					    char c;
 | 
				
			||||||
 | 
					    int cc = read(fds[0], &c, 1);
 | 
				
			||||||
 | 
					    if(cc < 0){
 | 
				
			||||||
 | 
					      printf("read() failed in countfree()\n");
 | 
				
			||||||
 | 
					      exit(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(cc == 0)
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    n += 1;
 | 
					    n += 1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  sbrk(-((uint64)sbrk(0) - sz0));
 | 
					
 | 
				
			||||||
 | 
					  close(fds[0]);
 | 
				
			||||||
 | 
					  wait((int*)0);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  return n;
 | 
					  return n;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2645,7 +2715,7 @@ main(int argc, char *argv[])
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      int free1 = countfree();
 | 
					      int free1 = countfree();
 | 
				
			||||||
      if(free1 < free0){
 | 
					      if(free1 < free0){
 | 
				
			||||||
        printf("FAILED -- lost some free pages\n");
 | 
					        printf("FAILED -- lost %d free pages\n", free0 - free1);
 | 
				
			||||||
        if(continuous != 2)
 | 
					        if(continuous != 2)
 | 
				
			||||||
          exit(1);
 | 
					          exit(1);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -2653,7 +2723,12 @@ main(int argc, char *argv[])
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  printf("usertests starting\n");
 | 
					  printf("usertests starting\n");
 | 
				
			||||||
 | 
					#ifdef SOL_LAZY1
 | 
				
			||||||
 | 
					  int free0 = 32*1024*1024;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
  int free0 = countfree();
 | 
					  int free0 = countfree();
 | 
				
			||||||
 | 
					  int free1 = 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  int fail = 0;
 | 
					  int fail = 0;
 | 
				
			||||||
  for (struct test *t = tests; t->s != 0; t++) {
 | 
					  for (struct test *t = tests; t->s != 0; t++) {
 | 
				
			||||||
    if((justone == 0) || strcmp(t->s, justone) == 0) {
 | 
					    if((justone == 0) || strcmp(t->s, justone) == 0) {
 | 
				
			||||||
| 
						 | 
					@ -2665,8 +2740,8 @@ main(int argc, char *argv[])
 | 
				
			||||||
  if(fail){
 | 
					  if(fail){
 | 
				
			||||||
    printf("SOME TESTS FAILED\n");
 | 
					    printf("SOME TESTS FAILED\n");
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
  } else if(countfree() < free0){
 | 
					  } else if((free1 = countfree()) < free0){
 | 
				
			||||||
    printf("FAILED -- lost some free pages\n");
 | 
					    printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0);
 | 
				
			||||||
    exit(1);
 | 
					    exit(1);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    printf("ALL TESTS PASSED\n");
 | 
					    printf("ALL TESTS PASSED\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue