Some Deputization with IN_HANDLER
authorZach Anderson <zra@intrepid.(none)>
Wed, 4 Mar 2009 02:30:09 +0000 (18:30 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 4 Mar 2009 02:30:09 +0000 (18:30 -0800)
Putting IN_HANDLER in some of the places it should go, and added empty
handler entry and exit functions.

ivylib/deputy_kern.c
kern/env.h
kern/monitor.h
kern/pmap.h
kern/syscall.h
kern/trap.c
kern/trap.h

index a637e79..5596b16 100644 (file)
@@ -97,3 +97,15 @@ int deputy_findnull(const void *e, unsigned int bytes) {
 void *__deputy_memset(void *s, int c, unsigned int n) {
   return memset(s, c, n);
 }
+
+void __ivy_handler_atomic_entry() __attribute__((weak));
+void __ivy_handler_atomic_entry() {return;}
+
+void __ivy_handler_atomic_exit() __attribute__((weak));
+void __ivy_handler_atomic_exit() {return;}
+
+void __ivy_handler_atomic_locks_entry(unsigned int n, ...) __attribute__((weak));
+void __ivy_handler_atomic_locks_entry(unsigned int n, ...) {return;}
+
+void __ivy_handler_atomic_locks_exit(unsigned int n, ...) __attribute__((weak));
+void __ivy_handler_atomic_locks_exit(unsigned int n, ...) {return;}
index 0508f86..675d1d5 100644 (file)
@@ -12,7 +12,7 @@
 #endif
 
 extern struct Env *envs;               // All environments
-extern struct Env *curenv;             // Current environment
+extern struct Env *NORACE curenv;              // Current environment
 
 LIST_HEAD(Env_list, Env);              // Declares 'struct Env_list'
 
@@ -20,11 +20,11 @@ void        env_init(void);
 int    env_alloc(struct Env **e, envid_t parent_id);
 void   env_free(struct Env *e);
 void   env_create(uint8_t *binary, size_t size);
-void   env_destroy(struct Env *e);     // Does not return if e == curenv
+void   (IN_HANDLER env_destroy)(struct Env *e);        // Does not return if e == curenv
 
 int    envid2env(envid_t envid, struct Env **env_store, bool checkperm);
 // The following two functions do not return
-void   env_run(struct Env *e) __attribute__((noreturn));
+void   (IN_HANDLER env_run)(struct Env *e) __attribute__((noreturn));
 void   env_pop_tf(struct Trapframe *tf) __attribute__((noreturn));
 
 // For the grading script
index 8231b4c..e23c457 100644 (file)
@@ -7,7 +7,7 @@
 // Activate the kernel monitor,
 // optionally providing a trap frame indicating the current state
 // (NULL if none).
-void monitor(struct Trapframe *tf);
+void (IN_HANDLER monitor)(struct Trapframe *tf);
 
 // Functions implementing monitor commands.
 int mon_help(int argc, char *NTS *NT COUNT(argc) argv, struct Trapframe *tf);
index 2ddff47..fe5ea47 100644 (file)
@@ -45,7 +45,7 @@ extern size_t npage;
 extern physaddr_t boot_cr3;
 extern pde_t *boot_pgdir;
 
-extern struct Segdesc gdt[];
+extern struct Segdesc (COUNT(6) gdt)[];
 extern struct Pseudodesc gdt_pd;
 
 void   i386_vm_init();
index cef046c..81ab8e8 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <inc/syscall.h>
 
-uint32_t syscall(uint32_t num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5);
+uint32_t (SYNCHRONOUS syscall)(uint32_t num, uint32_t a1, uint32_t a2,
+                               uint32_t a3, uint32_t a4, uint32_t a5);
 
 #endif /* !JOS_KERN_SYSCALL_H */
index cd44cb6..4dd4df2 100644 (file)
@@ -1,7 +1,3 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <inc/mmu.h>
 #include <inc/x86.h>
 #include <inc/assert.h>
@@ -24,9 +20,10 @@ struct Pseudodesc idt_pd = {
 };
 
 
-static const char *trapname(int trapno)
+static const char *NTS (IN_HANDLER trapname)(int trapno)
 {
-       static const char * const excnames[] = {
+    // zra: excnames is NORACE because Ivy doesn't trust const
+       static const char *NT const (NORACE excnames)[] = {
                "Divide error",
                "Debug",
                "Non-Maskable Interrupt",
@@ -66,8 +63,8 @@ idt_init(void)
        // It is layed out such that the ith entry is the ith's traphandler's
        // (uint32_t) trap addr, then (uint32_t) trap number
        struct trapinfo { uint32_t trapaddr; uint32_t trapnumber; };
-       extern struct trapinfo trap_tbl[];
-       extern struct trapinfo trap_tbl_end[];
+       extern struct trapinfo (BND(__this,trap_tbl_end) trap_tbl)[];
+       extern struct trapinfo (SNT trap_tbl_end)[];
        int i, trap_tbl_size = trap_tbl_end - trap_tbl;
        extern void ISR_default(void);
 
@@ -105,7 +102,7 @@ idt_init(void)
 }
 
 void
-print_trapframe(struct Trapframe *tf)
+(IN_HANDLER print_trapframe)(struct Trapframe *tf)
 {
        cprintf("TRAP frame at %p\n", tf);
        print_regs(&tf->tf_regs);
@@ -121,7 +118,7 @@ print_trapframe(struct Trapframe *tf)
 }
 
 void
-print_regs(struct PushRegs *regs)
+(IN_HANDLER print_regs)(struct PushRegs *regs)
 {
        cprintf("  edi  0x%08x\n", regs->reg_edi);
        cprintf("  esi  0x%08x\n", regs->reg_esi);
@@ -134,7 +131,7 @@ print_regs(struct PushRegs *regs)
 }
 
 static void
-trap_dispatch(struct Trapframe *tf)
+(IN_HANDLER trap_dispatch)(struct Trapframe *tf)
 {
        // Handle processor exceptions.
        
@@ -170,7 +167,7 @@ trap_dispatch(struct Trapframe *tf)
 }
 
 void
-trap(struct Trapframe *tf)
+(IN_HANDLER trap)(struct Trapframe *tf)
 {
        cprintf("Incoming TRAP frame at %p\n", tf);
 
index 8aa7648..79e3739 100644 (file)
@@ -13,9 +13,9 @@
 extern struct Gatedesc idt[];
 
 void idt_init(void);
-void print_regs(struct PushRegs *regs);
-void print_trapframe(struct Trapframe *tf);
-void page_fault_handler(struct Trapframe *);
+void (IN_HANDLER print_regs)(struct PushRegs *regs);
+void (IN_HANDLER print_trapframe)(struct Trapframe *tf);
+void (IN_HANDLER page_fault_handler)(struct Trapframe *);
 void backtrace(struct Trapframe *);
 
 #endif /* JOS_KERN_TRAP_H */