Cleaned up the way ifdefs are handled
authorKevin Klues <klueska@ros-dev.(none)>
Sat, 3 Apr 2010 00:00:12 +0000 (17:00 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:39 +0000 (17:35 -0700)
We now have a Makeconfig file that defines all of the configuration
options you can compile with.  Take a look in there to see what you can
turn on and off.  You should add configurations you want enabled into
your private Makelocal file.

18 files changed:
GNUmakefile
Makeconfig [new file with mode: 0644]
Makelocal.template [new file with mode: 0644]
kern/arch/i686/atomic.h
kern/arch/i686/boot/Makefrag
kern/arch/i686/console.c
kern/arch/i686/cpuinfo.c
kern/arch/i686/init.c
kern/arch/i686/rl8168.c
kern/arch/i686/ros/syscall.h
kern/ivy/Makefrag
kern/src/frontend.c
kern/src/init.c
kern/src/kfs.c
kern/src/mm.c
kern/src/page_alloc.c
kern/src/syscall.c
tests/Makefrag

index e992766..4c9b499 100644 (file)
@@ -40,6 +40,7 @@ realall: symlinks
 
 # Then grab the users Makelocal file to let them override Make system variables
 # and set up other Make targets
+include Makeconfig
 -include Makelocal
 
 TOP_DIR := .
@@ -81,15 +82,15 @@ endif
 
 # Default programs for compilation
 ifeq ($(COMPILER),IVY)
-KERN_CFLAGS := --deputy \
-                  --no-rc-sharc \
-                  --sc-dynamic-is-error \
-                  --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
-                  --sc-all-in-thread \
-                  --enable-precompile \
-#                  --enable-error-db \
-
-USER_CFLAGS := --deputy --enable-error-db
+KERN_CFLAGS += --deputy \
+               --no-rc-sharc \
+               --sc-dynamic-is-error \
+               --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
+               --sc-all-in-thread \
+               --enable-precompile \
+#               --enable-error-db \
+
+USER_CFLAGS += --deputy --enable-error-db
 CC         := ivycc --gcc=$(GCCPREFIX)gcc
 else
 CC         := $(GCCPREFIX)gcc 
@@ -113,7 +114,7 @@ endif
 # Universal compiler flags
 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
-CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
+CFLAGS += -D$(TARGET_ARCH) $(EXTRAARGS)
 CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
 CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
 CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
@@ -139,14 +140,14 @@ symlinks: error
 
 # Include Makefrags for subdirectories
 ifneq ($(TARGET_ARCH),)
-include kern/Makefrag
 include user/Makefrag
 include tests/Makefrag
+include kern/Makefrag
 endif
 
 ifeq ($(GCCPREFIX),$(TARGET_ARCH)-ros-)
 GCC_ROOT := $(shell which $(GCCPREFIX)gcc | xargs dirname)/../
-tests/: realtests
+tests/: tests
 tests:
        @$(MAKE) -j realtests
 realtests: $(TESTS_EXECS)
@@ -157,6 +158,7 @@ install-libs: $(ROS_USER_LIBS)
        cp $(ROS_USER_LIBS) $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib
        cp $(ROS_USER_LIBS) $(TOP_DIR)/fs/$(TARGET_ARCH)/lib
        cp -R $(USER_DIR)/include/* $(GCC_ROOT)/$(TARGET_ARCH)-ros/include
+.PHONY: tests
 endif
 
 # Eliminate default suffix rules
diff --git a/Makeconfig b/Makeconfig
new file mode 100644 (file)
index 0000000..4e1c9f4
--- /dev/null
@@ -0,0 +1,25 @@
+# Kernel configuration parameters
+# By default, each of these options will be turned off
+# To enable any of these options, add a line like the following to your Makelocal
+# KERN_CFLAGS += $(CONFIG_KFS) $(CONFIG_BSD_ON_CORE0)
+CONFIG_KFS:=                       -D__CONFIG_KFS__
+CONFIG_SINGLE_CORE:=               -D__CONFIG_SINGLE_CORE__
+CONFIG_NETWORKING:=                -D__CONFIG_NETWORKING__
+CONFIG_SERIAL_IO:=                 -D__CONFIG_SERIAL_IO__
+CONFIG_BSD_ON_CORE0:=              -D__CONFIG_BSD_ON_CORE0__
+CONFIG_SPINLOCK_DEBUG:=            -D__CONFIG_SPINLOCK_DEBUG__
+CONFIG_PAGE_COLORING:=             -D__CONFIG_PAGE_COLORING__
+CONFIG_APPSERVER:=                 -D__CONFIG_APPSERVER__
+CONFIG_DEMAND_PAGING:=             -D__CONFIG_DEMAND_PAGING__
+
+# Userspace configuration parameters
+# By default, each of these options will be turned off
+# To enable any of these options, add a line like the following to your Makelocal
+# USER_CFLAGS += $(CONFIG_SYSCALL_TRAP)
+CONFIG_SYSCALL_TRAP:=              -D__CONFIG_SYSCALL_TRAP__
+
+# User tests configuration parameters
+# By default, each of these options will be turned off
+# To enable any of these options, add a line like the following to your Makelocal
+# TESTS_CFLAGS += $(CONFIG_STATIC_APPS)
+CONFIG_STATIC_APPS:=               -static
diff --git a/Makelocal.template b/Makelocal.template
new file mode 100644 (file)
index 0000000..81ea6f3
--- /dev/null
@@ -0,0 +1,31 @@
+# Kernel configuration parameters
+#KERN_CFLAGS += $(CONFIG_KFS)
+#KERN_CFLAGS += $(CONFIG_SINGLE_CORE)
+#KERN_CFLAGS += $(CONFIG_NETWORKING)
+#KERN_CFLAGS += $(CONFIG_SERIAL_IO)
+#KERN_CFLAGS += $(CONFIG_BSD_ON_CORE0)
+#KERN_CFLAGS += $(CONFIG_SPINLOCK_DEBUG)
+#KERN_CFLAGS += $(CONFIG_PAGE_COLORING)
+#KERN_CFLAGS += $(CONFIG_APPSERVER)
+#KERN_CFLAGS += $(CONFIG_DEMAND_PAGING)
+#KERN_CFLAGS += -DDEVELOPER_NAME=waterman
+#KERN_CFLAGS += -DDEVELOPER_NAME=brho
+
+# Userspace configuration parameters
+#USER_CFLAGS += $(CONFIG_SYSCALL_TRAP)
+
+# User tests configuration parameters
+#TESTS_CFLAGS += $(CONFIG_STATIC_APPS)
+
+# Default for sparc (i.e. needs an appserver)
+ifeq ($(TARGET_ARCH),sparc)
+KERN_CFLAGS += $(CONFIG_APPSERVER)
+KERN_CFLAGS += -DDEVELOPER_NAME=waterman
+endif
+
+x86:
+       $(MAKE) TARGET_ARCH=i686
+
+ramp:
+       $(MAKE) TARGET_ARCH=sparc
+
index a88ef24..11cda25 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef ROS_INCLUDE_ATOMIC_H
 #define ROS_INCLUDE_ATOMIC_H
 
-/* This enables tracking who last locked a spinlock. */
-#define SPINLOCK_DEBUG
-
 #include <ros/common.h>
 #include <arch/x86.h>
 #include <arch/arch.h>
@@ -12,7 +9,7 @@
 typedef void * RACY atomic_t;
 struct spinlock {
        volatile uint32_t RACY rlock;
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
        void *call_site;        
        uint32_t calling_core;
 #endif
@@ -98,7 +95,7 @@ static inline void __spin_lock(volatile uint32_t *rlock)
 static inline void spin_lock(spinlock_t *lock)
 {
        __spin_lock(&lock->rlock);
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
        lock->call_site = (void RACY*CT(1))TC(read_eip());
        lock->calling_core = core_id();
 #endif
@@ -110,14 +107,14 @@ static inline void spin_unlock(spinlock_t *lock)
 }
 
 static inline void spinlock_init(spinlock_t *lock)
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
 WRITES(lock->rlock,lock->call_site,lock->calling_core)
 #else
 WRITES(lock->rlock)
 #endif
 {
        lock->rlock = 0;
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
        lock->call_site = 0;
        lock->calling_core = 0;
 #endif
index 5ad892b..3ee21b1 100644 (file)
@@ -8,7 +8,7 @@
 KERN_BOOT_DIR := $(KERN_DIR)/boot\r
 OBJDIRS += $(KERN_BOOT_DIR)\r
 \r
-KERN_BOOT_CFLAGS  := $(KERN_CFLAGS) -Os\r
+KERN_BOOT_CFLAGS  += $(KERN_CFLAGS) -Os\r
 KERN_BOOT_LDFLAGS := $(KERN_LDFLAGS) -N -e start -Ttext 0x7C00\r
 KERN_BOOT_OBJS    := $(OBJDIR)/$(KERN_BOOT_DIR)/boot.o \\r
                      $(OBJDIR)/$(KERN_BOOT_DIR)/main.o\r
index a5df0e6..3202c20 100644 (file)
@@ -526,7 +526,7 @@ cons_getc(void)
        // poll for any pending input characters,
        // so that this function works even when interrupts are disabled
        // (e.g., when called from the kernel monitor).
-       #ifndef SERIAL_IO
+       #ifndef __CONFIG_SERIAL_IO__
                serial_intr();
        #endif
        kbd_intr();
@@ -550,7 +550,7 @@ cons_putc(int c)
 {
        //static uint32_t lock; zra: moving up for sharC annotations
        spin_lock_irqsave(&lock);
-       #ifndef SERIAL_IO
+       #ifndef __CONFIG_SERIAL_IO__
                serial_putc(c);
        #endif
        //lpt_putc(c);
index 2a59bde..41e7930 100644 (file)
@@ -161,7 +161,7 @@ void backtrace(void)
 /* Like backtrace, this is probably not the best place for this. */
 void spinlock_debug(spinlock_t *lock)
 {
-#ifdef SPINLOCK_DEBUG
+#ifdef __CONFIG_SPINLOCK_DEBUG__
        eipdebuginfo_t debuginfo;
        char buf[256];
        uint32_t eip = (uint32_t)lock->call_site;
index c98fbee..4c21c5c 100644 (file)
@@ -18,10 +18,10 @@ void arch_init()
        pci_init();
        ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
                
-       // TODO: move these back to regular init.  requires fixing the __NETWORK__
-       // inits to not need multiple cores running.
+       // TODO: move these back to regular init.  requires fixing the 
+       // __CONFIG_NETWORKING__ inits to not need multiple cores running.
        // this returns when all other cores are done and ready to receive IPIs
-       #ifndef __SINGLE_CORE__
+       #ifdef __CONFIG_SINGLE_CORE__
                smp_boot();
        #else
                smp_percpu_init();
@@ -29,7 +29,7 @@ void arch_init()
        proc_init();
 
        /* EXPERIMENTAL NETWORK FUNCTIONALITY
-        * To enable, define __NETWORK__ in your Makelocal
+        * To enable, define __CONFIG_NETWORKING__ in your Makelocal
         * If enabled, will load the rl8168 driver (if device exists)
         * and will a boot into userland matrix, so remote syscalls can be performed.
         * If in simulation, will do some debugging information with the ne2k device
@@ -39,8 +39,8 @@ void arch_init()
         *
         * Additionally, you should have a look at the syscall server in the tools directory
         */
-       #ifdef __NETWORK__
+       #ifdef __CONFIG_NETWORKING__
        rl8168_init();          
        ne2k_init();
-       #endif // __NETWORK__
+       #endif // __CONFIG_NETWORKING__
 }
index d778c0d..8ff74e2 100644 (file)
@@ -38,7 +38,7 @@
  * This is a function rl8168 driver, that uses some really ugly hacks to achieve
  * UDP communication with a remote syscall server, without a network stack.
  *
- * To enable use, define __NETWORK__ in your Makelocal
+ * To enable use, define __CONFIG_NETWORKING__ in your Makelocal
  *
  * @author Paul Pearce <pearce@eecs.berkeley.edu>
  *
index aa64297..891df14 100644 (file)
@@ -24,10 +24,10 @@ static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
 static inline long __attribute__((always_inline))
 __ros_syscall(long _num, long _a0, long _a1, long _a2, long _a3, long _a4)
 {
-       #ifndef SYSCALL_TRAP
-               return syscall_sysenter(_num, _a0, _a1, _a2, _a3, _a4);
-       #else
+       #ifdef __CONFIG_SYSCALL_TRAP__
                return syscall_trap(_num, _a0, _a1, _a2, _a3, _a4);
+       #else
+               return syscall_sysenter(_num, _a0, _a1, _a2, _a3, _a4);
        #endif
 }
 
index 46451d2..c819ea0 100644 (file)
@@ -1,7 +1,7 @@
 KERN_IVY_DIR = $(KERN_DIR)/ivy\r
 OBJDIRS += $(KERN_IVY_DIR)\r
 \r
-KERN_IVY_CFLAGS   := $(KERN_CFLAGS)\r
+KERN_IVY_CFLAGS   += $(KERN_CFLAGS)\r
 ifeq ($(COMPILER),IVY)\r
 KERN_IVY_CFLAGS   += --nodeputy --nosharc\r
 endif\r
index d6fa403..a40e892 100644 (file)
@@ -20,18 +20,22 @@ volatile int magic_mem[10];
 void
 frontend_proc_init(struct proc *SAFE p)
 {
+#ifdef __CONFIG_APPSERVER__
        pid_t parent_id = p->ppid, id = p->pid;
        int32_t errno;
        if(frontend_syscall(parent_id,APPSERVER_SYSCALL_proc_init,id,0,0,0,&errno))
                panic("Front-end server couldn't initialize new process!");
+#endif
 }
 
 void
 frontend_proc_free(struct proc *SAFE p)
 {
+#ifdef __CONFIG_APPSERVER__
        int32_t errno;
        if(frontend_syscall(0,APPSERVER_SYSCALL_proc_free,p->pid,0,0,0,&errno))
                panic("Front-end server couldn't free process!");
+#endif
 }
 
 void* user_memdup(struct proc* p, const void* va, int len)
@@ -229,6 +233,14 @@ int32_t frontend_syscall(pid_t pid, int32_t syscall_num,
                          uint32_t arg0, uint32_t arg1, 
                          uint32_t arg2, uint32_t arg3, int32_t* errno)
 {
+#ifndef __CONFIG_APPSERVER__
+       warn("No appserver support: either "
+            "don't make this syscall or enable the appserver!\n");
+       if(errno)
+               *errno = ENOSYS;
+       return -1;
+#endif
+
        static spinlock_t lock = SPINLOCK_INITIALIZER;
        int32_t ret;
 
index b1b9d9a..25b7c3f 100644 (file)
@@ -4,8 +4,8 @@
 #pragma nosharc
 #endif
 
-#ifdef __BSD_ON_CORE_0__
-#include Everything For Free -- It just works!!
+#ifdef __CONFIG_BSD_ON_CORE0__
+#error "Yeah, it's not possible to build ROS with BSD on Core 0, sorry......"
 #else
 
 #include <arch/arch.h>
index aa007c7..68f7592 100644 (file)
@@ -28,7 +28,7 @@
  * userapps in kern/src/Makefrag.
  * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
  */
-#ifndef __NO_KFS__
+#ifdef __CONFIG_KFS__
 DECL_PROG(parlib_matrix);
 DECL_PROG(roslib_proctests);
 DECL_PROG(roslib_fptest);
@@ -49,7 +49,7 @@ DECL_PROG(parlib_lock_test);
 #endif
 
 struct kfs_entry kfs[MAX_KFS_FILES] = {
-#ifndef __NO_KFS__
+#ifdef __CONFIG_KFS__
        KFS_ENTRY(parlib_matrix)
        KFS_ENTRY(roslib_proctests)
        KFS_ENTRY(roslib_fptest)
index 82ac989..a6b7995 100644 (file)
@@ -65,6 +65,10 @@ void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
 {
        int num_pages = ROUNDUP(len, PGSIZE) / PGSIZE;
 
+#ifndef __CONFIG_DEMAND_PAGING__
+       flags |= MAP_POPULATE;
+#endif
+       
        if(!(flags & MAP_FIXED))
        {
                addr = (uintptr_t)get_free_va_range(p->env_pgdir,addr,len);
index 657f77e..f263dba 100644 (file)
@@ -27,6 +27,7 @@ static error_t __page_free(page_t *CT(1) page);
 
 // Global list of colors allocated to the general purpose memory allocator
 uint8_t* global_cache_colors_map;
+size_t global_next_color = 0;
 
 void colored_page_alloc_init()
 {
@@ -114,6 +115,7 @@ static error_t __page_alloc_specific(page_t** page, size_t ppn)
  * @return ESUCCESS on success
  * @return -ENOMEM  otherwise
  */
+#ifdef __CONFIG_PAGE_COLORING__
 error_t upage_alloc(struct proc* p, page_t** page, int zero)
 {
        spin_lock_irqsave(&colored_page_free_list_lock);
@@ -130,18 +132,35 @@ error_t upage_alloc(struct proc* p, page_t** page, int zero)
        }
        return ret;
 }
+#else 
+error_t upage_alloc(struct proc* p, page_t** page, int zero)
+{
+       ssize_t ret;
+       spin_lock_irqsave(&colored_page_free_list_lock);
+       if((ret = __page_alloc_from_color_range(page, global_next_color, 
+                                   llc_cache->num_colors - global_next_color)) < 0)
+               ret = __page_alloc_from_color_range(page, 0, global_next_color);
+
+       if(ret >= 0) {
+               global_next_color = ret;        
+               ret = ESUCCESS;
+       }
+       spin_unlock_irqsave(&colored_page_free_list_lock);
+       
+       return ret;
+}
+#endif
 
 error_t kpage_alloc(page_t** page) 
 {
-       static size_t next_color = 0;
        ssize_t ret;
        spin_lock_irqsave(&colored_page_free_list_lock);
-       if((ret = __page_alloc_from_color_range(page, next_color, 
-                                   llc_cache->num_colors - next_color)) < 0)
-               ret = __page_alloc_from_color_range(page, 0, next_color);
+       if((ret = __page_alloc_from_color_range(page, global_next_color, 
+                                   llc_cache->num_colors - global_next_color)) < 0)
+               ret = __page_alloc_from_color_range(page, 0, global_next_color);
 
        if(ret >= 0) {
-               next_color = ret;        
+               global_next_color = ret;        
                page_incref(*page);
                ret = ESUCCESS;
        }
index ea65abc..4f4d9cc 100644 (file)
@@ -30,7 +30,7 @@
 #include <kfs.h> // eventually replace this with vfs.h
 
 
-#ifdef __NETWORK__
+#ifdef __CONFIG_NETWORKING__
 #include <arch/nic_common.h>
 extern int (*send_frame)(const char *CT(len) data, size_t len);
 extern char device_mac[6];
@@ -573,7 +573,7 @@ static ssize_t sys_serial_read(env_t* e, char *DANGEROUS _buf, size_t len)
        if (len == 0)
                return 0;
 
-       #ifdef SERIAL_IO
+       #ifdef __CONFIG_SERIAL_IO__
            char *COUNT(len) buf = user_mem_assert(e, _buf, len, PTE_USER_RO);
                size_t bytes_read = 0;
                int c;
@@ -592,7 +592,7 @@ static ssize_t sys_serial_write(env_t* e, const char *DANGEROUS buf, size_t len)
 {
        if (len == 0)
                return 0;
-       #ifdef SERIAL_IO
+       #ifdef __CONFIG_SERIAL_IO__
                char *COUNT(len) _buf = user_mem_assert(e, buf, len, PTE_USER_RO);
                for(int i =0; i<len; i++)
                        serial_send_byte(buf[i]);
@@ -602,7 +602,7 @@ static ssize_t sys_serial_write(env_t* e, const char *DANGEROUS buf, size_t len)
        #endif
 }
 
-#ifdef __NETWORK__
+#ifdef __CONFIG_NETWORKING__
 // This is not a syscall we want. Its hacky. Here just for syscall stuff until get a stack.
 static ssize_t sys_eth_read(env_t* e, char *DANGEROUS buf)
 {
@@ -980,11 +980,11 @@ intreg_t syscall(struct proc *p, uintreg_t syscallno, uintreg_t a1,
                [SYS_shared_page_alloc] = (syscall_t)sys_shared_page_alloc,
                [SYS_shared_page_free] = (syscall_t)sys_shared_page_free,
                [SYS_resource_req] = (syscall_t)resource_req,
-       #ifdef __i386__
+       #ifdef __CONFIG_SERIAL_IO__
                [SYS_serial_read] = (syscall_t)sys_serial_read,
                [SYS_serial_write] = (syscall_t)sys_serial_write,
        #endif
-       #ifdef __NETWORK__
+       #ifdef __CONFIG_NETWORKING__
                [SYS_eth_read] = (syscall_t)sys_eth_read,
                [SYS_eth_write] = (syscall_t)sys_eth_write,
                [SYS_eth_get_mac_addr] = (syscall_t)sys_eth_get_mac_addr,
index 1575bb7..f3c490c 100644 (file)
@@ -1,10 +1,8 @@
 TESTS_DIR = tests
-TESTS_CFLAGS += $(USER_CFLAGS)
 OBJDIRS += $(TESTS_DIR)
 
-TESTS_CFLAGS := $(USER_CFLAGS)  \
-                -I$(USER_DIR)/include \
-#                -static
+TESTS_CFLAGS += $(USER_CFLAGS)  \
+                -I$(USER_DIR)/include
 
 ALL_TEST_FILES = $(shell ls $(TESTS_DIR)/*.c)