Integrated with x86
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Jul 2009 00:07:09 +0000 (17:07 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Jul 2009 00:11:04 +0000 (17:11 -0700)
Tweaked makefiles and fixed a filthy console.c bug (couldn't tab!).
Also removes ancient chinese bochs secrets from the Makefile.  They are
just commented out, in case anyone is curious.

GNUmakefile
kern/Makefrag
kern/arch/i386/Makefrag
kern/arch/i386/arch.h
kern/arch/i386/console.c
kern/boot
kern/include/arch
kern/src/Makefrag
kern/src/arch [deleted symlink]
kern/src/pmap.c
kern/src/testing.c

index c89c3cf..eaf4abe 100644 (file)
@@ -6,10 +6,14 @@
 #      http://aegis.sourceforge.net/auug97.pdf
 #
 
--include Makelocal
 
 OBJDIR := obj
 
+# User defined constants passed on the command line 
+TARGET_ARCH := i386
+
+-include Makelocal
+
 TOP_DIR := .
 ARCH_DIR := $(TOP_DIR)/kern/arch
 INCLUDE_DIR := $(TOP_DIR)/kern/include
@@ -50,9 +54,6 @@ OBJDUMP       := $(GCCPREFIX)objdump
 NM         := $(GCCPREFIX)nm
 PERL    := perl
 
-# User defined constants passed on the command line 
-TARGET_ARCH ?= i386
-
 # 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.
@@ -85,12 +86,10 @@ all: symlinks
 kern/boot/Makefrag: symlinks
 
 symlinks:
-       -unlink kern/include/arch
-       ln -s ../arch/$(TARGET_ARCH)/ kern/include/arch
-       -unlink kern/src/arch
-       ln -s ../arch/$(TARGET_ARCH)/ kern/src/arch
-       -unlink kern/boot
-       ln -s arch/$(TARGET_ARCH)/boot/ kern/boot
+       @-unlink kern/include/arch
+       @ln -s ../arch/$(TARGET_ARCH)/ kern/include/arch
+       @-unlink kern/boot
+       @ln -s arch/$(TARGET_ARCH)/boot/ kern/boot
 
 # Include Makefrags for subdirectories
 include user/Makefrag
index f5220c0..3523940 100644 (file)
@@ -6,6 +6,7 @@ KERN_LDFLAGS := $(LDFLAGS)
 
 include $(KERN_DIR)/boot/Makefrag
 include $(KERN_DIR)/ivy/Makefrag
+include $(KERN_DIR)/arch/$(TARGET_ARCH)/Makefrag
 include $(KERN_DIR)/src/Makefrag
 
 .PRECIOUS: $(OBJDIR)/$(KERN_DIR)/%.o
index 538dbf5..90e105f 100644 (file)
@@ -4,7 +4,7 @@
 # where the GNUmakefile is located.
 #
 
-KERN_ARCH_SRC_DIR = $(KERN_DIR)/src/arch
+KERN_ARCH_SRC_DIR = $(KERN_DIR)/arch/$(TARGET_ARCH)
 
 # entry.S must be first, so that it's the first code in the text segment!!!
 #
index aae9cc9..1182bc4 100644 (file)
@@ -22,6 +22,7 @@ static __inline void cpu_relax(void) __attribute__((always_inline));
 static __inline void cpu_halt(void) __attribute__((always_inline));
 static __inline void clflush(uintptr_t* addr) __attribute__((always_inline));
 static __inline int irq_is_enabled(void) __attribute__((always_inline));
+static __inline uint32_t core_id(void) __attribute__((always_inline));
 static __inline void cache_flush(void) __attribute__((always_inline));
 static __inline void reboot(void) __attribute__((always_inline)) __attribute__((noreturn));
 
@@ -133,10 +134,17 @@ irq_is_enabled(void)
        return read_eflags() & FL_IF;
 }
 
+/*
+ * Returns the core id.  Unfortunately, this is a serializing instruction, and
+ * may not be the best way either.  This is ripped from lapic_get_default_id().
+ */
 static __inline uint32_t
 core_id(void)
 {
-       return lapic_get_id();
+       uint32_t ebx;
+       cpuid(1, 0, &ebx, 0, 0);
+       // p6 family only uses 4 bits here, and 0xf is reserved for the IOAPIC
+       return (ebx & 0xFF000000) >> 24;
 }
 
 static __inline void
index e7fa79e..040ded2 100644 (file)
@@ -238,11 +238,11 @@ cga_putc(int c)
                scrolling_crt_pos -= (scrolling_crt_pos % CRT_COLS);
                break;
        case '\t':
-               cons_putc(' ');
-               cons_putc(' ');
-               cons_putc(' ');
-               cons_putc(' ');
-               cons_putc(' ');
+               cga_putc(' ');
+               cga_putc(' ');
+               cga_putc(' ');
+               cga_putc(' ');
+               cga_putc(' ');
                break;
        default:
                crt_buf[crt_pos++] = c;         /* write the character */
index 1df5587..1a02482 120000 (symlink)
--- a/kern/boot
+++ b/kern/boot
@@ -1 +1 @@
-arch/sparc/boot/
\ No newline at end of file
+arch/i386/boot/
\ No newline at end of file
index 7b35dff..02e569b 120000 (symlink)
@@ -1 +1 @@
-../arch/sparc/
\ No newline at end of file
+../arch/i386/
\ No newline at end of file
index be82319..30f7a08 100644 (file)
@@ -7,8 +7,6 @@
 KERN_SRC_DIR = $(KERN_DIR)/src
 OBJDIRS += $(KERN_SRC_DIR)
 
-include $(KERN_SRC_DIR)/arch/Makefrag
-
 # entry.S must be first, so that it's the first code in the text segment!!!
 #
 # We also snatch the use of a couple handy source files
@@ -49,10 +47,10 @@ KERN_APPFILES := \
 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
                   -T $(ARCH_DIR)/$(TARGET_ARCH)/kernel.ld
 
-KERN_OBJFILES  := $(patsubst $(KERN_SRC_DIR)/%.c, \
+KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.c, \
                              $(OBJDIR)/$(KERN_DIR)/%.o, \
                              $(KERN_SRCFILES))
-KERN_OBJFILES  := $(patsubst $(KERN_SRC_DIR)/%.S, \
+KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.S, \
                              $(OBJDIR)/$(KERN_DIR)/%.o, \
                              $(KERN_OBJFILES))
 
@@ -65,12 +63,12 @@ KERN_LDLIBS    := -livykern
 
 KERN_GCC_LIB   := $(GCC_LIB)
 
-$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_SRC_DIR)/%.c
+$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c
        @echo + cc [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
 
-$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_SRC_DIR)/%.S
+$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S
        @echo + as [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
@@ -82,12 +80,12 @@ $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
 
-$(OBJDIR)/$(KERN_DIR)/bochs.img: $(OBJDIR)/$(KERN_DIR)/kernel $(OBJDIR)/$(KERN_DIR)/boot
-       @echo + mk [KERN] $@
-       $(V)dd if=/dev/zero of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ count=10080 2>/dev/null
-       $(V)dd if=$(OBJDIR)/$(KERN_DIR)/boot of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ conv=notrunc 2>/dev/null
-       $(V)dd if=$(OBJDIR)/$(KERN_DIR)/kernel of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ seek=1 conv=notrunc 2>/dev/null
-       $(V)mv $(OBJDIR)/kern/bochs.img~ $(OBJDIR)/kern/bochs.img
+#$(OBJDIR)/$(KERN_DIR)/bochs.img: $(OBJDIR)/$(KERN_DIR)/kernel $(OBJDIR)/$(KERN_DIR)/boot
+#      @echo + mk [KERN] $@
+#      $(V)dd if=/dev/zero of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ count=10080 2>/dev/null
+#      $(V)dd if=$(OBJDIR)/$(KERN_DIR)/boot of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ conv=notrunc 2>/dev/null
+#      $(V)dd if=$(OBJDIR)/$(KERN_DIR)/kernel of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ seek=1 conv=notrunc 2>/dev/null
+#      $(V)mv $(OBJDIR)/kern/bochs.img~ $(OBJDIR)/kern/bochs.img
 
-all: $(OBJDIR)/$(KERN_DIR)/bochs.img
+all: $(OBJDIR)/$(KERN_DIR)/kernel
 
diff --git a/kern/src/arch b/kern/src/arch
deleted file mode 120000 (symlink)
index 7b35dff..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../arch/sparc/
\ No newline at end of file
index a4e1a86..ff2a013 100644 (file)
@@ -336,7 +336,7 @@ error_t
 memcpy_from_user(env_t* env, void* COUNT(len) dest,
                  const void *DANGEROUS va, size_t len)
 {
-       void *DANGEROUS start, *DANGEROUS end;
+       const void *DANGEROUS start, *DANGEROUS end;
        size_t num_pages, i;
        pte_t *pte;
        uintptr_t perm = PTE_P | PTE_USER_RO;
index 1d50aaf..4c3cece 100644 (file)
@@ -352,9 +352,13 @@ void test_smp_call_functions(void)
        printk("A: %d, B: %d, C: %d (should be 19,19,19)\n", atomic_read(&a), atomic_read(&b), atomic_read(&c));
        printk("Attempting to deadlock by smp_calling with an outstanding wait:\n");
        smp_call_function_self(test_null_handler, 0, &waiter0);
+       printk("Sent one\n");
        smp_call_function_self(test_null_handler, 0, &waiter1);
+       printk("Sent two\n");
        smp_call_wait(waiter0);
+       printk("Wait one\n");
        smp_call_wait(waiter1);
+       printk("Wait two\n");
        printk("\tMade it through!\n");
        printk("Attempting to deadlock by smp_calling more than are available:\n");
        printk("\tShould see an Insufficient message and a kernel warning.\n");