Adding SharC annotations. Type checker off
authorZach Anderson <zra@fortitude.(none)>
Tue, 15 Sep 2009 01:50:02 +0000 (18:50 -0700)
committerZach Anderson <zra@fortitude.(none)>
Tue, 15 Sep 2009 01:50:02 +0000 (18:50 -0700)
27 files changed:
kern/arch/i386/apic.c
kern/arch/i386/colored_caches.c
kern/arch/i386/kdebug.c
kern/arch/i386/page_alloc.c
kern/arch/i386/pmap.c
kern/arch/i386/smp_boot.c
kern/include/atomic.h
kern/include/colored_caches.h
kern/include/env.h
kern/include/kfs.h
kern/include/multiboot.h
kern/include/page_alloc.h
kern/include/pmap.h
kern/include/process.h
kern/include/ros/error.h
kern/src/colored_caches.c
kern/src/env.c
kern/src/init.c
kern/src/kmalloc.c
kern/src/manager.c
kern/src/monitor.c
kern/src/multiboot.c
kern/src/pmap.c
kern/src/printf.c
kern/src/readline.c
kern/src/testing.c
kern/src/timer.c

index 3e73726..b1bae4a 100644 (file)
@@ -6,6 +6,7 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <arch/mmu.h>
@@ -16,7 +17,7 @@
 #include <assert.h>
 #include <stdio.h>
 
-system_timing_t system_timing = {0, 0, 0xffff, 0};
+system_timing_t RO system_timing = {0, 0, 0xffff, 0};
 
 /*
  * Remaps the Programmable Interrupt Controller to use IRQs 32-47
@@ -107,7 +108,7 @@ void timer_init(void){
        tscval[0] = read_tsc();
        udelay_pit(1000000);
        tscval[1] = read_tsc();
-       system_timing.tsc_freq = tscval[1] - tscval[0];
+       system_timing.tsc_freq = SINIT(tscval[1] - tscval[0]);
        
        cprintf("TSC Frequency: %llu\n", system_timing.tsc_freq);
 
@@ -118,7 +119,7 @@ void timer_init(void){
        timercount[0] = read_mmreg32(LAPIC_TIMER_CURRENT);
        udelay_pit(1000000);
        timercount[1] = read_mmreg32(LAPIC_TIMER_CURRENT);
-       system_timing.bus_freq = (timercount[0] - timercount[1])*128;
+       system_timing.bus_freq = SINIT((timercount[0] - timercount[1])*128);
                
        cprintf("Bus Frequency: %llu\n", system_timing.bus_freq);
 }
@@ -131,8 +132,8 @@ void pit_set_timer(uint32_t divisor, uint32_t mode)
        outb(TIMER_MODE, mode); 
        outb(TIMER_CNTR0, divisor & 0xff);
        outb(TIMER_CNTR0, (divisor >> 8) );
-       system_timing.pit_mode = mode;
-       system_timing.pit_divisor = divisor;
+       system_timing.pit_mode = SINIT(mode);
+       system_timing.pit_divisor = SINIT(divisor);
        // cprintf("timer mode set to %d, divisor %d\n",mode, divisor);
 }
 
index f437954..f2da21d 100644 (file)
@@ -7,13 +7,14 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <colored_caches.h>
 
 // Global variables
-cache_t l1,l2,l3;
-available_caches_t available_caches;
+cache_t RO l1,l2,l3;
+available_caches_t RO available_caches;
 
 /************** Cache Related Functions  *****************/
 void cache_init() 
@@ -24,8 +25,8 @@ void cache_init()
        init_cache_properties(&l1,   32,  8, 64);
        init_cache_properties(&l2,  256,  8, 64);
        init_cache_properties(&l3, 8192, 16, 64);
-       available_caches.l1 = TRUE;
-       available_caches.l2 = TRUE;
-       available_caches.l3 = TRUE;
-       available_caches.llc = &l3;
+       available_caches.l1 = SINIT(TRUE);
+       available_caches.l2 = SINIT(TRUE);
+       available_caches.l3 = SINIT(TRUE);
+       available_caches.llc = SINIT(&l3);
 }
index a2cf1a5..d59b3e6 100644 (file)
 
 #include <ros/memlayout.h>
 
-extern const stab_t (BND(__this,__STAB_END__) __STAB_BEGIN__)[]; // Beginning of stabs table
-extern const stab_t (SNT __STAB_END__)[]; // End of stabs table
-extern const char (NT BND(__this,__STABSTR_END__) __STABSTR_BEGIN__)[]; // Beginning of string table
-extern const char (SNT __STABSTR_END__)[]; // End of string table
+// Beginning of stabs table
+extern const stab_t (RO BND(__this,__STAB_END__) __STAB_BEGIN__)[];
+
+// End of stabs table
+extern const stab_t (RO SNT __STAB_END__)[];
+
+// Beginning of string table
+extern const char (RO NT BND(__this,__STABSTR_END__) __STABSTR_BEGIN__)[];
+
+ // End of string table
+extern const char (RO SNT __STABSTR_END__)[];
 
 typedef struct UserStabData {
        const stab_t *BND(__this,stab_end) stabs;
index abaf22c..e28cb68 100644 (file)
@@ -7,6 +7,7 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <sys/queue.h>
 #include <kmalloc.h>
 
 // llc stands for last-level-cache
-uint16_t llc_num_colors;
-page_list_t *COUNT(llc_num_colors) colored_page_free_list = NULL;
+uint16_t RO llc_num_colors;
 spinlock_t colored_page_free_list_lock;
 
-void page_alloc_bootstrap(cache_t* llc) {
+page_list_t LCKD(&colored_page_free_list_lock) * CT(llc_num_colors) RO
+  colored_page_free_list = NULL;
+
+static void page_alloc_bootstrap(cache_t RO* llc) {
        // Initialize the properties of the last level cache used by this allocator
-       llc_num_colors = get_cache_num_page_colors(llc);
+       size_t nc = get_cache_num_page_colors(llc);
+       llc_num_colors = SINIT(nc);
 
        // Allocate space for the array required to manage the free lists
        size_t list_size = llc_num_colors*sizeof(page_list_t);
-       colored_page_free_list = (page_list_t*) boot_alloc(list_size, PGSIZE);
+       page_list_t LCKD(&colored_page_free_list_lock)*tmp =
+           (page_list_t*)boot_alloc(list_size,PGSIZE);
+       colored_page_free_list = SINIT(tmp);
 }
 
 /*
@@ -36,12 +42,12 @@ void page_alloc_bootstrap(cache_t* llc) {
  */
 void page_alloc_init() 
 {
-       cache_t* llc = available_caches.llc;
+       cache_t RO* llc = available_caches.llc;
 
        // First Bootstrap the page alloc process
-       static bool bootstrapped = FALSE;
+       static bool RO bootstrapped = FALSE;
        if(!bootstrapped) {
-               bootstrapped = TRUE;
+               bootstrapped = SINIT(TRUE);
                page_alloc_bootstrap(llc);
        }
 
@@ -60,7 +66,7 @@ void page_alloc_init()
        //  4) Then extended memory [EXTPHYSMEM, ...).
        //     Some of it is in use, some is free.
        int i;
-       extern char (SNT end)[];
+       extern char (SNT RO end)[];
        physaddr_t physaddr_after_kernel = PADDR(PTRROUNDUP(boot_freemem, PGSIZE));
 
        pages[0].page_ref = 1;
index 1539060..f0aeced 100644 (file)
@@ -1,5 +1,6 @@
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 /* See COPYRIGHT for copyright information. */
@@ -26,8 +27,7 @@ pde_t* boot_pgdir;            // Virtual address of boot time page directory
 physaddr_t RO boot_cr3;                // Physical address of boot time page directory
 
 // Global variables
-volatile uint32_t pages_lock = 0;
-page_t *pages = NULL;          // Virtual address of physical page array
+page_t *RO pages = NULL;          // Virtual address of physical page array
 
 // Global descriptor table.
 //
@@ -367,7 +367,8 @@ vm_init(void)
        
        // round up to the nearest page
        size_t env_array_size = ROUNDUP(NENV*sizeof(env_t), PGSIZE);
-       envs = /*(env_t *)*/boot_calloc(env_array_size, 1, PGSIZE);
+       env_t * tmpenv = (env_t *)boot_calloc(env_array_size, 1, PGSIZE);
+       envs = SINIT(tmpenv);
        //memset(envs, 0, env_array_size);
 
        // Check that the initial page directory has been set up correctly.
index 184640f..0a70c8d 100644 (file)
@@ -6,6 +6,7 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <arch/x86.h>
@@ -25,9 +26,9 @@
 #include <trap.h>
 #include <timing.h>
 
-extern handler_wrapper_t handler_wrappers[NUM_HANDLER_WRAPPERS];
+extern handler_wrapper_t (RO handler_wrappers)[NUM_HANDLER_WRAPPERS];
 volatile uint8_t num_cpus = 0xee;
-uintptr_t smp_stack_top;
+uintptr_t RO smp_stack_top;
 
 #define DECLARE_HANDLER_CHECKLISTS(vector)                          \
        INIT_CHECKLIST(f##vector##_cpu_list, MAX_NUM_CPUS);
@@ -101,7 +102,7 @@ void smp_boot(void)
        if (page_alloc(&smp_stack))
                panic("No memory for SMP boot stack!");
        page_incref(smp_stack);
-       smp_stack_top = (uintptr_t)(page2kva(smp_stack) + PGSIZE);
+       smp_stack_top = SINIT((uintptr_t)(page2kva(smp_stack) + PGSIZE));
 
        // Start the IPI process (INIT, wait, SIPI, wait, SIPI, wait)
        send_init_ipi();
index aab58ae..6abc513 100644 (file)
@@ -56,12 +56,14 @@ void down_checklist(checklist_t* list);
 /**************************************************************/
 
 /* Barrier: currently made for everyone barriering.  Change to use checklist */
-typedef struct barrier {
+struct barrier {
        volatile uint32_t lock;
        uint32_t init_count;
        uint32_t current_count;
     volatile uint8_t ready;
-} barrier_t;
+};
+
+typedef struct barrier RACY barrier_t;
 
 void init_barrier(barrier_t*COUNT(1) barrier, uint32_t count);
 void reset_barrier(barrier_t* barrier);
index 14cc093..5d5e6b6 100644 (file)
@@ -26,39 +26,39 @@ typedef struct AvailableCaches {
        uint8_t l3 : 1;
 
        // Pointer to the last level cache
-       cache_t*   llc;
+       cache_t RO*   llc;
 } available_caches_t;
 
 /******** Externally visible global variables ************/
-extern cache_t l1,l2,l3;
-extern available_caches_t available_caches;
+extern cache_t RO l1,l2,l3;
+extern available_caches_t RO available_caches;
 
 /************** Cache Related Functions  *****************/
 void cache_init();
-void init_cache_properties(cache_t *c, size_t sz_k, size_t wa, size_t clsz);
-size_t get_page_color(uintptr_t page, cache_t *c);
-size_t get_offset_in_cache_line(uintptr_t addr, cache_t *c);
-void print_cache_properties(char *NT lstring, cache_t *c);
+void init_cache_properties(cache_t RO*c, size_t sz_k, size_t wa, size_t clsz);
+size_t get_page_color(uintptr_t page, cache_t RO*c);
+size_t get_offset_in_cache_line(uintptr_t addr, cache_t RO*c);
+void print_cache_properties(char *NT lstring, cache_t RO*c);
 
 /****************** Cache Properties *********************/
-inline size_t get_cache_ways_associative(cache_t *c);
-inline size_t get_cache_line_size_bytes(cache_t *c);
-inline size_t get_cache_size_bytes(cache_t *c);
-inline size_t get_cache_size_kilobytes(cache_t *c);
-inline size_t get_cache_size_megabytes(cache_t *c);
-inline size_t get_cache_num_offset_bits(cache_t *c);
-inline size_t get_cache_num_index_bits(cache_t *c);
-inline size_t get_cache_num_tag_bits(cache_t *c);
-inline size_t get_cache_num_page_color_bits(cache_t *c);
-inline size_t get_cache_bytes_per_line(cache_t *c);
-inline size_t get_cache_num_lines(cache_t *c);
-inline size_t get_cache_num_sets(cache_t *c);
-inline size_t get_cache_lines_per_set(cache_t *c);
-inline size_t get_cache_lines_per_page(cache_t *c);
-inline size_t get_cache_bytes_per_way(cache_t *c);
-inline size_t get_cache_lines_per_way(cache_t *c);
-inline size_t get_cache_pages_per_way(cache_t *c);
-inline size_t get_cache_num_page_colors(cache_t *c);
+inline size_t get_cache_ways_associative(cache_t RO*c);
+inline size_t get_cache_line_size_bytes(cache_t RO*c);
+inline size_t get_cache_size_bytes(cache_t RO*c);
+inline size_t get_cache_size_kilobytes(cache_t RO*c);
+inline size_t get_cache_size_megabytes(cache_t RO*c);
+inline size_t get_cache_num_offset_bits(cache_t RO*c);
+inline size_t get_cache_num_index_bits(cache_t RO*c);
+inline size_t get_cache_num_tag_bits(cache_t RO*c);
+inline size_t get_cache_num_page_color_bits(cache_t RO*c);
+inline size_t get_cache_bytes_per_line(cache_t RO*c);
+inline size_t get_cache_num_lines(cache_t RO*c);
+inline size_t get_cache_num_sets(cache_t RO*c);
+inline size_t get_cache_lines_per_set(cache_t RO*c);
+inline size_t get_cache_lines_per_page(cache_t RO*c);
+inline size_t get_cache_bytes_per_way(cache_t RO*c);
+inline size_t get_cache_lines_per_way(cache_t RO*c);
+inline size_t get_cache_pages_per_way(cache_t RO*c);
+inline size_t get_cache_num_page_colors(cache_t RO*c);
 
 #endif // ROS_KERN_COLORED_CACHES_H
 
index 969f203..53151a9 100644 (file)
@@ -89,7 +89,7 @@ struct Env {
 /* Process Flags */
 // None yet
 
-extern env_t *COUNT(NENV) envs;                // All environments
+extern env_t *CT(NENV) RO envs;                // All environments
 extern atomic_t num_envs;              // Number of envs
 // TODO: consider moving this to struct per_cpu_info
 extern env_t * (RO curenvs)[MAX_NUM_CPUS];
index b6d76e6..f863577 100644 (file)
@@ -25,7 +25,7 @@ struct kfs_entry {
 };
 
 #define MAX_KFS_FILES 20
-extern struct kfs_entry kfs[MAX_KFS_FILES];
+extern struct kfs_entry (RO kfs)[MAX_KFS_FILES];
 
 ssize_t kfs_lookup_path(char*NTS path);
 struct proc *kfs_proc_create(int kfs_inode);
index ac57d17..8addb3e 100644 (file)
@@ -5,11 +5,11 @@
 
 #include <ros/common.h>
 
-extern physaddr_t maxpa;        // Maximum physical address in the system
-extern physaddr_t maxaddrpa;    // Maximum addressable physical address
-extern void *SNT maxaddrpa_ptr; // same as maxaddrpa, but ptr type for annotations
-extern size_t npages;           // Total number of physical memory pages
-extern size_t naddrpages;          // Number of addressable physical memory pages
+extern physaddr_t RO maxpa;        // Maximum physical address in the system
+extern physaddr_t RO maxaddrpa;    // Maximum addressable physical address
+extern void *SNT RO maxaddrpa_ptr; // same as maxaddrpa, but ptr type for annotations
+extern size_t RO npages;           // Total number of physical memory pages
+extern size_t RO naddrpages;       // Number of addressable physical memory pages
 
 #endif /* !__ASSEMBLER__ */
 
index ed0d141..90bd4c9 100644 (file)
@@ -22,17 +22,18 @@ typedef LIST_HEAD(PageList, Page) page_list_t;
 typedef LIST_ENTRY(Page) page_list_entry_t;
 
 struct Page {
-       page_list_entry_t page_link;
-       
+       page_list_entry_t LCKD(&colored_page_free_list_lock)page_link;
+
        size_t num_cons_links;
     size_t page_ref;
 };
 
 
 /******** Externally visible global variables ************/
-extern uint16_t llc_num_colors;
-extern page_list_t *COUNT(llc_num_colors) colored_page_free_list;
+extern uint16_t RO llc_num_colors;
 extern spinlock_t colored_page_free_list_lock;
+extern page_list_t LCKD(&colored_page_free_list_lock) * RO CT(llc_num_colors)
+    colored_page_free_list;
 
 /*************** Functional Interface *******************/
 void page_alloc_init(void);
index 3eed160..d980195 100644 (file)
        (void*TRUSTED) (__m_pa + KERNBASE);                             \
 })
 
-extern char (SNT bootstacktop)[], (SNT bootstack)[];
+extern char (SNT RO bootstacktop)[], (SNT RO bootstack)[];
 
 // List of physical pages
-extern volatile uint32_t pages_lock;
-extern page_t SLOCKED(&pages_lock) * SREADONLY COUNT(npages) pages;
+extern page_t * RO CT(npages) pages;
 
 extern physaddr_t RO boot_cr3;
-extern pde_t *COUNT(NPDENTRIES) boot_pgdir;
+extern pde_t *CT(NPDENTRIES) RO boot_pgdir;
 
-extern char*BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
+extern char *RO BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
 
 void   multiboot_detect_memory(multiboot_info_t *COUNT(1) mbi);
 void   multiboot_print_memory_map(multiboot_info_t *COUNT(1) mbi);
index 755d9c4..fe3550e 100644 (file)
 #define proc Env
 
 TAILQ_HEAD(proc_list, proc);           // Declares 'struct proc_list'
-extern struct proc_list proc_freelist;
+
 extern spinlock_t freelist_lock;
-extern struct proc_list proc_runnablelist;
+extern struct proc_list LCKD(&freelist_lock)proc_freelist;
+
 extern spinlock_t runnablelist_lock;
+extern struct proc_list LCKD(&runnablelist_lock) proc_runnablelist;
+
 
 extern spinlock_t idle_lock;
-extern uint32_t idlecoremap[MAX_NUM_CPUS];
-extern uint32_t num_idlecores;
+extern uint32_t LCKD(&idle_lock) (RO idlecoremap)[MAX_NUM_CPUS];
+extern uint32_t LCKD(&idle_lock) num_idlecores;
 
 int proc_set_state(struct proc *p, uint32_t state) WRITES(p->state);
 struct proc *get_proc(unsigned pid);
index 318a954..5662f05 100644 (file)
@@ -33,7 +33,7 @@ typedef enum {
  * so that -ENOMEM and ENOMEM are equivalent.
  */
 
-static const char *NTS const error_string[NUMERRORS] =
+static const char *NTS const (RO error_string)[NUMERRORS] =
 {
        "Success",
        "Generic Failure",
index 5eb1161..4871121 100644 (file)
@@ -7,6 +7,7 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <ros/common.h>
 
 /************** Cache Related Functions  *****************/
 inline void init_cache_properties(cache_t *c, size_t sz_k, size_t wa, size_t clsz) {
-       c->wa = wa;
-       c->sz_k = sz_k;
-       c->clsz = clsz;
+       c->wa = SINIT(wa);
+       c->sz_k = SINIT(sz_k);
+       c->clsz = SINIT(clsz);
        
        //Added as optimization (derived from above);
-       c->num_colors = get_cache_num_page_colors(c);
+       size_t nc = get_cache_num_page_colors(c);
+       c->num_colors = SINIT(nc);
 }
 inline size_t get_page_color(uintptr_t page, cache_t *c) {
     return (page % c->num_colors);
index d37d1a1..33131d1 100644 (file)
@@ -127,7 +127,7 @@ WRITES(e->env_pgdir, e->env_cr3, e->env_procinfo, e->env_procdata)
        page_t *pgdir = NULL;
        page_t *pginfo[PROCINFO_NUM_PAGES] = {NULL};
        page_t *pgdata[PROCDATA_NUM_PAGES] = {NULL};
-       static page_t* shared_page = 0;
+       static page_t * RO shared_page = 0;
 
        /*
         * First, allocate a page for the pgdir of this process and up
@@ -205,10 +205,10 @@ WRITES(e->env_pgdir, e->env_cr3, e->env_procinfo, e->env_procdata)
        if (!shared_page) {
                if(page_alloc(&shared_page) < 0)
                        goto env_setup_vm_error;
-       // Up it, so it never goes away.  One per user, plus one from page_alloc
-       // This is necessary, since it's in the per-process range of memory that
-       // gets freed during page_free.
-       page_incref(shared_page);
+               // Up it, so it never goes away.  One per user, plus one from page_alloc
+               // This is necessary, since it's in the per-process range of memory that
+               // gets freed during page_free.
+               page_incref(shared_page);
        }
 
        // Inserted into every process's address space at UGDATA
index d0b94b8..67cccc0 100644 (file)
@@ -29,7 +29,7 @@
 
 void kernel_init(multiboot_info_t *mboot_info)
 {
-       extern char (BND(__this, end) edata)[], (SNT end)[];
+       extern char (RO BND(__this, end) edata)[], (RO SNT end)[];
 
        // Before doing anything else, complete the ELF loading process.
        // Clear the uninitialized global data (BSS) section of our program.
@@ -49,9 +49,9 @@ void kernel_init(multiboot_info_t *mboot_info)
        // Paul: Can't use KADDR as arg to multiboot_detect_memory
        //  since multiboot_detect_memory is what sets npages. 
        //  Must simulate KADDR macro (ugly).
-       multiboot_detect_memory((multiboot_info_t*SAFE)(void*TRUSTED)((physaddr_t)mboot_info + KERNBASE));
-       
-       multiboot_print_memory_map((multiboot_info_t*COUNT(1))KADDR((physaddr_t)mboot_info));
+       multiboot_detect_memory((multiboot_info_t*CT(1))TC((physaddr_t)mboot_info + KERNBASE));
+
+       multiboot_print_memory_map((multiboot_info_t*CT(1))KADDR((physaddr_t)mboot_info));
 
        vm_init();
 
index 30ad21b..556d33f 100644 (file)
@@ -7,6 +7,7 @@
 
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <ros/common.h>
 
 #define kmallocdebug(args...)  //printk(args)
 
-char*BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
-static page_list_t pages_list; //List of physical pages used by kmalloc
+char *RO BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
+
+//List of physical pages used by kmalloc
+static spinlock_t pages_list_lock = 0;
+static page_list_t LCKD(&pages_list_lock)pages_list;
 
 /*
  * Allocate n bytes of physical memory aligned on an 
@@ -31,7 +35,7 @@ static page_list_t pages_list;        //List of physical pages used by kmalloc
  */
 void* boot_alloc(uint32_t n, uint32_t align)
 {
-       extern char (SNT end)[];
+       extern char (SNT RO end)[];
        void *v;
 
        // Initialize boot_freemem if this is the first time.
@@ -40,11 +44,12 @@ void* boot_alloc(uint32_t n, uint32_t align)
        // i.e., the first virtual address that the linker
        // did _not_ assign to any kernel code or global variables.
        if (boot_freemem == 0) {
-               boot_freemem = TC(end);
+               boot_freemem = SINIT(TC(end));
        }
 
        //      Step 1: round boot_freemem up to be aligned properly
-       boot_freemem = PTRROUNDUP(boot_freemem, align);
+       char RO*tmp = PTRROUNDUP(boot_freemem, align);
+       boot_freemem = SINIT(tmp);
 
        //      Step 2: save current value of boot_freemem as allocated chunk
        v = boot_freemem;
@@ -52,14 +57,14 @@ void* boot_alloc(uint32_t n, uint32_t align)
        if (PADDR(boot_freemem + n) > maxaddrpa)
                panic("Out of memory in boot alloc, you fool!\n");
        //      Step 3: increase boot_freemem to record allocation
-       boot_freemem += n;      
+       boot_freemem = SINIT(boot_freemem + n);
        //      Step 4: return allocated chunk
        return v;
 }
 
 void* boot_calloc(uint32_t _n, size_t sz, uint32_t align)
 {
-       extern char (SNT end)[];
+       extern char (SNT RO end)[];
        uint32_t n = _n *sz;
        void *v;
 
@@ -69,10 +74,11 @@ void* boot_calloc(uint32_t _n, size_t sz, uint32_t align)
        // i.e., the first virtual address that the linker
        // did _not_ assign to any kernel code or global variables.
        if (boot_freemem == 0)
-               boot_freemem = TC(end);
+               boot_freemem = SINIT(TC(end));
 
        //      Step 1: round boot_freemem up to be aligned properly
-       boot_freemem = PTRROUNDUP(boot_freemem, align);
+       char RO*tmp = PTRROUNDUP(boot_freemem, align);
+       boot_freemem = SINIT(tmp);
 
        //      Step 2: save current value of boot_freemem as allocated chunk
        v = boot_freemem;
@@ -80,7 +86,7 @@ void* boot_calloc(uint32_t _n, size_t sz, uint32_t align)
        if (PADDR(boot_freemem + n) > maxaddrpa)
                panic("Out of memory in boot alloc, you fool!\n");
        //      Step 3: increase boot_freemem to record allocation
-       boot_freemem += n;
+       boot_freemem = SINIT(boot_freemem + n);
        //  Step 4: zero allocated chunk
        memset(v,0,n);
        //      Step 5: return allocated chunk
@@ -121,10 +127,15 @@ void* kmalloc(size_t size, int flags)
        //Otherwise go ahead and allocate them to ourselves now
        for(int i=0; i<npages; i++) {
                page_t* page;
+
                page_alloc_specific(&page, first+i);
                page_incref(page);
                page->num_cons_links = npages-i;
+
+               spin_lock_irqsave(&pages_list_lock);
                LIST_INSERT_HEAD(&pages_list, page, page_link);
+               spin_unlock_irqsave(&pages_list_lock);
+
                kmallocdebug("mallocing page: %u\n", first+i);
                kmallocdebug("at addr: %p\n", ppn2kva(first+i));
        }
index 3dbf9ce..71570fc 100644 (file)
@@ -29,7 +29,7 @@
  */
 void manager(void)
 {
-       static uint8_t progress = 0;
+       static uint8_t RACY progress = 0;
        struct proc *envs[256];
        struct proc *p ;
 
index dfe8add..ba82bbd 100644 (file)
@@ -33,7 +33,7 @@ typedef struct command {
        int (*func)(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 } command_t;
 
-static command_t commands[] = {
+static command_t (RO commands)[] = {
        { "help", "Display this list of commands", mon_help },
        { "kerninfo", "Display information about the kernel", mon_kerninfo },
        { "backtrace", "Dump a backtrace", mon_backtrace },
@@ -62,7 +62,7 @@ int mon_help(int argc, char **argv, trapframe_t *tf)
 
 int mon_kerninfo(int argc, char **argv, trapframe_t *tf)
 {
-       extern char (SNT _start)[], (SNT etext)[], (SNT edata)[], (SNT end)[];
+       extern char (RO SNT _start)[], (RO SNT etext)[], (RO SNT edata)[], (RO SNT end)[];
 
        cprintf("Special kernel symbols:\n");
        cprintf("  _start %08x (virt)  %08x (phys)\n", _start, (uint32_t)(_start - KERNBASE));
@@ -74,10 +74,12 @@ int mon_kerninfo(int argc, char **argv, trapframe_t *tf)
        return 0;
 }
 
-static char* function_of(uint32_t address)
+#if 0
+zra: not called
+static char RO* function_of(uint32_t address)
 {
-       extern stab_t stab[], estab[];
-       extern char stabstr[];
+       extern stab_t (RO stab)[], (RO estab)[];
+       extern char (RO stabstr)[];
        stab_t* symtab;
        stab_t* best_symtab = 0;
        uint32_t best_func = 0;
@@ -97,6 +99,7 @@ static char* function_of(uint32_t address)
                return "Function not found!";
        return stabstr + best_symtab->n_strx;
 }
+#endif
 
 int mon_backtrace(int argc, char **argv, trapframe_t *tf)
 {
index 65a2034..ab3994a 100644 (file)
@@ -1,5 +1,6 @@
 #ifdef __SHARC__
 #pragma nosharc
+#define SINIT(x) x
 #endif
 
 #include <multiboot.h>
 #endif
 
 // These variables are set by i386_detect_memory()
-physaddr_t maxpa;      // Maximum physical address in the system
-physaddr_t maxaddrpa;  // Maximum addressable physical address
-void *SNT maxaddrpa_ptr;
-size_t npages;         // Total number of physical memory pages
-size_t naddrpages;       // Number of addressable physical memory pages
+physaddr_t RO maxpa;      // Maximum physical address in the system
+physaddr_t RO maxaddrpa;  // Maximum addressable physical address
+void *SNT RO maxaddrpa_ptr;
+size_t RO npages;         // Total number of physical memory pages
+size_t RO naddrpages;    // Number of addressable physical memory pages
 
-static size_t basemem;  // Amount of base memory (in bytes)
-static size_t extmem;   // Amount of extended memory (in bytes)
+static size_t RO basemem;  // Amount of base memory (in bytes)
+static size_t RO extmem;   // Amount of extended memory (in bytes)
 
 void
 multiboot_detect_memory(multiboot_info_t *mbi)
 {
        // Tells us how many kilobytes there are
-       basemem = ROUNDDOWN(mbi->mem_lower*1024, PGSIZE);
-       extmem = ROUNDDOWN(mbi->mem_upper*1024, PGSIZE);
+       size_t b = ROUNDDOWN(mbi->mem_lower*1024, PGSIZE);
+       size_t e = ROUNDDOWN(mbi->mem_upper*1024, PGSIZE);
+       basemem = SINIT(b);
+       extmem = SINIT(e);
 
        // Calculate the maximum physical address based on whether
        // or not there is any extended memory.  See comment in <inc/memlayout.h>
        if (extmem)
-               maxpa = EXTPHYSMEM + extmem;
+               maxpa = SINIT(EXTPHYSMEM + extmem);
        else
-               maxpa = basemem;
+               maxpa = SINIT(basemem);
 
-       npages = maxpa / PGSIZE;
+       npages = SINIT(maxpa / PGSIZE);
 
        // IOAPIC - KERNBASE is the max amount of virtual addresses we can use
        // for the physical memory mapping (aka - the KERNBASE mapping)
-       maxaddrpa = MIN(maxpa, IOAPIC_BASE - KERNBASE);
-       maxaddrpa_ptr = (void *SNT)maxaddrpa;
+       maxaddrpa = SINIT(MIN(maxpa, IOAPIC_BASE - KERNBASE));
+       maxaddrpa_ptr = SINIT((void *SNT)maxaddrpa);
 
-       naddrpages = maxaddrpa / PGSIZE;
+       naddrpages = SINIT(maxaddrpa / PGSIZE);
 
        cprintf("Physical memory: %dK available, ", (int)(maxpa/1024));
        cprintf("base = %dK, extended = %dK\n", (int)(basemem/1024), (int)(extmem/1024));
index 5cb5939..16bf038 100644 (file)
 /**
  * @brief Global variable used to store erroneous virtual addresses as the
  *        result of a failed user_mem_check().
+ *
+ * zra: What if two checks fail at the same time? Maybe this should be per-cpu?
+ *
  */
-static void *DANGEROUS user_mem_check_addr;
+static void *DANGEROUS RACY user_mem_check_addr;
 
 volatile uint32_t vpt_lock = 0;
 volatile uint32_t vpd_lock = 0;
index 4f4730a..2bb2bb3 100644 (file)
@@ -12,7 +12,7 @@
 #include <stdio.h>
 #include <stdarg.h>
 
-uint32_t output_lock = 0;
+spinlock_t output_lock = 0;
 
 void putch(int ch, int **cnt)
 {
@@ -26,8 +26,8 @@ void putch(int ch, int **cnt)
 void buffered_putch(int ch, int **cnt)
 {
        #define buffered_putch_bufsize 64
-       static char buf[buffered_putch_bufsize];
-       static int buflen = 0;
+       static char LCKD(&output_lock) (RO buf)[buffered_putch_bufsize];
+       static int LCKD(&output_lock) buflen = 0;
 
        if(ch != -1)
        {
index fc26f46..0ca4818 100644 (file)
@@ -1,4 +1,3 @@
-
 #ifdef __SHARC__
 #pragma nosharc
 #endif
@@ -7,7 +6,8 @@
 #include <stdio.h>
 
 #define BUFLEN 1024
-static char (NT buf)[BUFLEN];
+// zra: used only by monitor.c.
+static char RACY (RO NT buf)[BUFLEN];
 
 char *
 readline(const char *prompt)
index 75d98d7..d9a1663 100644 (file)
@@ -307,7 +307,7 @@ void test_bitmasks(void)
        printk("should be cleared\n");
 }
 
-checklist_t* the_global_list;
+checklist_t *RO the_global_list;
 
 void test_checklist_handler(trapframe_t *tf, void* data)
 {
index cc089ae..d708616 100644 (file)
@@ -1,4 +1,6 @@
 
+// zra: why is this in the kernel?
+
 #ifdef __SHARC__
 #pragma nosharc
 #endif