Created architecture specific init processes, fixed gcc warnings
authorPaul Pearce <pearce@eecs.berkeley.edu>
Fri, 25 Sep 2009 01:20:26 +0000 (18:20 -0700)
committerPaul Pearce <pearce@eecs.berkeley.edu>
Fri, 25 Sep 2009 01:45:09 +0000 (18:45 -0700)
Broke architecture specific init sequences into their own files
inside of arch/init.c/h. These files contain the sequences based
on the point they diverged in the old init.c (timer_init()).
Architecture specific init is trigged via arch_init().

I also fixed some issues where i386 specific items were being pulled in on sparc
inside of syscall.c. These items are now wrapped in a __NETWORK__ ifdef

I also fixed some gcc warnings regarding incompatible types when
the ivy modified newlib_backend was compiled with gcc.

kern/arch/i386/Makefrag
kern/arch/i386/init.c [new file with mode: 0644]
kern/arch/i386/init.h [new file with mode: 0644]
kern/arch/sparc/Makefrag
kern/arch/sparc/init.c [new file with mode: 0644]
kern/arch/sparc/init.h [new file with mode: 0644]
kern/src/init.c
kern/src/syscall.c
user/parlib/src/i386/newlib_backend.c

index ba6fc6f..9ffe2f7 100644 (file)
@@ -31,4 +31,5 @@ KERN_ARCH_SRCFILES := $(KERN_ARCH_SRC_DIR)/entry.S \
                       $(KERN_ARCH_SRC_DIR)/ioapic.c \
                       $(KERN_ARCH_SRC_DIR)/rl8168.c \
                       $(KERN_ARCH_SRC_DIR)/ne2k.c \
+                      $(KERN_ARCH_SRC_DIR)/init.c \
                       $(KERN_ARCH_SRC_DIR)/env.c
diff --git a/kern/arch/i386/init.c b/kern/arch/i386/init.c
new file mode 100644 (file)
index 0000000..2ac2a2a
--- /dev/null
@@ -0,0 +1,40 @@
+/* See COPYRIGHT for copyright information. */
+
+#ifdef __SHARC__
+#pragma nosharc
+#endif
+
+#include <smp.h>
+
+#include <arch/rl8168.h>
+#include <arch/ne2k.h>
+#include <arch/mptables.h>
+#include <arch/pci.h>
+#include <arch/ioapic.h>
+
+void arch_init()
+{
+       mptables_parse();
+       pci_init();
+       ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
+               
+       // this returns when all other cores are done and ready to receive IPIs
+       smp_boot();
+       env_init();
+
+       /* EXPERIMENTAL NETWORK FUNCTIONALITY
+        * To enable, define __NETWORK__ 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
+        *
+        * Note: If you use this, you should also define the mac address of the 
+        * teathered machine via USER_MAC_ADDRESS in Makelocal.
+        *
+        * Additionally, you should have a look at the syscall server in the tools directory
+        */
+       #ifdef __NETWORK__
+       rl8168_init();          
+       ne2k_init();
+       #endif // __NETWORK__
+}
diff --git a/kern/arch/i386/init.h b/kern/arch/i386/init.h
new file mode 100644 (file)
index 0000000..9db49ec
--- /dev/null
@@ -0,0 +1,8 @@
+/* See COPYRIGHT for copyright information. */
+
+#ifndef ROS_ARCH_INIT_H
+#define ROS_ARCH_INIT_H
+
+void arch_init();
+
+#endif // !ROS_ARCH_INIT_H
\ No newline at end of file
index 877f7ed..55d3a57 100644 (file)
@@ -25,4 +25,5 @@ KERN_ARCH_SRCFILES := $(KERN_ARCH_SRC_DIR)/entry.S \
                       $(KERN_ARCH_SRC_DIR)/colored_caches.c \
                       $(KERN_ARCH_SRC_DIR)/timer.c \
                       $(KERN_ARCH_SRC_DIR)/env.c \
+                      $(KERN_ARCH_SRC_DIR)/init.c \
                       $(KERN_ARCH_SRC_DIR)/smp.c
diff --git a/kern/arch/sparc/init.c b/kern/arch/sparc/init.c
new file mode 100644 (file)
index 0000000..aaf6989
--- /dev/null
@@ -0,0 +1,14 @@
+/* See COPYRIGHT for copyright information. */
+
+#ifdef __SHARC__
+#pragma nosharc
+#endif
+
+#include <smp.h>
+
+void arch_init()
+{              
+       // this returns when all other cores are done and ready to receive IPIs
+       smp_boot();
+       env_init();
+}
diff --git a/kern/arch/sparc/init.h b/kern/arch/sparc/init.h
new file mode 100644 (file)
index 0000000..4846408
--- /dev/null
@@ -0,0 +1,8 @@
+/* See COPYRIGHT for copyright information. */
+
+#ifndef ROS_ARCH_INIT_H
+#define ROS_ARCH_INIT_H
+
+void arch_init();
+
+#endif // !ROS_ARCH_INIT_H
index 7f93e1b..95600a5 100644 (file)
 #include <manager.h>
 #include <testing.h>
 
-#ifdef __i386__
-#include <arch/rl8168.h>
-#include <arch/ne2k.h>
-#include <arch/mptables.h>
-#include <arch/pci.h>
-#include <arch/ioapic.h>
-#endif
+#include <arch/init.h>
 
 // zra: flag for Ivy
 int booting = 1;
@@ -75,33 +69,8 @@ void kernel_init(multiboot_info_t *mboot_info)
        sysenter_init();
        timer_init();
        
-       // @todo: Add an arch specific init? This is ugly
-       #ifdef __i386__
-       mptables_parse();
-       pci_init();
-       ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
-       #endif // __i386__
-               
-       // this returns when all other cores are done and ready to receive IPIs
-       smp_boot();
-       env_init();
-       
-
-       /* EXPERIMENTAL NETWORK FUNCTIONALITY
-        * To enable, define __NETWORK__ 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
-        *
-        * Note: If you use this, you should also define the mac address of the 
-        * teathered machine via USER_MAC_ADDRESS in Makelocal.
-        *
-        * Additionally, you should have a look at the syscall server in the tools directory
-        */
-       #ifdef __NETWORK__
-       rl8168_init();          
-       ne2k_init();
-       #endif // __NETWORK__
+       // At this point our boot paths diverge based on arch. 
+       arch_init();
 
        // zra: let's Ivy know we're done booting
        booting = 0;
index b98ae0a..c10205d 100644 (file)
@@ -12,7 +12,6 @@
 #include <ros/timer.h>
 #include <ros/error.h>
 
-#include <arch/rl8168.h>
 #include <string.h>
 #include <assert.h>
 #include <process.h>
 #include <stdio.h>
 #include <kfs.h> // eventually replace this with vfs.h
 
+#ifdef __NETWORK__
+#include <arch/rl8168.h>
+#endif
+
 static void sys_yield(struct proc *p);
 
 //Do absolutely nothing.  Used for profiling.
@@ -85,7 +88,7 @@ static ssize_t sys_run_binary(env_t* e, void *DANGEROUS binary_buf,
        return 0;
 }
 
-
+#ifdef __NETWORK__
 // This is not a syscall we want. Its hacky. Here just for syscall stuff until get a stack.
 static ssize_t sys_eth_write(env_t* e, const char *DANGEROUS buf, size_t len) 
 { 
@@ -157,6 +160,7 @@ static ssize_t sys_eth_read(env_t* e, char *DANGEROUS buf, size_t len)
        else
                return -EINVAL;
 }
+#endif // Network
 
 //
 /* END OF REMOTE SYSTEMCALL SUPPORT SYSCALLS. */
index e7ceb53..b6e5e4d 100644 (file)
@@ -55,7 +55,7 @@ int close(int file) {
        msg.fd = file;
        
        // Send message
-       response_t *result = send_message(&msg, sizeof(close_subheader_t),CLOSE_ID);
+       response_t *result = send_message((char*)&msg, sizeof(close_subheader_t),CLOSE_ID);
 
        int return_val;
 
@@ -121,7 +121,7 @@ int fstat(int file, struct stat *st)
        msg.fd = file;
 
        // Send message
-       response_t *result = send_message(&msg, sizeof(fstat_subheader_t),FSTAT_ID);
+       response_t *result = send_message((char*)&msg, sizeof(fstat_subheader_t),FSTAT_ID);
 
        // Read result
        int return_val;
@@ -172,7 +172,7 @@ int isatty(int file)
        msg.fd = file;
 
        // Send message
-       response_t *result = send_message(&msg, sizeof(isatty_subheader_t),ISATTY_ID);
+       response_t *result = send_message((char*)&msg, sizeof(isatty_subheader_t),ISATTY_ID);
 
        int return_val; 
 
@@ -265,7 +265,7 @@ off_t lseek(int file, off_t ptr, int dir)
        msg.dir = dir;
 
        // Send message
-       response_t *result = send_message(&msg, sizeof(lseek_subheader_t),LSEEK_ID);
+       response_t *result = send_message((char*)&msg, sizeof(lseek_subheader_t),LSEEK_ID);
 
        int return_val;
 
@@ -347,7 +347,7 @@ ssize_t read(int file, void *ptr, size_t len)
        msg.len = len;
        
        // Send message
-       response_t *result = send_message(&msg, sizeof(read_subheader_t),READ_ID);
+       response_t *result = send_message((char*)&msg, sizeof(read_subheader_t),READ_ID);
 
        // Read result
        int return_val;