tell gcc to check printf format strings
add %ld %lld %u %lu %llu %lx %llx to kernel and user printf
This commit is contained in:
		
							parent
							
								
									2b552503c0
								
							
						
					
					
						commit
						dd2574bc10
					
				
					 8 changed files with 150 additions and 56 deletions
				
			
		
							
								
								
									
										9
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										9
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -59,7 +59,14 @@ OBJDUMP = $(TOOLPREFIX)objdump
 | 
			
		|||
CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2
 | 
			
		||||
CFLAGS += -MD
 | 
			
		||||
CFLAGS += -mcmodel=medany
 | 
			
		||||
CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
 | 
			
		||||
# CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
 | 
			
		||||
CFLAGS += -fno-common -nostdlib -mno-relax
 | 
			
		||||
CFLAGS += -fno-builtin-strncpy -fno-builtin-strncmp -fno-builtin-strlen -fno-builtin-memset
 | 
			
		||||
CFLAGS += -fno-builtin-memmove -fno-builtin-memcmp -fno-builtin-log -fno-builtin-bzero
 | 
			
		||||
CFLAGS += -fno-builtin-strchr -fno-builtin-exit -fno-builtin-malloc -fno-builtin-putc
 | 
			
		||||
CFLAGS += -fno-builtin-free
 | 
			
		||||
CFLAGS += -fno-builtin-memcpy -Wno-main
 | 
			
		||||
CFLAGS += -fno-builtin-printf -fno-builtin-fprintf -fno-builtin-vprintf
 | 
			
		||||
CFLAGS += -I.
 | 
			
		||||
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,7 +77,7 @@ int             piperead(struct pipe*, uint64, int);
 | 
			
		|||
int             pipewrite(struct pipe*, uint64, int);
 | 
			
		||||
 | 
			
		||||
// printf.c
 | 
			
		||||
void            printf(char*, ...);
 | 
			
		||||
int            printf(char*, ...) __attribute__ ((format (printf, 1, 2)));
 | 
			
		||||
void            panic(char*) __attribute__((noreturn));
 | 
			
		||||
void            printfinit(void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,13 +26,13 @@ static struct {
 | 
			
		|||
static char digits[] = "0123456789abcdef";
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
printint(int xx, int base, int sign)
 | 
			
		||||
printint(long long xx, int base, int sign)
 | 
			
		||||
{
 | 
			
		||||
  char buf[16];
 | 
			
		||||
  int i;
 | 
			
		||||
  uint x;
 | 
			
		||||
  unsigned long long x;
 | 
			
		||||
 | 
			
		||||
  if(sign && (sign = xx < 0))
 | 
			
		||||
  if(sign && (sign = (xx < 0)))
 | 
			
		||||
    x = -xx;
 | 
			
		||||
  else
 | 
			
		||||
    x = xx;
 | 
			
		||||
| 
						 | 
				
			
			@ -59,30 +59,71 @@ printptr(uint64 x)
 | 
			
		|||
    consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Print to the console. only understands %d, %x, %p, %s.
 | 
			
		||||
void
 | 
			
		||||
// Print to the console.
 | 
			
		||||
int
 | 
			
		||||
printf(char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
  va_list ap;
 | 
			
		||||
  int i, c, locking;
 | 
			
		||||
  int i, cx, c0, c1, c2, locking;
 | 
			
		||||
  char *s;
 | 
			
		||||
 | 
			
		||||
  locking = pr.locking;
 | 
			
		||||
  if(locking)
 | 
			
		||||
    acquire(&pr.lock);
 | 
			
		||||
 | 
			
		||||
  if (fmt == 0)
 | 
			
		||||
    panic("null fmt");
 | 
			
		||||
 | 
			
		||||
  va_start(ap, fmt);
 | 
			
		||||
  for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
 | 
			
		||||
    if(c != '%'){
 | 
			
		||||
      consputc(c);
 | 
			
		||||
  for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){
 | 
			
		||||
    if(cx != '%'){
 | 
			
		||||
      consputc(cx);
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    c = fmt[++i] & 0xff;
 | 
			
		||||
    if(c == 0)
 | 
			
		||||
    i++;
 | 
			
		||||
    c0 = fmt[i+0] & 0xff;
 | 
			
		||||
    c1 = c2 = 0;
 | 
			
		||||
    if(c0) c1 = fmt[i+1] & 0xff;
 | 
			
		||||
    if(c1) c2 = fmt[i+2] & 0xff;
 | 
			
		||||
    if(c0 == 'd'){
 | 
			
		||||
      printint(va_arg(ap, int), 10, 1);
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'd'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 10, 1);
 | 
			
		||||
      i += 1;
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 10, 1);
 | 
			
		||||
      i += 2;
 | 
			
		||||
    } else if(c0 == 'u'){
 | 
			
		||||
      printint(va_arg(ap, int), 10, 0);
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'u'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 10, 0);
 | 
			
		||||
      i += 1;
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 10, 0);
 | 
			
		||||
      i += 2;
 | 
			
		||||
    } else if(c0 == 'x'){
 | 
			
		||||
      printint(va_arg(ap, int), 16, 0);
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'x'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 16, 0);
 | 
			
		||||
      i += 1;
 | 
			
		||||
    } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
 | 
			
		||||
      printint(va_arg(ap, uint64), 16, 0);
 | 
			
		||||
      i += 2;
 | 
			
		||||
    } else if(c0 == 'p'){
 | 
			
		||||
      printptr(va_arg(ap, uint64));
 | 
			
		||||
    } else if(c0 == 's'){
 | 
			
		||||
      if((s = va_arg(ap, char*)) == 0)
 | 
			
		||||
        s = "(null)";
 | 
			
		||||
      for(; *s; s++)
 | 
			
		||||
        consputc(*s);
 | 
			
		||||
    } else if(c0 == '%'){
 | 
			
		||||
      consputc('%');
 | 
			
		||||
    } else if(c0 == 0){
 | 
			
		||||
      break;
 | 
			
		||||
    } else {
 | 
			
		||||
      // Print unknown % sequence to draw attention.
 | 
			
		||||
      consputc('%');
 | 
			
		||||
      consputc(c0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    switch(c){
 | 
			
		||||
    case 'd':
 | 
			
		||||
      printint(va_arg(ap, int), 10, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -108,11 +149,14 @@ printf(char *fmt, ...)
 | 
			
		|||
      consputc(c);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
  va_end(ap);
 | 
			
		||||
 | 
			
		||||
  if(locking)
 | 
			
		||||
    release(&pr.lock);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +164,7 @@ panic(char *s)
 | 
			
		|||
{
 | 
			
		||||
  pr.locking = 0;
 | 
			
		||||
  printf("panic: ");
 | 
			
		||||
  printf(s);
 | 
			
		||||
  printf("\n");
 | 
			
		||||
  printf("%s\n", s);
 | 
			
		||||
  panicked = 1; // freeze uart output from other CPUs
 | 
			
		||||
  for(;;)
 | 
			
		||||
    ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,8 +68,8 @@ usertrap(void)
 | 
			
		|||
  } else if((which_dev = devintr()) != 0){
 | 
			
		||||
    // ok
 | 
			
		||||
  } else {
 | 
			
		||||
    printf("usertrap(): unexpected scause %p pid=%d\n", r_scause(), p->pid);
 | 
			
		||||
    printf("            sepc=%p stval=%p\n", r_sepc(), r_stval());
 | 
			
		||||
    printf("usertrap(): unexpected scause %lx pid=%d\n", r_scause(), p->pid);
 | 
			
		||||
    printf("            sepc=%lx stval=%lx\n", r_sepc(), r_stval());
 | 
			
		||||
    setkilled(p);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -145,8 +145,8 @@ kerneltrap()
 | 
			
		|||
    panic("kerneltrap: interrupts enabled");
 | 
			
		||||
 | 
			
		||||
  if((which_dev = devintr()) == 0){
 | 
			
		||||
    printf("scause %p\n", scause);
 | 
			
		||||
    printf("sepc=%p stval=%p\n", r_sepc(), r_stval());
 | 
			
		||||
    printf("scause %lx\n", scause);
 | 
			
		||||
    printf("sepc=%lx stval=%lx\n", r_sepc(), r_stval());
 | 
			
		||||
    panic("kerneltrap");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ ls(char *path)
 | 
			
		|||
  switch(st.type){
 | 
			
		||||
  case T_DEVICE:
 | 
			
		||||
  case T_FILE:
 | 
			
		||||
    printf("%s %d %d %l\n", fmtname(path), st.type, st.ino, st.size);
 | 
			
		||||
    printf("%s %d %d %d\n", fmtname(path), st.type, st.ino, (int) st.size);
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case T_DIR:
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ ls(char *path)
 | 
			
		|||
        printf("ls: cannot stat %s\n", buf);
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
 | 
			
		||||
      printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,18 +52,61 @@ void
 | 
			
		|||
vprintf(int fd, const char *fmt, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
  char *s;
 | 
			
		||||
  int c, i, state;
 | 
			
		||||
  int c0, c1, c2, i, state;
 | 
			
		||||
 | 
			
		||||
  state = 0;
 | 
			
		||||
  for(i = 0; fmt[i]; i++){
 | 
			
		||||
    c = fmt[i] & 0xff;
 | 
			
		||||
    c0 = fmt[i] & 0xff;
 | 
			
		||||
    if(state == 0){
 | 
			
		||||
      if(c == '%'){
 | 
			
		||||
      if(c0 == '%'){
 | 
			
		||||
        state = '%';
 | 
			
		||||
      } else {
 | 
			
		||||
        putc(fd, c);
 | 
			
		||||
        putc(fd, c0);
 | 
			
		||||
      }
 | 
			
		||||
    } else if(state == '%'){
 | 
			
		||||
      c1 = c2 = 0;
 | 
			
		||||
      if(c0) c1 = fmt[i+1] & 0xff;
 | 
			
		||||
      if(c1) c2 = fmt[i+2] & 0xff;
 | 
			
		||||
      if(c0 == 'd'){
 | 
			
		||||
        printint(fd, va_arg(ap, int), 10, 1);
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'd'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 10, 1);
 | 
			
		||||
        i += 1;
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 10, 1);
 | 
			
		||||
        i += 2;
 | 
			
		||||
      } else if(c0 == 'u'){
 | 
			
		||||
        printint(fd, va_arg(ap, int), 10, 0);
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'u'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 10, 0);
 | 
			
		||||
        i += 1;
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 10, 0);
 | 
			
		||||
        i += 2;
 | 
			
		||||
      } else if(c0 == 'x'){
 | 
			
		||||
        printint(fd, va_arg(ap, int), 16, 0);
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'x'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 16, 0);
 | 
			
		||||
        i += 1;
 | 
			
		||||
      } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
 | 
			
		||||
        printint(fd, va_arg(ap, uint64), 16, 0);
 | 
			
		||||
        i += 2;
 | 
			
		||||
      } else if(c0 == 'p'){
 | 
			
		||||
        printptr(fd, va_arg(ap, uint64));
 | 
			
		||||
      } else if(c0 == 's'){
 | 
			
		||||
        if((s = va_arg(ap, char*)) == 0)
 | 
			
		||||
          s = "(null)";
 | 
			
		||||
        for(; *s; s++)
 | 
			
		||||
          putc(fd, *s);
 | 
			
		||||
      } else if(c0 == '%'){
 | 
			
		||||
        putc(fd, '%');
 | 
			
		||||
      } else {
 | 
			
		||||
        // Unknown % sequence.  Print it to draw attention.
 | 
			
		||||
        putc(fd, '%');
 | 
			
		||||
        putc(fd, c0);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
      if(c == 'd'){
 | 
			
		||||
        printint(fd, va_arg(ap, int), 10, 1);
 | 
			
		||||
      } else if(c == 'l') {
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +132,7 @@ vprintf(int fd, const char *fmt, va_list ap)
 | 
			
		|||
        putc(fd, '%');
 | 
			
		||||
        putc(fd, c);
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
      state = 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,8 +29,8 @@ char* strcpy(char*, const char*);
 | 
			
		|||
void *memmove(void*, const void*, int);
 | 
			
		||||
char* strchr(const char*, char c);
 | 
			
		||||
int strcmp(const char*, const char*);
 | 
			
		||||
void fprintf(int, const char*, ...);
 | 
			
		||||
void printf(const char*, ...);
 | 
			
		||||
void fprintf(int, const char*, ...) __attribute__ ((format (printf, 2, 3)));
 | 
			
		||||
void printf(const char*, ...) __attribute__ ((format (printf, 1, 2)));
 | 
			
		||||
char* gets(char*, int max);
 | 
			
		||||
uint strlen(const char*);
 | 
			
		||||
void* memset(void*, int, uint);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ copyin(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    int n = write(fd, (void*)addr, 8192);
 | 
			
		||||
    if(n >= 0){
 | 
			
		||||
      printf("write(fd, %p, 8192) returned %d, not -1\n", addr, n);
 | 
			
		||||
      printf("write(fd, %p, 8192) returned %d, not -1\n", (void*)addr, n);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    close(fd);
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ copyin(char *s)
 | 
			
		|||
    
 | 
			
		||||
    n = write(1, (char*)addr, 8192);
 | 
			
		||||
    if(n > 0){
 | 
			
		||||
      printf("write(1, %p, 8192) returned %d, not -1 or 0\n", addr, n);
 | 
			
		||||
      printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ copyin(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    n = write(fds[1], (char*)addr, 8192);
 | 
			
		||||
    if(n > 0){
 | 
			
		||||
      printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
 | 
			
		||||
      printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    close(fds[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ copyout(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    int n = read(fd, (void*)addr, 8192);
 | 
			
		||||
    if(n > 0){
 | 
			
		||||
      printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", addr, n);
 | 
			
		||||
      printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    close(fd);
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ copyout(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    n = read(fds[0], (void*)addr, 8192);
 | 
			
		||||
    if(n > 0){
 | 
			
		||||
      printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
 | 
			
		||||
      printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    close(fds[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ copyinstr1(char *s)
 | 
			
		|||
 | 
			
		||||
    int fd = open((char *)addr, O_CREATE|O_WRONLY);
 | 
			
		||||
    if(fd >= 0){
 | 
			
		||||
      printf("open(%p) returned %d, not -1\n", addr, fd);
 | 
			
		||||
      printf("open(%p) returned %d, not -1\n", (void*)addr, fd);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -264,7 +264,7 @@ rwsbrk()
 | 
			
		|||
  }
 | 
			
		||||
  n = write(fd, (void*)(a+4096), 1024);
 | 
			
		||||
  if(n >= 0){
 | 
			
		||||
    printf("write(fd, %p, 1024) returned %d, not -1\n", a+4096, n);
 | 
			
		||||
    printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+4096, n);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  close(fd);
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +277,7 @@ rwsbrk()
 | 
			
		|||
  }
 | 
			
		||||
  n = read(fd, (void*)(a+4096), 10);
 | 
			
		||||
  if(n >= 0){
 | 
			
		||||
    printf("read(fd, %p, 10) returned %d, not -1\n", a+4096, n);
 | 
			
		||||
    printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+4096, n);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  close(fd);
 | 
			
		||||
| 
						 | 
				
			
			@ -589,7 +589,7 @@ writebig(char *s)
 | 
			
		|||
  for(i = 0; i < MAXFILE; i++){
 | 
			
		||||
    ((int*)buf)[0] = i;
 | 
			
		||||
    if(write(fd, buf, BSIZE) != BSIZE){
 | 
			
		||||
      printf("%s: error: write big file failed\n", s, i);
 | 
			
		||||
      printf("%s: error: write big file failed i=%d\n", s, i);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -773,7 +773,7 @@ pipe1(char *s)
 | 
			
		|||
        cc = sizeof(buf);
 | 
			
		||||
    }
 | 
			
		||||
    if(total != N * SZ){
 | 
			
		||||
      printf("%s: pipe1 oops 3 total %d\n", total);
 | 
			
		||||
      printf("%s: pipe1 oops 3 total %d\n", s, total);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    close(fds[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -1069,7 +1069,7 @@ mem(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    m1 = malloc(1024*20);
 | 
			
		||||
    if(m1 == 0){
 | 
			
		||||
      printf("couldn't allocate mem?!!\n", s);
 | 
			
		||||
      printf("%s: couldn't allocate mem?!!\n", s);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    free(m1);
 | 
			
		||||
| 
						 | 
				
			
			@ -1161,14 +1161,14 @@ fourfiles(char *s)
 | 
			
		|||
 | 
			
		||||
    pid = fork();
 | 
			
		||||
    if(pid < 0){
 | 
			
		||||
      printf("fork failed\n", s);
 | 
			
		||||
      printf("%s: fork failed\n", s);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(pid == 0){
 | 
			
		||||
      fd = open(fname, O_CREATE | O_RDWR);
 | 
			
		||||
      if(fd < 0){
 | 
			
		||||
        printf("create failed\n", s);
 | 
			
		||||
        printf("%s: create failed\n", s);
 | 
			
		||||
        exit(1);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1197,7 +1197,7 @@ fourfiles(char *s)
 | 
			
		|||
    while((n = read(fd, buf, sizeof(buf))) > 0){
 | 
			
		||||
      for(j = 0; j < n; j++){
 | 
			
		||||
        if(buf[j] != '0'+i){
 | 
			
		||||
          printf("wrong char\n", s);
 | 
			
		||||
          printf("%s: wrong char\n", s);
 | 
			
		||||
          exit(1);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -1223,7 +1223,7 @@ createdelete(char *s)
 | 
			
		|||
  for(pi = 0; pi < NCHILD; pi++){
 | 
			
		||||
    pid = fork();
 | 
			
		||||
    if(pid < 0){
 | 
			
		||||
      printf("fork failed\n", s);
 | 
			
		||||
      printf("%s: fork failed\n", s);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1544,7 +1544,7 @@ subdir(char *s)
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  if(mkdir("/dd/dd") != 0){
 | 
			
		||||
    printf("subdir mkdir dd/dd failed\n", s);
 | 
			
		||||
    printf("%s: subdir mkdir dd/dd failed\n", s);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1569,7 +1569,7 @@ subdir(char *s)
 | 
			
		|||
  close(fd);
 | 
			
		||||
 | 
			
		||||
  if(link("dd/dd/ff", "dd/dd/ffff") != 0){
 | 
			
		||||
    printf("link dd/dd/ff dd/dd/ffff failed\n", s);
 | 
			
		||||
    printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1591,7 +1591,7 @@ subdir(char *s)
 | 
			
		|||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  if(chdir("dd/../../../dd") != 0){
 | 
			
		||||
    printf("chdir dd/../../dd failed\n", s);
 | 
			
		||||
    printf("%s: chdir dd/../../dd failed\n", s);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  if(chdir("./..") != 0){
 | 
			
		||||
| 
						 | 
				
			
			@ -2034,7 +2034,7 @@ sbrkbasic(char *s)
 | 
			
		|||
  for(i = 0; i < 5000; i++){
 | 
			
		||||
    b = sbrk(1);
 | 
			
		||||
    if(b != a){
 | 
			
		||||
      printf("%s: sbrk test failed %d %x %x\n", s, i, a, b);
 | 
			
		||||
      printf("%s: sbrk test failed %d %p %p\n", s, i, a, b);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    *b = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -2092,7 +2092,7 @@ sbrkmuch(char *s)
 | 
			
		|||
  }
 | 
			
		||||
  c = sbrk(0);
 | 
			
		||||
  if(c != a - PGSIZE){
 | 
			
		||||
    printf("%s: sbrk deallocation produced wrong address, a %x c %x\n", s, a, c);
 | 
			
		||||
    printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2100,7 +2100,7 @@ sbrkmuch(char *s)
 | 
			
		|||
  a = sbrk(0);
 | 
			
		||||
  c = sbrk(PGSIZE);
 | 
			
		||||
  if(c != a || sbrk(0) != a + PGSIZE){
 | 
			
		||||
    printf("%s: sbrk re-allocation failed, a %x c %x\n", s, a, c);
 | 
			
		||||
    printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  if(*lastaddr == 99){
 | 
			
		||||
| 
						 | 
				
			
			@ -2112,7 +2112,7 @@ sbrkmuch(char *s)
 | 
			
		|||
  a = sbrk(0);
 | 
			
		||||
  c = sbrk(-(sbrk(0) - oldbrk));
 | 
			
		||||
  if(c != a){
 | 
			
		||||
    printf("%s: sbrk downsize failed, a %x c %x\n", s, a, c);
 | 
			
		||||
    printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2131,7 +2131,7 @@ kernmem(char *s)
 | 
			
		|||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    if(pid == 0){
 | 
			
		||||
      printf("%s: oops could read %x = %x\n", s, a, *a);
 | 
			
		||||
      printf("%s: oops could read %p = %x\n", s, a, *a);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    int xstatus;
 | 
			
		||||
| 
						 | 
				
			
			@ -2155,7 +2155,7 @@ MAXVAplus(char *s)
 | 
			
		|||
    }
 | 
			
		||||
    if(pid == 0){
 | 
			
		||||
      *(char*)a = 99;
 | 
			
		||||
      printf("%s: oops wrote %x\n", s, a);
 | 
			
		||||
      printf("%s: oops wrote %p\n", s, (void*)a);
 | 
			
		||||
      exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    int xstatus;
 | 
			
		||||
| 
						 | 
				
			
			@ -2408,7 +2408,7 @@ stacktest(char *s)
 | 
			
		|||
    char *sp = (char *) r_sp();
 | 
			
		||||
    sp -= PGSIZE;
 | 
			
		||||
    // the *sp should cause a trap.
 | 
			
		||||
    printf("%s: stacktest: read below stack %p\n", s, *sp);
 | 
			
		||||
    printf("%s: stacktest: read below stack %d\n", s, *sp);
 | 
			
		||||
    exit(1);
 | 
			
		||||
  } else if(pid < 0){
 | 
			
		||||
    printf("%s: fork failed\n", s);
 | 
			
		||||
| 
						 | 
				
			
			@ -2868,7 +2868,7 @@ diskfull(char *s)
 | 
			
		|||
 | 
			
		||||
  // this mkdir() is expected to fail.
 | 
			
		||||
  if(mkdir("diskfulldir") == 0)
 | 
			
		||||
    printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n");
 | 
			
		||||
    printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s);
 | 
			
		||||
 | 
			
		||||
  unlink("diskfulldir");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue