Deputy turned on. YOU NEED TO UPDATE YOUR IVY
authorZach Anderson <zra@fortitude.(none)>
Fri, 27 Feb 2009 20:03:10 +0000 (12:03 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 27 Feb 2009 20:03:10 +0000 (12:03 -0800)
Compiles with --deputy now, with select files ignored with #pramga
nodeputy.  Most files are currently ignored, but this will allow
incremental deputization of the project.

24 files changed:
GNUmakefile
boot/main.c
ivylib/Makefrag [new file with mode: 0644]
ivylib/deputy_kern.c [new file with mode: 0644]
ivylib/deputy_user.c [new file with mode: 0644]
kern/env.c
kern/init.c
kern/kdebug.c
kern/monitor.c
kern/pmap.c
kern/syscall.c
kern/trap.c
lib/Makefrag
lib/printfmt.c
lib/readline.c
lib/string.c
user/Makefrag
user/buggyhello.c
user/evilhello.c
user/faultread.c
user/faultreadkernel.c
user/faultwrite.c
user/faultwritekernel.c
user/testbss.c

index be7a4ba..76cc457 100644 (file)
@@ -99,8 +99,9 @@ USER_CFLAGS := $(CFLAGS) -DJOS_USER -gstabs
 
 # Include Makefrags for subdirectories
 include boot/Makefrag
-include kern/Makefrag
 include lib/Makefrag
+include ivylib/Makefrag
+include kern/Makefrag
 include user/Makefrag
 
 
index 5a48ca3..a7cee69 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/x86.h>
 #include <inc/elf.h>
 
diff --git a/ivylib/Makefrag b/ivylib/Makefrag
new file mode 100644 (file)
index 0000000..bbeab02
--- /dev/null
@@ -0,0 +1,29 @@
+NATIVECC := ivycc
+
+OBJDIRS += ivylib
+
+IVYLIB_KERN_SRCFILES :=                ivylib/deputy_kern.c
+
+IVYLIB_USER_SRCFILES :=                ivylib/deputy_user.c
+
+IVYLIB_KERN_OBJFILES := $(patsubst ivylib/%.c, $(OBJDIR)/ivylib/%.o, $(IVYLIB_KERN_SRCFILES))
+IVYLIB_USER_OBJFILES := $(patsubst ivylib/%.c, $(OBJDIR)/ivylib/%.o, $(IVYLIB_USER_SRCFILES))
+
+
+$(OBJDIR)/ivylib/deputy_kern.o: ivylib/deputy_kern.c
+       @echo + cc[IVYLIB] $<
+       @mkdir -p $(@D)
+       $(NATIVECC) -nostdinc $(KERN_CFLAGS) -c -o $@ $<
+
+$(OBJDIR)/ivylib/deputy_user.o: ivylib/deputy_user.c
+       @echo + cc[IVYLIB] $<
+       @mkdir -p $(@D)
+       $(V)$(NATIVECC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
+
+$(OBJDIR)/ivylib/libivykern.a: $(IVYLIB_KERN_OBJFILES)
+       @echo + ar $@
+       $(AR) r $@ $(IVYLIB_KERN_OBJFILES)
+
+$(OBJDIR)/ivylib/libivyuser.a: $(IVYLIB_USER_OBJFILES)
+       @echo + ar $@
+       $(V)$(AR) r $@ $(IVYLIB_USER_OBJFILES)
diff --git a/ivylib/deputy_kern.c b/ivylib/deputy_kern.c
new file mode 100644 (file)
index 0000000..a637e79
--- /dev/null
@@ -0,0 +1,99 @@
+#include <inc/stdio.h>
+#include <inc/assert.h>
+#include <inc/string.h>
+
+#define IN_DEPUTY_LIBRARY
+
+// Use inline even when not optimizing for speed, since it prevents
+// warnings that would occur due to unused static functions.
+#ifdef DEPUTY_ALWAYS_STOP_ON_ERROR
+  #define INLINE inline __attribute__((always_inline))
+#else
+  #define INLINE inline
+#endif
+
+#define __LOCATION__        __FILE__, __LINE__, __FUNCTION__
+#define __LOCATION__FORMALS const char* file, int line, const char* func
+#define __LOCATION__ACTUALS file, line, func
+
+#ifndef asmlinkage
+#define asmlinkage __attribute__((regparm(0)))
+#endif
+
+#ifndef noreturn
+#define noreturn __attribute__((noreturn))
+#endif
+
+asmlinkage
+void deputy_fail_mayreturn(const char *check, const char *text,
+                           __LOCATION__FORMALS) {
+    cprintf("%s:%d: %s: Assertion failed in %s: %s\n",
+            __LOCATION__ACTUALS, check, text);
+/*
+    dump_stack();
+*/
+}
+
+asmlinkage noreturn
+void deputy_fail_noreturn_fast(void) {
+    panic("Deputy assertion failure\n");
+}
+
+int deputy_strlen(const char *str) {
+    return strlen(str);
+}
+
+char *deputy_strcpy(char *dest, const char *src) {
+    char *tmp = dest;
+    while ((*dest++ = *src++) != '\0') {
+        // do nothing
+    }
+    return tmp;
+}
+
+char *deputy_strncpy(char *dest, const char *src, size_t count) {
+    char *tmp = dest;
+    int c = count;
+    while (c >= 0) {
+        if ((*tmp = *src) != 0) src++;
+        tmp++;
+        c--;
+    }
+    return dest;
+}
+
+/* Search for a NULL starting at e and return its index */
+int deputy_findnull(const void *e, unsigned int bytes) {
+#define NULLCHECK(type) \
+    do { \
+        type *p = (type*) e; \
+        while (*p != 0) { \
+            p++; \
+        } \
+        length = (p - (type*) e); \
+    } while (0)
+
+    int length = 0;
+
+    switch (bytes) {
+        case 1:
+            NULLCHECK(char);
+            break;
+        case 2:
+            NULLCHECK(short);
+            break;
+        case 4:
+            NULLCHECK(long);
+            break;
+        default:
+            cprintf("Invalid byte size for nullcheck.\n");
+            break;
+    }
+
+    return length;
+#undef NULLCHECK
+}
+
+void *__deputy_memset(void *s, int c, unsigned int n) {
+  return memset(s, c, n);
+}
diff --git a/ivylib/deputy_user.c b/ivylib/deputy_user.c
new file mode 100644 (file)
index 0000000..609252b
--- /dev/null
@@ -0,0 +1,170 @@
+#include <inc/stdio.h>
+#include <inc/string.h>
+#include <inc/lib.h>
+
+// Use inline even when not optimizing for speed, since it prevents
+// warnings that would occur due to unused static functions.
+#ifdef DEPUTY_ALWAYS_STOP_ON_ERROR
+  #define INLINE inline __attribute__((always_inline))
+#else
+  #define INLINE inline
+#endif
+
+#define __LOCATION__        __FILE__, __LINE__, __FUNCTION__
+#define __LOCATION__FORMALS const char* file, int line, const char* func
+#define __LOCATION__ACTUALS file, line, func
+
+#ifndef asmlinkage
+#define asmlinkage __attribute__((regparm(0)))
+#endif
+
+#ifndef noreturn
+#define noreturn __attribute__((noreturn))
+#endif
+
+#define IN_DEPUTY_LIBRARY
+
+#include "deputy/checks.h"
+
+// If Deputy fails, it checks to see if you have specified special handling
+// for failed checks.
+enum handlerKind {
+    HANDLE_DEFAULT, // no handler specified
+    HANDLE_IGNORE,  // ignore
+    HANDLE_STOP,    // warn and stop
+    HANDLE_WARN,    // warn but do not stop
+    HANDLE_SLEEP,   // sleep and wait for the the debugger
+};
+
+static enum handlerKind deputyErrorHandler = HANDLE_DEFAULT;
+
+static int deputyInited = 0;
+static void deputyInitOnFirstFailure(void) {
+    // Cache the result of environment lookup
+    //char *onerror = getenv("DEPUTY_ONERROR");
+    deputyErrorHandler = HANDLE_DEFAULT;
+/*
+    if (onerror) {
+        if (!strcasecmp(onerror, "stop")) {
+            deputyErrorHandler = HANDLE_STOP;
+        } else if (!strcasecmp(onerror, "ignore")) {
+            deputyErrorHandler = HANDLE_IGNORE;
+        } else if (!strcasecmp(onerror, "warn")) {
+            deputyErrorHandler = HANDLE_WARN;
+        } else if (!strcasecmp(onerror, "sleep")) {
+            deputyErrorHandler = HANDLE_SLEEP;
+        } else {
+            fprintf(stderr, "Unexpected value for env var DEPUTY_ONERROR\n");
+        }
+    }
+*/
+}
+
+// This function is called directly from the checks unless the code was
+// compiled with --deputyAlwaysStopOnError . It is also called from
+// deputy_fail_noreturn to do the real work.
+asmlinkage
+void deputy_fail_mayreturn(const char *check, const char *text,
+                           __LOCATION__FORMALS) {
+    if (!deputyInited) {
+        deputyInitOnFirstFailure(); deputyInited = 1;
+    }
+    if (deputyErrorHandler != HANDLE_IGNORE) {
+        cprintf("%s:%d: %s: Assertion failed in %s:\n  %s\n",
+                __LOCATION__ACTUALS, check, text);
+    }
+    // Now look whether we should return or not
+    switch (deputyErrorHandler) {
+        case HANDLE_DEFAULT:
+        case HANDLE_STOP:
+            cprintf("Execution aborted.\n");
+            exit(/*1*/);
+#if 0
+        case HANDLE_SLEEP:
+#if defined(_MSVC)
+            // On Windows, this will fire the just-in-time debugger.
+            _asm { int 3 }
+#else
+            // Pause for debugging multithreaded code.
+            // (Trick due to Ben Liblit, via Dan Wilkerson.)
+            {
+                volatile int stopped = 1;
+
+                fprintf(stderr, "Execution paused for debugging (pid = %d).\n",
+                        getpid());
+                fflush(stderr);
+
+                while (stopped) {
+                    // 1. Execution will stop here.
+                    sleep(1);
+                }
+
+                // 2. Set breakpoint here, and set stopped to 0.
+                // (This statement exists so we have a place to put
+                // that breakpoint.)
+                stopped ++;
+            }
+#endif
+            break;
+#endif /* 0 */
+        default:
+            break;
+    }
+}
+
+// This function must NOT return. This is the function that is called
+// by the checks if we compiled with --alwaysStopOnError
+asmlinkage noreturn
+void deputy_fail_noreturn(const char *check, const char *text,
+                          __LOCATION__FORMALS) {
+    deputy_fail_mayreturn(check, text, __LOCATION__ACTUALS);
+    cprintf("Deputy check failed; execution aborted.\n");
+    exit(/*1*/);
+}
+
+// This function must NOT return. This is the function that is called
+// by the checks if we compiled with --alwaysStopOnError and --deputyFastChecks
+asmlinkage noreturn
+void deputy_fail_noreturn_fast(void) {
+    cprintf("Deputy check failed; execution aborted.\n");
+    cprintf("Detailed error report suppressed (--deputyFastChecks).\n");
+    exit(/*1*/);
+}
+
+/* Search for a NULL starting at e and return its index */
+asmlinkage
+int deputy_findnull(const void *e, unsigned int bytes) {
+#define NULLCHECK(type) \
+    do { \
+        type *p = (type*) e; \
+        while (*p != 0) { \
+            p++; \
+        } \
+        length = (p - (type*) e); \
+    } while (0)
+
+    int length = 0;
+
+    switch (bytes) {
+        case 1:
+            NULLCHECK(char);
+            break;
+        case 2:
+            NULLCHECK(short);
+            break;
+        case 4:
+            NULLCHECK(long);
+            break;
+        default:
+           cprintf("Invalid byte size for nullcheck.\n");
+           exit(/*1*/);
+    }
+
+    return length;
+#undef NULLCHECK
+}
+
+asmlinkage
+void *__deputy_memset(void *s, int c, unsigned int n) {
+  return memset(s, c, n);
+}
index b800b16..7b0f698 100644 (file)
@@ -1,4 +1,7 @@
 /* See COPYRIGHT for copyright information. */
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
 
 #include <inc/x86.h>
 #include <inc/mmu.h>
index d574db2..406bf8d 100644 (file)
@@ -1,5 +1,9 @@
 /* See COPYRIGHT for copyright information. */
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/stdio.h>
 #include <inc/string.h>
 #include <inc/assert.h>
index cf08d89..6c77433 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/stab.h>
 #include <inc/string.h>
 #include <inc/memlayout.h>
index 7d2a918..365ecf5 100644 (file)
@@ -1,6 +1,10 @@
 // Simple command-line kernel monitor useful for
 // controlling the kernel and exploring the system interactively.
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/stdio.h>
 #include <inc/string.h>
 #include <inc/memlayout.h>
index 0c36b40..7064ef7 100644 (file)
@@ -1,4 +1,7 @@
 /* See COPYRIGHT for copyright information. */
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
 
 #include <inc/x86.h>
 #include <inc/mmu.h>
index ff4d85d..a9e2c93 100644 (file)
@@ -1,4 +1,7 @@
 /* See COPYRIGHT for copyright information. */
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
 
 #include <inc/x86.h>
 #include <inc/error.h>
index 3c168a9..cd44cb6 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/mmu.h>
 #include <inc/x86.h>
 #include <inc/assert.h>
index 60bf6f6..35ad63b 100644 (file)
@@ -1,3 +1,5 @@
+NATIVECC := ivycc
+
 OBJDIRS += lib
 
 LIB_SRCFILES :=                lib/console.c \
@@ -19,12 +21,12 @@ LIB_OBJFILES := $(patsubst lib/%.S, $(OBJDIR)/lib/%.o, $(LIB_OBJFILES))
 $(OBJDIR)/lib/%.o: lib/%.c
        @echo + cc[USER] $<
        @mkdir -p $(@D)
-       $(V)$(CC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
+       $(V)$(NATIVECC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
 
 $(OBJDIR)/lib/%.o: lib/%.S
        @echo + as[USER] $<
        @mkdir -p $(@D)
-       $(V)$(CC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
+       $(V)$(NATIVECC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
 
 $(OBJDIR)/lib/libjos.a: $(LIB_OBJFILES)
        @echo + ar $@
index d710799..1a6ec71 100644 (file)
@@ -2,6 +2,10 @@
 // used in common by printf, sprintf, fprintf, etc.
 // This code is also used by both the kernel and user programs.
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/types.h>
 #include <inc/stdio.h>
 #include <inc/string.h>
index 7c631bd..62f162f 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/stdio.h>
 #include <inc/error.h>
 
index d3818c8..b448d74 100644 (file)
@@ -1,5 +1,9 @@
 // Basic string routines.  Not hardware optimized, but not shabby.
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/string.h>
 
 int
index dc8f6a5..87f9763 100644 (file)
@@ -5,8 +5,8 @@ $(OBJDIR)/user/%.o: user/%.c
        @mkdir -p $(@D)
        $(V)$(CC) -nostdinc $(USER_CFLAGS) -c -o $@ $<
 
-$(OBJDIR)/user/%: $(OBJDIR)/user/%.o $(OBJDIR)/lib/entry.o $(OBJDIR)/lib/libjos.a user/user.ld
+$(OBJDIR)/user/%: $(OBJDIR)/ivylib/libivyuser.a $(OBJDIR)/user/%.o $(OBJDIR)/lib/entry.o $(OBJDIR)/lib/libjos.a user/user.ld
        @echo + ld $@
-       $(V)$(LD) -o $@ $(ULDFLAGS) $(LDFLAGS) -nostdlib $(OBJDIR)/lib/entry.o $@.o -L$(OBJDIR)/lib -ljos $(GCC_LIB)
+       $(V)$(LD) -o $@ $(ULDFLAGS) $(LDFLAGS) -nostdlib $(OBJDIR)/lib/entry.o $@.o -L$(OBJDIR)/ivylib -livyuser -L$(OBJDIR)/lib -ljos $(GCC_LIB)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
index bc9c6b9..412f2cd 100644 (file)
@@ -6,6 +6,6 @@
 void
 umain(void)
 {
-       sys_cputs((char*)1, 1);
+       sys_cputs((char*SAFE)TC(1), 1);
 }
 
index 6d6ce39..fd9486a 100644 (file)
@@ -7,6 +7,6 @@ void
 umain(void)
 {
        // try to print the kernel entry point as a string!  mua ha ha!
-       sys_cputs((char*)0xc0100020, 100);
+       sys_cputs((char*SAFE)TC(0xc0100020), 100);
 }
 
index d637e6c..017009e 100644 (file)
@@ -4,7 +4,7 @@
 
 void
 umain(void)
-{
+{ TRUSTEDBLOCK
        cprintf("I read %08x from location 0!\n", *(unsigned*)0);
 }
 
index 457235f..0d7620c 100644 (file)
@@ -4,7 +4,7 @@
 
 void
 umain(void)
-{
+{ TRUSTEDBLOCK
        cprintf("I read %08x from location 0xf0100000!\n", *(unsigned*)0xf0100000);
 }
 
index 3a628d5..a6792b3 100644 (file)
@@ -4,7 +4,7 @@
 
 void
 umain(void)
-{
+{ TRUSTEDBLOCK
        *(unsigned*)0 = 0;
 }
 
index 7e94206..476949e 100644 (file)
@@ -4,7 +4,7 @@
 
 void
 umain(void)
-{
+{ TRUSTEDBLOCK
        *(unsigned*)0xf0100000 = 0;
 }
 
index ac83e18..f5c22c2 100644 (file)
@@ -22,6 +22,8 @@ umain(void)
                        panic("bigarray[%d] didn't hold its value!\n", i);
 
        cprintf("Yes, good.  Now doing a wild write off the end...\n");
+       { TRUSTEDBLOCK
        bigarray[ARRAYSIZE+1024] = 0;
+       }
        panic("SHOULD HAVE TRAPPED!!!");
 }