Adding SharC annotations
authorZach Anderson <zra@fortitude.(none)>
Sun, 13 Sep 2009 19:29:38 +0000 (12:29 -0700)
committerZach Anderson <zra@fortitude.(none)>
Sun, 13 Sep 2009 19:29:38 +0000 (12:29 -0700)
15 files changed:
kern/arch/i386/atomic.h
kern/arch/i386/console.c
kern/arch/i386/mmu.h
kern/arch/i386/smp.c
kern/arch/i386/smp.h
kern/arch/i386/trap.c
kern/include/atomic.h
kern/include/smp.h
kern/include/trap.h
user/apps/parlib/Makefrag
user/apps/parlib/readline.c
user/apps/roslib/mhello.c
user/parlib/inc/libc_patch.h
user/roslib/inc/lib.h
user/roslib/src/syscall.c

index 87fbc95..e2b2b05 100644 (file)
@@ -10,8 +10,8 @@
  * write-orderings are respected. */
 #define wmb_f() ({ asm volatile("sfence"); })
 
-typedef void* atomic_t;
-typedef volatile uint32_t spinlock_t;
+typedef void*RACY atomic_t;
+typedef volatile uint32_t RACY spinlock_t;
 
 static inline void atomic_init(atomic_t *number, int32_t val);
 static inline int32_t atomic_read(atomic_t *number);
@@ -51,7 +51,7 @@ static inline void atomic_dec(atomic_t *number)
        asm volatile("lock decl %0" : "=m"(*number) : : "cc");
 }
 
-static inline void atomic_andb(volatile uint8_t *number, uint8_t mask)
+static inline void atomic_andb(volatile uint8_t RACY*number, uint8_t mask)
 {
        asm volatile("lock andb %1,%0" : "=m"(*number) : "r"(mask) : "cc");
 }
index 8cd339b..d4aa439 100644 (file)
@@ -169,9 +169,6 @@ cga_init(void)
        uint16_t was;
        unsigned pos;
 
-       // zra: I suppose this isn't needed, but it makes Ivy shut up
-       //spin_lock_irqsave(&lock);
-
        cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + CGA_BUF);
        was = *cp;
        *cp = (uint16_t) 0xA55A;
@@ -194,7 +191,6 @@ cga_init(void)
        scrolling_crt_pos = 0;
        current_crt_buf = 0;
 
-       //spin_unlock_irqsave(&lock);
 }
 
 static void set_screen(uint8_t screen_num)
index 5783fec..4e2ab62 100644 (file)
@@ -211,11 +211,29 @@ typedef struct Segdesc {
 { ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,      \
     type, 1, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                       \
     (unsigned) (base) >> 24 }
+
 #define SEG16(type, base, lim, dpl)                                                            \
 { (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,                      \
     type, 1, dpl, 1, (unsigned) (lim) >> 16, 0, 0, 1, 0,                       \
     (unsigned) (base) >> 24 }
 
+#define SEG16ROINIT(seg,type,base,lim,dpl) \
+       {\
+               (seg).sd_lim_15_0 = SINIT((lim) & 0xffff);\
+               (seg).sd_base_15_0 = SINIT((base)&0xffff);\
+               (seg).sd_base_23_16 = SINIT(((base)>>16)&0xff);\
+               (seg).sd_type = SINIT(type);\
+               (seg).sd_s = SINIT(1);\
+               (seg).sd_dpl = SINIT(dpl);\
+               (seg).sd_p = SINIT(1);\
+               (seg).sd_lim_19_16 = SINIT((unsigned)(lim)>>16);\
+               (seg).sd_avl = SINIT(0);\
+               (seg).sd_rsv1 = SINIT(0);\
+               (seg).sd_db = SINIT(1);\
+               (seg).sd_g = SINIT(0);\
+               (seg).sd_base_31_24 = SINIT((unsigned)(base)>> 24);\
+       }
+
 #endif /* !__ASSEMBLER__ */
 
 // Application segment type bits
@@ -325,6 +343,19 @@ typedef struct Gatedesc {
        (gate).gd_off_31_16 = (uint32_t) (off) >> 16;           \
 }
 
+#define ROSETGATE(gate, istrap, sel, off, dpl)                 \
+{                                                              \
+       (gate).gd_off_15_0 = SINIT((uint32_t) (off) & 0xffff);          \
+       (gate).gd_ss = SINIT(sel);                                      \
+       (gate).gd_args = SINIT(0);                                      \
+       (gate).gd_rsv1 = SINIT(0);                                      \
+       (gate).gd_type = SINIT((istrap) ? STS_TG32 : STS_IG32); \
+       (gate).gd_s = SINIT(0);                                 \
+       (gate).gd_dpl = SINIT(dpl);                                     \
+       (gate).gd_p = SINIT(1);                                 \
+       (gate).gd_off_31_16 = SINIT((uint32_t) (off) >> 16);            \
+}
+
 // Set up a call gate descriptor.
 #define SETCALLGATE(gate, ss, off, dpl)                        \
 {                                                              \
index b56dd91..cdd44e3 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifdef __SHARC__
-#pragma nosharc
+//#pragma nosharc
 #endif
 
 #include <arch/arch.h>
@@ -23,7 +23,7 @@
 /*************************** IPI Wrapper Stuff ********************************/
 // checklists to protect the global interrupt_handlers for 0xf0, f1, f2, f3, f4
 // need to be global, since there is no function that will always exist for them
-handler_wrapper_t             handler_wrappers[NUM_HANDLER_WRAPPERS];
+handler_wrapper_t             (RO handler_wrappers)[NUM_HANDLER_WRAPPERS];
 
 static int smp_call_function(uint8_t type, uint32_t dest, poly_isr_t handler, TV(t) data,
                              handler_wrapper_t** wait_wrapper)
index 957e919..6a7194d 100644 (file)
 
 #define NUM_INTERRUPT_HANDLERS 256
 
-typedef struct HandlerWrapper {
+struct HandlerWrapper {
        checklist_t* cpu_list;
        uint8_t vector;
-} handler_wrapper_t;
+};
+
+typedef struct HandlerWrapper LCKD(&cpu_list->lock) handler_wrapper_t;
 
 #endif /* !ROS_ARCH_SMP_H */
index b084a8d..d57c47a 100644 (file)
@@ -33,7 +33,11 @@ pseudodesc_t idt_pd = {
  * of functions to be called when servicing an interrupt.  other cores
  * can set up their own later.
  */
-handler_t TP(void *) interrupt_handlers[NUM_INTERRUPT_HANDLERS];
+#ifdef __IVY__
+#pragma cilnoremove("iht_lock")
+#endif
+spinlock_t iht_lock;
+handler_t TP(void *) LCKD(&iht_lock) (RO interrupt_handlers)[NUM_INTERRUPT_HANDLERS];
 
 static const char *NTS trapname(int trapno)
 {
index c284fc9..aab58ae 100644 (file)
@@ -19,12 +19,13 @@ typedef struct checklist_mask {
 } checklist_mask_t;
 
 // mask contains an unspecified array, so it needs to be at the bottom
-typedef struct checklist {
+struct checklist {
        volatile uint32_t lock;
        checklist_mask_t mask;
        // eagle-eyed readers may know why this might have been needed. 2009-09-04
        //volatile uint8_t (COUNT(BYTES_FOR_BITMASK(size)) bits)[];
-} checklist_t;
+};
+typedef struct checklist RACY checklist_t;
 
 #define ZEROS_ARRAY(size) {[0 ... ((size)-1)] 0}
 
index ce7a971..ee6c8c2 100644 (file)
@@ -31,8 +31,8 @@ struct per_cpu_info {
 
 typedef struct per_cpu_info NTPTV(t) NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) per_cpu_info_t;
 
-extern per_cpu_info_t per_cpu_info[MAX_NUM_CPUS];
-extern volatile uint8_t num_cpus;
+extern per_cpu_info_t ( per_cpu_info)[MAX_NUM_CPUS];
+extern volatile uint8_t RO num_cpus;
 
 /* SMP bootup functions */
 void smp_boot(void);
index 93c0b51..59aa133 100644 (file)
@@ -17,10 +17,16 @@ typedef struct InterruptHandler {
        poly_isr_t isr;
        TV(t) data;
 } handler_t;
-extern handler_t (COUNT(256) interrupt_handlers)[];
+
+#ifdef __IVY__
+#pragma cilnoremove("iht_lock")
+#endif
+extern spinlock_t iht_lock;
+extern handler_t LCKD(&iht_lock) (CT(NUM_INTERRUPT_HANDLERS) RO interrupt_handlers)[];
 
 void idt_init(void);
-void register_interrupt_handler(handler_t (COUNT(256)table)[], uint8_t int_num,
+void register_interrupt_handler(handler_t SSOMELOCK (CT(NUM_INTERRUPT_HANDLERS)table)[],
+                                uint8_t int_num,
                                 poly_isr_t handler, TV(t) data);
 void ( print_trapframe)(trapframe_t *tf);
 void ( page_fault_handler)(trapframe_t *tf);
index 12c63ce..1c01964 100644 (file)
@@ -1,11 +1,13 @@
 USER_APPS_PARLIB_DIR = $(USER_APPS_DIR)/parlib
 OBJDIRS += $(USER_APPS_PARLIB_DIR)
 
+PATCHFILE = $(OBJDIR)/$(USER_PARLIB_DIR)/libc_patch.i
+
 USER_APPS_PARLIB_CFLAGS    := $(USER_CFLAGS)  \
                               -I$(USER_PARLIB_NEWLIB_DIR)/include \
                               -I$(USER_PARLIB_DIR)/inc
 ifeq ($(COMPILER),IVY)
-       USER_APPS_PARLIB_CFLAGS    += --nodeputy --nopatch
+       USER_APPS_PARLIB_CFLAGS    += --nodeputy --nopatch #--patch=$(PATCHFILE) 
 endif
 
 USER_APPS_PARLIB_LDFLAGS   := $(USER_LDFLAGS) -static \
@@ -32,7 +34,7 @@ USER_APPS_PARLIB_LDDEPENDS := $(USER_APPS_PARLIB_LDOBJS) \
 
 USER_APPS_PARLIB_GCC_LIB   := $(GCC_LIB)
 
-$(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o: $(USER_APPS_PARLIB_DIR)/%.c
+$(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o: $(USER_APPS_PARLIB_DIR)/%.c $(PATCHFILE)
        @echo + cc [APPS PARLIB] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(USER_APPS_PARLIB_CFLAGS) -c -o $@ $<
index 7c53082..73370af 100644 (file)
@@ -3,7 +3,7 @@
 #include <fcntl.h>
 #include <arch/kbdreg.h>
 
-char* readline(const char *prompt)
+char* readline(const char * prompt)
 {
        int i, read_amt;
        char c;
index 815fa4c..417c805 100644 (file)
@@ -17,13 +17,10 @@ void udelay(uint64_t usec, uint64_t tsc_freq)
        return;
 }
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
 int main(int argc, char** argv)
 {
        cprintf("Multi-Goodbye, world, from PID: %d!\n", sys_getpid());
-       sys_mmap((void*)1, 2, 3, 4, 0, 0);
+       sys_mmap((void*SNT)1, 2, 3, 4, 0, 0);
        while(1);
        udelay(5000000, 1995014570); // KVM's freq.  Whatever.
 
index 8760158..cf92096 100644 (file)
@@ -434,7 +434,7 @@ OPTSTRING getcwd (STRINGBUF(__size) __buf, size_t __size);
 
 // reent.h
 
-#ifdef __CYGWIN__
+//#ifdef __CYGWIN__
 // Take care of the union in reent.h (on cygwin)
 // This union is not actually used, so we can use WHEN 
 // clauses to enable only the used field.
@@ -444,7 +444,7 @@ struct _reent {
         void _unused WHEN(0);
     } _new;
 };
-#endif
+//#endif
 
 // siginfo.h
 
index 2f57455..f5ae3ec 100644 (file)
@@ -66,8 +66,9 @@ void        sys_yield(void);
 int         sys_proc_create(char* path);
 error_t     sys_proc_run(int pid);
 /* Memory Management */
-void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
-               size_t offset);
+void *COUNT(length)
+sys_mmap(void *SNT addr, size_t length, int prot, int flags, int fd,
+         size_t offset);
 /* Generic Async Call */
 error_t     waiton_syscall(syscall_desc_t* desc, syscall_rsp_t*COUNT(1) rsp);
 
index b34a2ca..077dd2e 100644 (file)
@@ -137,15 +137,13 @@ error_t sys_proc_run(int pid)
        return syscall(SYS_proc_run, pid, 0, 0, 0, 0);
 }
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
 /* We need to do some hackery to pass 6 arguments.  Arg4 pts to the real arg4,
  * arg5, and arg6.  Keep this in sync with kern/src/syscall.c.
  * TODO: consider a syscall_multi that can take more args, and keep it in sync
  * with the kernel.  Maybe wait til we fix sysenter to have 5 or 6 args. */
-void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
-               size_t offset)
+void *CT(length)
+sys_mmap(void *SNT addr, size_t length, int prot, int flags, int fd,
+         size_t offset)
 {
        struct args {
                int _flags;
@@ -156,6 +154,6 @@ void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
        extra_args._fd = fd;
        extra_args._offset = offset;
        // TODO: deputy bitches about this
-       return (void*)syscall(SYS_mmap, (uint32_t)addr, length, prot,
-                             (int32_t)&extra_args, 0);
+       return (void*CT(length))TC(syscall(SYS_mmap, (uint32_t)addr, length, prot,
+                             (int32_t)&extra_args, 0));
 }