Major reorganization in prep for appserver merge
authorKevin Klues <klueska@ros-dev.(none)>
Sun, 21 Mar 2010 19:32:01 +0000 (12:32 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:36 +0000 (17:35 -0700)
1) Now that our cross compiler is actually i686 instead of i386, I've moved
kern/arch/i386 to kern/arch/i686, changing the references in the top level
GNUmakefile as well as the Makefile for the cross compiler.

2) I reorganized all of the frontend syscall stuff from being sparc/ramp
specific to being platform independent.  This mostly required moving stuff out
of the sparc specific frontend.c/h files and putting them in
kern/src/frontend.c and kern/include/frontend.c files respectively.
Additionally, I moved stuff from the sparc specific syscall.c file directly
into kern/src/syscall.c, taking care to move all of the 'helper' functions that
were in this file into frontend.c.  That may not be the very best place for
them, as they don't really do anything frontend specific, but for now it seems
to make sense because the only syscalls that use them are those being forwarded
to the frontend appserver.

3) I started messing with Paul's ne2k driver to get it to forward system calls
the way the unified app server expects them.  I have things compiling (probably
not working), but I talked to Paul and he said this was really old code and I
should actually just rebase from the lwip branch and work off the code from
there.  So now I am committing so I can do just that...

118 files changed:
GNUmakefile
kern/arch/i386/Makefrag [deleted file]
kern/arch/i386/apic.c [deleted file]
kern/arch/i386/apic.h [deleted file]
kern/arch/i386/arch.h [deleted file]
kern/arch/i386/atomic.h [deleted file]
kern/arch/i386/bitmask.h [deleted file]
kern/arch/i386/boot/Makefrag [deleted file]
kern/arch/i386/boot/boot.S [deleted file]
kern/arch/i386/boot/main.c [deleted file]
kern/arch/i386/boot/sign.pl [deleted file]
kern/arch/i386/colored_caches.c [deleted file]
kern/arch/i386/colored_page_alloc.h [deleted file]
kern/arch/i386/console.c [deleted file]
kern/arch/i386/console.h [deleted file]
kern/arch/i386/cpuinfo.c [deleted file]
kern/arch/i386/entry.S [deleted file]
kern/arch/i386/env.c [deleted file]
kern/arch/i386/init.c [deleted file]
kern/arch/i386/init.h [deleted file]
kern/arch/i386/ioapic.c [deleted file]
kern/arch/i386/ioapic.h [deleted file]
kern/arch/i386/kbdreg.h [deleted file]
kern/arch/i386/kclock.c [deleted file]
kern/arch/i386/kdebug.c [deleted file]
kern/arch/i386/kernel.ld [deleted file]
kern/arch/i386/membar.h [deleted file]
kern/arch/i386/mmu.h [deleted file]
kern/arch/i386/mptables.c [deleted file]
kern/arch/i386/mptables.h [deleted file]
kern/arch/i386/ne2k.c [deleted file]
kern/arch/i386/ne2k.h [deleted file]
kern/arch/i386/nic_common.c [deleted file]
kern/arch/i386/nic_common.h [deleted file]
kern/arch/i386/page_alloc.c [deleted file]
kern/arch/i386/pci.c [deleted file]
kern/arch/i386/pci.h [deleted file]
kern/arch/i386/pmap.c [deleted file]
kern/arch/i386/process.c [deleted file]
kern/arch/i386/rl8168.c [deleted file]
kern/arch/i386/rl8168.h [deleted file]
kern/arch/i386/ros/hart.h [deleted file]
kern/arch/i386/ros/mmu.h [deleted file]
kern/arch/i386/ros/syscall.h [deleted file]
kern/arch/i386/smp.c [deleted file]
kern/arch/i386/smp.h [deleted file]
kern/arch/i386/smp_boot.c [deleted file]
kern/arch/i386/smp_entry.S [deleted file]
kern/arch/i386/trap.c [deleted file]
kern/arch/i386/trap.h [deleted file]
kern/arch/i386/trapentry.S [deleted file]
kern/arch/i386/types.h [deleted file]
kern/arch/i386/x86.h [deleted file]
kern/arch/i686/Makefrag [new file with mode: 0644]
kern/arch/i686/apic.c [new file with mode: 0644]
kern/arch/i686/apic.h [new file with mode: 0644]
kern/arch/i686/arch.h [new file with mode: 0644]
kern/arch/i686/atomic.h [new file with mode: 0644]
kern/arch/i686/bitmask.h [new file with mode: 0644]
kern/arch/i686/boot/Makefrag [new file with mode: 0644]
kern/arch/i686/boot/boot.S [new file with mode: 0644]
kern/arch/i686/boot/main.c [new file with mode: 0644]
kern/arch/i686/boot/sign.pl [new file with mode: 0644]
kern/arch/i686/colored_caches.c [new file with mode: 0644]
kern/arch/i686/colored_page_alloc.h [new file with mode: 0644]
kern/arch/i686/console.c [new file with mode: 0644]
kern/arch/i686/console.h [new file with mode: 0644]
kern/arch/i686/cpuinfo.c [new file with mode: 0644]
kern/arch/i686/entry.S [new file with mode: 0644]
kern/arch/i686/env.c [new file with mode: 0644]
kern/arch/i686/init.c [new file with mode: 0644]
kern/arch/i686/init.h [new file with mode: 0644]
kern/arch/i686/ioapic.c [new file with mode: 0644]
kern/arch/i686/ioapic.h [new file with mode: 0644]
kern/arch/i686/kbdreg.h [new file with mode: 0644]
kern/arch/i686/kclock.c [new file with mode: 0644]
kern/arch/i686/kdebug.c [new file with mode: 0644]
kern/arch/i686/kernel.ld [new file with mode: 0644]
kern/arch/i686/membar.h [new file with mode: 0644]
kern/arch/i686/mmu.h [new file with mode: 0644]
kern/arch/i686/mptables.c [new file with mode: 0644]
kern/arch/i686/mptables.h [new file with mode: 0644]
kern/arch/i686/ne2k.c [new file with mode: 0644]
kern/arch/i686/ne2k.h [new file with mode: 0644]
kern/arch/i686/nic_common.c [new file with mode: 0644]
kern/arch/i686/nic_common.h [new file with mode: 0644]
kern/arch/i686/page_alloc.c [new file with mode: 0644]
kern/arch/i686/pci.c [new file with mode: 0644]
kern/arch/i686/pci.h [new file with mode: 0644]
kern/arch/i686/pmap.c [new file with mode: 0644]
kern/arch/i686/process.c [new file with mode: 0644]
kern/arch/i686/rl8168.c [new file with mode: 0644]
kern/arch/i686/rl8168.h [new file with mode: 0644]
kern/arch/i686/ros/hart.h [new file with mode: 0644]
kern/arch/i686/ros/mmu.h [new file with mode: 0644]
kern/arch/i686/ros/syscall.h [new file with mode: 0644]
kern/arch/i686/smp.c [new file with mode: 0644]
kern/arch/i686/smp.h [new file with mode: 0644]
kern/arch/i686/smp_boot.c [new file with mode: 0644]
kern/arch/i686/smp_entry.S [new file with mode: 0644]
kern/arch/i686/trap.c [new file with mode: 0644]
kern/arch/i686/trap.h [new file with mode: 0644]
kern/arch/i686/trapentry.S [new file with mode: 0644]
kern/arch/i686/types.h [new file with mode: 0644]
kern/arch/i686/x86.h [new file with mode: 0644]
kern/arch/sparc/Makefrag
kern/arch/sparc/console.c
kern/arch/sparc/frontend.c [deleted file]
kern/arch/sparc/frontend.h [deleted file]
kern/arch/sparc/process.c
kern/arch/sparc/syscalls.c [deleted file]
kern/include/frontend.h [new file with mode: 0644]
kern/src/Makefrag
kern/src/frontend.c [new file with mode: 0644]
kern/src/kfs.c
kern/src/manager.c
kern/src/syscall.c
tools/compilers/gcc-glibc/Makefile

index a5a2080..b424165 100644 (file)
@@ -12,8 +12,8 @@ OBJDIR := obj
 all: symlinks
 
 # User defined constants passed on the command line 
-TARGET_ARCH := i386
-COMPILER := IVY
+TARGET_ARCH := i686
+COMPILER := GCC
 
 -include Makelocal
 
@@ -28,22 +28,22 @@ V = @
 # Cross-compiler ros toolchain
 #
 # This Makefile will automatically use the cross-compiler toolchain
-# installed as 'i386-ros-*', if one exists.  If the host tools ('gcc',
+# installed as 'i686-ros-*', if one exists.  If the host tools ('gcc',
 # 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
 # be detected as well.  If you have the right compiler toolchain installed
 # using a different name, set GCCPREFIX explicitly in your Makelocal file
 
 # try to infer the correct GCCPREFIX
 ifndef GCCPREFIX
-GCCPREFIX := $(shell if i386-ros-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
-       then echo 'i386-ros-'; \
-       elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \
+GCCPREFIX := $(shell if i686-ros-objdump -i 2>&1 | grep '^elf32-i686$$' >/dev/null 2>&1; \
+       then echo 'i686-ros-'; \
+       elif objdump -i 2>&1 | grep 'elf32-i686' >/dev/null 2>&1; \
        then echo ''; \
        else echo "***" 1>&2; \
-       echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \
-       echo "*** Is the directory with i386-ros-gcc in your PATH?" 1>&2; \
-       echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
-       echo "*** prefix other than 'i386-ros-', set your GCCPREFIX" 1>&2; \
+       echo "*** Error: Couldn't find an i686-*-elf version of GCC/binutils." 1>&2; \
+       echo "*** Is the directory with i686-ros-gcc in your PATH?" 1>&2; \
+       echo "*** If your i686-*-elf toolchain is installed with a command" 1>&2; \
+       echo "*** prefix other than 'i686-ros-', set your GCCPREFIX" 1>&2; \
        echo "*** environment variable to that prefix and run 'make' again." 1>&2; \
        echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \
        echo "***" 1>&2; exit 1; fi)
diff --git a/kern/arch/i386/Makefrag b/kern/arch/i386/Makefrag
deleted file mode 100644 (file)
index 347cf95..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# Makefile fragment for ROS kernel.
-# This is NOT a complete makefile;
-# you must run GNU make in the top-level directory
-# where the GNUmakefile is located.
-#
-
-KERN_ARCH_SRC_DIR = $(KERN_DIR)/arch/$(TARGET_ARCH)
-OBJDIRS += $(KERN_ARCH_SRC_DIR)
-
-# 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
-# from the lib directory, to avoid gratuitous code duplication.
-KERN_ARCH_SRCFILES := $(KERN_ARCH_SRC_DIR)/entry.S \
-                      $(KERN_ARCH_SRC_DIR)/smp_entry.S \
-                      $(KERN_ARCH_SRC_DIR)/cpuinfo.c \
-                      $(KERN_ARCH_SRC_DIR)/console.c \
-                      $(KERN_ARCH_SRC_DIR)/smp_boot.c \
-                      $(KERN_ARCH_SRC_DIR)/colored_caches.c \
-                      $(KERN_ARCH_SRC_DIR)/page_alloc.c \
-                      $(KERN_ARCH_SRC_DIR)/pmap.c \
-                      $(KERN_ARCH_SRC_DIR)/trapentry.S \
-                      $(KERN_ARCH_SRC_DIR)/trap.c \
-                      $(KERN_ARCH_SRC_DIR)/kclock.c \
-                      $(KERN_ARCH_SRC_DIR)/smp.c \
-                      $(KERN_ARCH_SRC_DIR)/apic.c \
-                      $(KERN_ARCH_SRC_DIR)/kdebug.c \
-                      $(KERN_ARCH_SRC_DIR)/process.c \
-                      $(KERN_ARCH_SRC_DIR)/mptables.c \
-                      $(KERN_ARCH_SRC_DIR)/pci.c \
-                      $(KERN_ARCH_SRC_DIR)/ioapic.c \
-                      $(KERN_ARCH_SRC_DIR)/rl8168.c \
-                      $(KERN_ARCH_SRC_DIR)/ne2k.c \
-                      $(KERN_ARCH_SRC_DIR)/nic_common.c \
-                      $(KERN_ARCH_SRC_DIR)/init.c \
-                      $(KERN_ARCH_SRC_DIR)/env.c
diff --git a/kern/arch/i386/apic.c b/kern/arch/i386/apic.c
deleted file mode 100644 (file)
index 57bbee8..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#define SINIT(x) x
-#endif
-
-#include <arch/mmu.h>
-#include <arch/x86.h>
-#include <arch/arch.h>
-#include <arch/apic.h>
-#include <ros/timer.h>
-#include <assert.h>
-#include <stdio.h>
-
-system_timing_t RO system_timing = {0, 0, 0xffff, 0};
-
-/*
- * Remaps the Programmable Interrupt Controller to use IRQs 32-47
- * http://wiki.osdev.org/PIC
- * Not 100% on this stuff, after looking over 
- * http://bochs.sourceforge.net/techspec/PORTS.LST  The cascading and other 
- * stuff might need to be in one command, and after that all we are doing
- * is toggling masks.
- */
-void pic_remap() 
-{
-       // start initialization
-       outb(PIC1_CMD, 0x11);
-       outb(PIC2_CMD, 0x11);
-       // set new offsets
-       outb(PIC1_DATA, PIC1_OFFSET);
-       outb(PIC2_DATA, PIC2_OFFSET);
-       // set up cascading
-       outb(PIC1_DATA, 0x04);
-       outb(PIC2_DATA, 0x02);
-       // other stuff (put in 8086/88 mode, or whatever)
-       outb(PIC1_DATA, 0x01);
-       outb(PIC2_DATA, 0x01);
-       // set masks, defaulting to all masked for now
-       outb(PIC1_DATA, 0xff);
-       outb(PIC2_DATA, 0xff);
-}
-
-void pic_mask_irq(uint8_t irq)
-{
-       if (irq > 7)
-               outb(PIC2_DATA, inb(PIC2_DATA) | (1 << (irq - 8)));
-       else
-               outb(PIC1_DATA, inb(PIC1_DATA) | (1 << irq));
-}
-
-void pic_unmask_irq(uint8_t irq)
-{
-       if (irq > 7) {
-               outb(PIC2_DATA, inb(PIC2_DATA) & ~(1 << (irq - 8)));
-               outb(PIC1_DATA, inb(PIC1_DATA) & 0xfb); // make sure irq2 is unmasked
-       } else
-               outb(PIC1_DATA, inb(PIC1_DATA) & ~(1 << irq));
-}
-
-/*
- * Sets the LAPIC timer to go off after a certain number of ticks.  The primary
- * clock freq is actually the bus clock, which we figure out during timer_init
- * Unmasking is implied.  Ref SDM, 3A, 9.6.4
- */
-void __lapic_set_timer(uint32_t ticks, uint8_t vec, bool periodic, uint8_t div)
-{
-       // clears bottom bit and then set divider
-       write_mmreg32(LAPIC_TIMER_DIVIDE, (read_mmreg32(LAPIC_TIMER_DIVIDE) &~0xf) |
-                     (div & 0xf));
-       // set LVT with interrupt handling information
-       write_mmreg32(LAPIC_LVT_TIMER, vec | (periodic << 17));
-       write_mmreg32(LAPIC_TIMER_INIT, ticks);
-       // For debugging when we expand this
-       //cprintf("LAPIC LVT Timer: 0x%08x\n", read_mmreg32(LAPIC_LVT_TIMER));
-       //cprintf("LAPIC Init Count: 0x%08x\n", read_mmreg32(LAPIC_TIMER_INIT));
-       //cprintf("LAPIC Current Count: 0x%08x\n", read_mmreg32(LAPIC_TIMER_CURRENT));
-}
-
-void lapic_set_timer(uint32_t usec, bool periodic)
-{
-       // divide the bus clock by 128, which is the max.
-       uint32_t ticks = (usec * system_timing.bus_freq / 128) / 1000000;
-       __lapic_set_timer(ticks, LAPIC_TIMER_DEFAULT_VECTOR, periodic,
-                         LAPIC_TIMER_DEFAULT_DIVISOR);
-}
-
-void set_timer(uint32_t usec)
-{
-       if (usec)
-               lapic_set_timer(usec, TRUE);
-       else
-               lapic_disable_timer();
-}
-
-uint32_t lapic_get_default_id(void)
-{
-       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;
-}
-
-// timer init calibrates both tsc timer and lapic timer using PIT
-void timer_init(void){
-       uint64_t tscval[2];
-       long timercount[2];
-       pit_set_timer(0xffff, TIMER_RATEGEN);
-       // assume tsc exist
-       tscval[0] = read_tsc();
-       udelay_pit(1000000);
-       tscval[1] = read_tsc();
-       system_timing.tsc_freq = SINIT(tscval[1] - tscval[0]);
-       
-       cprintf("TSC Frequency: %llu\n", system_timing.tsc_freq);
-
-       __lapic_set_timer(0xffffffff, LAPIC_TIMER_DEFAULT_VECTOR, FALSE,
-                         LAPIC_TIMER_DEFAULT_DIVISOR);
-       // Mask the LAPIC Timer, so we never receive this interrupt (minor race)
-       mask_lapic_lvt(LAPIC_LVT_TIMER);
-       timercount[0] = read_mmreg32(LAPIC_TIMER_CURRENT);
-       udelay_pit(1000000);
-       timercount[1] = read_mmreg32(LAPIC_TIMER_CURRENT);
-       system_timing.bus_freq = SINIT((timercount[0] - timercount[1])*128);
-               
-       cprintf("Bus Frequency: %llu\n", system_timing.bus_freq);
-}
-
-void pit_set_timer(uint32_t divisor, uint32_t mode)
-{
-       if (divisor & 0xffff0000)
-               warn("Divisor too large!");
-       mode = TIMER_SEL0|TIMER_16BIT|mode;
-       outb(TIMER_MODE, mode); 
-       outb(TIMER_CNTR0, divisor & 0xff);
-       outb(TIMER_CNTR0, (divisor >> 8) );
-       system_timing.pit_mode = SINIT(mode);
-       system_timing.pit_divisor = SINIT(divisor);
-       // cprintf("timer mode set to %d, divisor %d\n",mode, divisor);
-}
-
-static int getpit()
-{
-    int high, low;
-       // TODO: need a lock to protect access to PIT
-
-    /* Select timer0 and latch counter value. */
-    outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
-    
-    low = inb(TIMER_CNTR0);
-    high = inb(TIMER_CNTR0);
-
-    return ((high << 8) | low);
-}
-
-// forces cpu to relax for usec miliseconds.  declared in kern/include/timing.h
-void udelay(uint64_t usec)
-{
-       #if !defined(__BOCHS__)
-       if (system_timing.tsc_freq != 0)
-       {
-               uint64_t start, end, now;
-
-               start = read_tsc();
-        end = start + (system_timing.tsc_freq * usec) / 1000000;
-        //cprintf("start %llu, end %llu\n", start, end);
-               if (end == 0) cprintf("This is terribly wrong \n");
-               do {
-            cpu_relax();
-            now = read_tsc();
-                       //cprintf("now %llu\n", now);
-               } while (now < end || (now > start && end < start));
-        return;
-
-       } else
-       #endif
-       {
-               udelay_pit(usec);
-       }
-}
-
-void udelay_pit(uint64_t usec)
-{
-       
-       int64_t delta, prev_tick, tick, ticks_left;
-       prev_tick = getpit();
-       /*
-        * Calculate (n * (i8254_freq / 1e6)) without using floating point
-        * and without any avoidable overflows.
-        */
-       if (usec <= 0)
-               ticks_left = 0;
-       // some optimization from bsd code
-       else if (usec < 256)
-               /*
-                * Use fixed point to avoid a slow division by 1000000.
-                * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest.
-                * 2^15 is the first power of 2 that gives exact results
-                * for n between 0 and 256.
-                */
-               ticks_left = ((uint64_t)usec * 39099 + (1 << 15) - 1) >> 15;
-       else
-               // round up the ticks left
-               ticks_left = ((uint64_t)usec * (long long)PIT_FREQ+ 999999)
-                            / 1000000; 
-       while (ticks_left > 0) {
-               tick = getpit();
-               delta = prev_tick - tick;
-               prev_tick = tick;
-               if (delta < 0) {
-                       // counter looped around during the delta time period
-                       delta += system_timing.pit_divisor; // maximum count 
-                       if (delta < 0)
-                               delta = 0;
-               }
-               ticks_left -= delta;
-       }
-}
-
-uint64_t gettimer(void)
-{
-       return read_tsc();      
-}
-
-uint64_t getfreq(void)
-{
-       return system_timing.tsc_freq;
-}
-
diff --git a/kern/arch/i386/apic.h b/kern/arch/i386/apic.h
deleted file mode 100644 (file)
index aa5d7b2..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- */
-
-#ifndef ROS_KERN_APIC_H
-#define ROS_KERN_APIC_H
-
-/* 
- * Functions and definitions for dealing with the APIC and PIC, specific to
- * Intel.  Does not handle an x2APIC.
- */
-
-#include <arch/mmu.h>
-#include <arch/x86.h>
-#include <arch/ioapic.h>
-
-// PIC
-#define PIC1_CMD                                       0x20
-#define PIC1_DATA                                      0x21
-#define PIC2_CMD                                       0xA0
-#define PIC2_DATA                                      0xA1
-// These are also hardcoded into the IRQ_HANDLERs of kern/trapentry.S
-#define PIC1_OFFSET                                    0x20
-#define PIC2_OFFSET                                    0x28
-#define PIC_EOI                                                0x20
-
-// Local APIC
-#define LAPIC_BASE                                     0xfee00000 // this is the default, can be changed
-#define LAPIC_EOI                                      (LAPIC_BASE + 0x0b0)
-#define LAPIC_SPURIOUS                         (LAPIC_BASE + 0x0f0)
-#define LAPIC_VERSION                          (LAPIC_BASE + 0x030)
-#define LAPIC_ERROR                                    (LAPIC_BASE + 0x280)
-#define LAPIC_ID                                       (LAPIC_BASE + 0x020)
-#define LAPIC_LOGICAL_ID                       (LAPIC_BASE + 0x0d0)
-// LAPIC Local Vector Table
-#define LAPIC_LVT_TIMER                                (LAPIC_BASE + 0x320)
-#define LAPIC_LVT_LINT0                                (LAPIC_BASE + 0x350)
-#define LAPIC_LVT_LINT1                                (LAPIC_BASE + 0x360)
-#define LAPIC_LVT_ERROR                                (LAPIC_BASE + 0x370)
-#define LAPIC_LVT_PERFMON                      (LAPIC_BASE + 0x340)
-#define LAPIC_LVT_THERMAL                      (LAPIC_BASE + 0x330)
-#define LAPIC_LVT_MASK                         0x00010000
-// LAPIC Timer
-#define LAPIC_TIMER_INIT                       (LAPIC_BASE + 0x380)
-#define LAPIC_TIMER_CURRENT                    (LAPIC_BASE + 0x390)
-#define LAPIC_TIMER_DIVIDE                     (LAPIC_BASE + 0x3e0)
-#define LAPIC_TIMER_DEFAULT_VECTOR     0xeb
-#define LAPIC_TIMER_DEFAULT_DIVISOR    0xa // This is 128.  Ref SDM 3.a 9.6.4
-// IPI Interrupt Command Register
-#define LAPIC_IPI_ICR_LOWER                    (LAPIC_BASE + 0x300)
-#define LAPIC_IPI_ICR_UPPER                    (LAPIC_BASE + 0x310)
-
-// PIT (Programmable Interval Timer)
-#define        TIMER_REG_CNTR0 0       /* timer 0 counter port */
-#define        TIMER_REG_CNTR1 1       /* timer 1 counter port */
-#define        TIMER_REG_CNTR2 2       /* timer 2 counter port */
-#define        TIMER_REG_MODE  3       /* timer mode port */
-#define        TIMER_SEL0      0x00    /* select counter 0 */
-#define        TIMER_SEL1      0x40    /* select counter 1 */
-#define        TIMER_SEL2      0x80    /* select counter 2 */
-#define        TIMER_INTTC     0x00    /* mode 0, intr on terminal cnt */
-#define        TIMER_ONESHOT   0x02    /* mode 1, one shot */
-#define        TIMER_RATEGEN   0x04    /* mode 2, rate generator */
-#define        TIMER_SQWAVE    0x06    /* mode 3, square wave */
-#define        TIMER_SWSTROBE  0x08    /* mode 4, s/w triggered strobe */
-#define        TIMER_HWSTROBE  0x0a    /* mode 5, h/w triggered strobe */
-#define        TIMER_LATCH     0x00    /* latch counter for reading */
-#define        TIMER_LSB       0x10    /* r/w counter LSB */
-#define        TIMER_MSB       0x20    /* r/w counter MSB */
-#define        TIMER_16BIT     0x30    /* r/w counter 16 bits, LSB first */
-#define        TIMER_BCD       0x01    /* count in BCD */
-
-#define PIT_FREQ                                       1193182
-
-#define IO_TIMER1   0x40        /* 8253 Timer #1 */
-#define TIMER_CNTR0 (IO_TIMER1 + TIMER_REG_CNTR0)
-#define TIMER_CNTR1 (IO_TIMER1 + TIMER_REG_CNTR1)
-#define TIMER_CNTR2 (IO_TIMER1 + TIMER_REG_CNTR2)
-#define TIMER_MODE  (IO_TIMER1 + TIMER_REG_MODE)
-
-typedef struct system_timing {
-       uint64_t tsc_freq;
-       uint64_t bus_freq;
-       uint16_t pit_divisor;
-       uint8_t pit_mode;
-} system_timing_t;
-
-extern system_timing_t system_timing;
-
-void pic_remap(void);
-void pic_mask_irq(uint8_t irq);
-void pic_unmask_irq(uint8_t irq);
-void __lapic_set_timer(uint32_t ticks, uint8_t vec, bool periodic, uint8_t div);
-void lapic_set_timer(uint32_t usec, bool periodic);
-uint32_t lapic_get_default_id(void);
-// PIT related
-void pit_set_timer(uint32_t freq, uint32_t mode);
-void timer_init(void);
-void udelay_pit(uint64_t usec);
-// TODO: right now timer defaults to TSC
-uint64_t gettimer(void);
-uint64_t getfreq(void);
-
-static inline void pic_send_eoi(uint32_t irq);
-static inline void lapic_send_eoi(void);
-static inline uint32_t lapic_get_version(void);
-static inline uint32_t lapic_get_error(void);
-static inline uint32_t lapic_get_id(void);
-static inline void lapic_set_id(uint8_t id); // Careful, may not actually work
-static inline uint8_t lapic_get_logid(void);
-static inline void lapic_set_logid(uint8_t id);
-static inline void lapic_disable_timer(void);
-static inline void lapic_disable(void);
-static inline void lapic_enable(void);
-static inline void lapic_wait_to_send(void);
-static inline void send_init_ipi(void);
-static inline void send_startup_ipi(uint8_t vector);
-static inline void send_self_ipi(uint8_t vector);
-static inline void send_broadcast_ipi(uint8_t vector);
-static inline void send_all_others_ipi(uint8_t vector);
-static inline void send_ipi(uint8_t hw_coreid, uint8_t vector);
-static inline void send_group_ipi(uint8_t hw_groupid, uint8_t vector);
-
-#define mask_lapic_lvt(entry) \
-       write_mmreg32(entry, read_mmreg32(entry) | LAPIC_LVT_MASK)
-#define unmask_lapic_lvt(entry) \
-       write_mmreg32(entry, read_mmreg32(entry) & ~LAPIC_LVT_MASK)
-
-static inline void pic_send_eoi(uint32_t irq)
-{
-       // all irqs beyond the first seven need to be chained to the slave
-       if (irq > 7)
-               outb(PIC2_CMD, PIC_EOI);
-       outb(PIC1_CMD, PIC_EOI);
-}
-
-static inline void lapic_send_eoi(void)
-{
-       write_mmreg32(LAPIC_EOI, 0);
-}
-
-static inline uint32_t lapic_get_version(void)
-{
-       return read_mmreg32(LAPIC_VERSION);     
-}
-
-static inline uint32_t lapic_get_error(void)
-{
-       write_mmreg32(LAPIC_ERROR, 0xdeadbeef);
-       return read_mmreg32(LAPIC_ERROR);
-}
-
-static inline uint32_t lapic_get_id(void)
-{
-       return read_mmreg32(LAPIC_ID) >> 24;
-}
-
-static inline void lapic_set_id(uint8_t id)
-{
-       write_mmreg32(LAPIC_ID, id << 24);
-}
-
-static inline uint8_t lapic_get_logid(void)
-{
-       return read_mmreg32(LAPIC_LOGICAL_ID) >> 24;
-}
-
-static inline void lapic_set_logid(uint8_t id)
-{
-       write_mmreg32(LAPIC_LOGICAL_ID, id << 24);
-}
-
-static inline void lapic_disable_timer(void)
-{
-       write_mmreg32(LAPIC_LVT_TIMER, 0);
-}
-
-/* There are a couple ways to do it.  The MSR route doesn't seem to work
- * in KVM.  It's also a somewhat permanent thing
- */
-static inline void lapic_disable(void)
-{
-       write_mmreg32(LAPIC_SPURIOUS, read_mmreg32(LAPIC_SPURIOUS) & 0xffffefff);
-       //write_msr(IA32_APIC_BASE, read_msr(IA32_APIC_BASE) & ~MSR_APIC_ENABLE);
-}
-
-/* Spins until previous IPIs are delivered.  Not sure if we want it inlined
- * Also not sure when we really need to do this. 
- */
-static inline void lapic_wait_to_send(void)
-{
-       while(read_mmreg32(LAPIC_IPI_ICR_LOWER) & 0x1000)
-               __cpu_relax();
-}
-
-static inline void lapic_enable(void)
-{
-       write_mmreg32(LAPIC_SPURIOUS, read_mmreg32(LAPIC_SPURIOUS) | 0x00000100);
-}
-
-static inline void send_init_ipi(void)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4500);
-}
-
-static inline void send_startup_ipi(uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4600 | vector);
-}
-
-static inline void send_self_ipi(uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00044000 | vector);
-}
-
-static inline void send_broadcast_ipi(uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00084000 | vector);
-}
-
-static inline void send_all_others_ipi(uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4000 | vector);
-}
-
-static inline void __send_ipi(uint8_t hw_coreid, uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_coreid << 24);
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00004000 | vector);
-}
-
-static inline void send_ipi(uint8_t hw_coreid, uint8_t vector)
-{
-       /* 255 is a broadcast, which should use send_broadcast_ipi, and it is also
-        * what would come in if you tried sending an IPI to an os_coreid that
-        * doesn't exist (since they are initialized to -1). */
-       if (hw_coreid == 255)
-               return;
-       __send_ipi(hw_coreid, vector);
-}
-
-static inline void send_group_ipi(uint8_t hw_groupid, uint8_t vector)
-{
-       lapic_wait_to_send();
-       write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_groupid << 24);
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00004800 | vector);
-}
-
-/* To change the LAPIC Base (not recommended):
-       msr_val = read_msr(IA32_APIC_BASE);
-       msr_val = msr_val & ~MSR_APIC_BASE_ADDRESS | 0xfaa00000;
-       write_msr(IA32_APIC_BASE, msr_val);
-*/
-#endif /* ROS_KERN_APIC_H */
diff --git a/kern/arch/i386/arch.h b/kern/arch/i386/arch.h
deleted file mode 100644 (file)
index f9e812c..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-#ifndef ROS_INC_ARCH_H
-#define ROS_INC_ARCH_H
-
-#include <ros/common.h>
-#include <arch/x86.h>
-#include <arch/trap.h>
-#include <arch/apic.h>
-
-/* Arch Constants */
-#define MAX_NUM_CPUS                           255
-#define HW_CACHE_ALIGN                          64
-
-static __inline void breakpoint(void) __attribute__((always_inline));
-static __inline void invlpg(void *SNT addr) __attribute__((always_inline));
-static __inline void tlbflush(void) __attribute__((always_inline));
-static __inline uint64_t read_tsc(void) __attribute__((always_inline));
-static __inline uint64_t read_tsc_serialized(void) __attribute__((always_inline));
-static __inline void enable_irq(void) __attribute__((always_inline));
-static __inline void disable_irq(void) __attribute__((always_inline));
-static __inline void enable_irqsave(int8_t* state) __attribute__((always_inline));
-static __inline void disable_irqsave(int8_t* state) __attribute__((always_inline));
-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 int get_hw_coreid(int coreid);
-static __inline int hw_core_id(void) __attribute__((always_inline));
-static __inline int get_os_coreid(int hw_coreid);
-static __inline int 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));
-
-void print_cpuinfo(void);
-void show_mapping(uintptr_t start, size_t size);
-void backtrace(void);
-
-/* declared in smp.c */
-int hw_coreid_lookup[MAX_NUM_CPUS];
-int os_coreid_lookup[MAX_NUM_CPUS];
-
-static __inline void
-breakpoint(void)
-{
-       __asm __volatile("int3");
-}
-
-static __inline void 
-invlpg(void *addr)
-{ 
-       __asm __volatile("invlpg (%0)" : : "r" (addr) : "memory");
-}  
-
-static __inline void
-tlbflush(void)
-{
-       uint32_t cr3;
-       __asm __volatile("movl %%cr3,%0" : "=r" (cr3));
-       __asm __volatile("movl %0,%%cr3" : : "r" (cr3));
-}
-
-static __inline uint64_t
-read_tsc(void)
-{
-       uint64_t tsc;
-       __asm __volatile("rdtsc" : "=A" (tsc));
-       return tsc;
-}
-
-static __inline uint64_t 
-read_tsc_serialized(void)
-{
-    uint64_t tsc;
-       cpuid(0, 0, 0, 0, 0);
-       tsc = read_tsc();
-       return tsc;
-}
-
-static __inline void
-enable_irq(void)
-{
-       asm volatile("sti");
-}
-
-static __inline void
-disable_irq(void)
-{
-       asm volatile("cli");
-}
-
-static __inline void
-enable_irqsave(int8_t* state)
-{
-       // *state tracks the number of nested enables and disables
-       // initial value of state: 0 = first run / no favorite
-       // > 0 means more enabled calls have been made
-       // < 0 means more disabled calls have been made
-       // Mostly doing this so we can call disable_irqsave first if we want
-
-       // one side or another "gets a point" if interrupts were already the
-       // way it wanted to go.  o/w, state stays at 0.  if the state was not 0
-       // then, enabling/disabling isn't even an option.  just increment/decrement
-
-       // if enabling is winning or tied, make sure it's enabled
-       if ((*state == 0) && !irq_is_enabled())
-               enable_irq();
-       else
-               (*state)++;
-}
-
-static __inline void
-disable_irqsave(int8_t* state)
-{
-       if ((*state == 0) && irq_is_enabled())
-               disable_irq();
-       else 
-               (*state)--;
-}
-
-static __inline void
-cpu_relax(void)
-{
-       __cpu_relax();
-}
-
-static __inline void
-cpu_halt(void)
-{
-       asm volatile("hlt" : : : "memory");
-}
-
-static __inline void
-clflush(uintptr_t* addr)
-{
-       asm volatile("clflush %0" : : "m"(*addr));
-}
-
-static __inline int
-irq_is_enabled(void)
-{
-       return read_eflags() & FL_IF;
-}
-
-/* os_coreid -> hw_coreid */
-static __inline int
-get_hw_coreid(int coreid)
-{
-       return hw_coreid_lookup[coreid];
-}
-
-static __inline int
-hw_core_id(void)
-{
-       return lapic_get_id();
-}
-
-/* hw_coreid -> os_coreid */
-static __inline int
-get_os_coreid(int hw_coreid)
-{
-       return os_coreid_lookup[hw_coreid];
-}
-
-/* core_id() returns the OS core number, not to be confused with the
- * hardware-specific core identifier (such as the lapic id) returned by
- * hw_core_id() */
-static __inline int
-core_id(void)
-{
-       return get_os_coreid(hw_core_id());
-}
-
-static __inline void
-cache_flush(void)
-{
-       wbinvd();
-}
-
-static __inline void
-reboot(void)
-{
-       outb(0x92, 0x3);
-       asm volatile ("movl $0, %esp; int $0");
-       while(1);
-}
-
-#endif /* !ROS_INC_ARCH_H */
diff --git a/kern/arch/i386/atomic.h b/kern/arch/i386/atomic.h
deleted file mode 100644 (file)
index a88ef24..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#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>
-#include <arch/membar.h>
-
-typedef void * RACY atomic_t;
-struct spinlock {
-       volatile uint32_t RACY rlock;
-#ifdef SPINLOCK_DEBUG
-       void *call_site;        
-       uint32_t calling_core;
-#endif
-};
-typedef struct spinlock RACY spinlock_t;
-#define SPINLOCK_INITIALIZER {0}
-
-static inline void atomic_init(atomic_t *number, int32_t val);
-static inline int32_t atomic_read(atomic_t *number);
-static inline void atomic_set(atomic_t *number, int32_t val);
-static inline void atomic_inc(atomic_t *number);
-static inline void atomic_dec(atomic_t *number);
-static inline void atomic_andb(volatile uint8_t RACY* number, uint8_t mask);
-static inline void atomic_orb(volatile uint8_t RACY* number, uint8_t mask);
-static inline uint32_t spin_locked(spinlock_t *SAFE lock);
-static inline void __spin_lock(volatile uint32_t SRACY*CT(1) rlock);
-static inline void spin_lock(spinlock_t *lock);
-static inline void spin_unlock(spinlock_t *lock);
-static inline void spinlock_init(spinlock_t *lock);
-void spinlock_debug(spinlock_t *lock);
-
-/* Inlined functions declared above */
-static inline void atomic_init(atomic_t *number, int32_t val)
-{
-       asm volatile("movl %1,%0" : "=m"(*number) : "r"(val));
-}
-
-static inline int32_t atomic_read(atomic_t *number)
-{
-       int32_t val;
-       asm volatile("movl %1,%0" : "=r"(val) : "m"(*number));
-       return val;
-}
-
-static inline void atomic_set(atomic_t *number, int32_t val)
-{
-       asm volatile("movl %1,%0" : "=m"(*number) : "r"(val));
-}
-
-// need to do this with pointers and deref.  %0 needs to be the memory address
-static inline void atomic_inc(atomic_t *number)
-{
-       asm volatile("lock incl %0" : "=m"(*number) : : "cc");
-}
-
-static inline void atomic_dec(atomic_t *number)
-{
-       asm volatile("lock decl %0" : "=m"(*number) : : "cc");
-}
-
-static inline void atomic_andb(volatile uint8_t RACY*number, uint8_t mask)
-{
-       asm volatile("lock andb %1,%0" : "=m"(*number) : "r"(mask) : "cc");
-}
-
-static inline void atomic_orb(volatile uint8_t RACY*number, uint8_t mask)
-{
-       asm volatile("lock orb %1,%0" : "=m"(*number) : "r"(mask) : "cc");
-}
-
-static inline uint32_t spin_locked(spinlock_t *SAFE lock)
-{
-       // the lock status is the lowest byte of the lock
-       return lock->rlock & 0xff;
-}
-
-static inline void __spin_lock(volatile uint32_t *rlock)
-{
-       asm volatile(
-                       "1:                       "
-                       "       cmpb $0, %0;          "
-                       "       je 2f;                "
-                       "       pause;                "
-                       "       jmp 1b;               "
-                       "2:                       " 
-                       "       movb $1, %%al;        "
-                       "       xchgb %%al, %0;       "
-                       "       cmpb $0, %%al;        "
-                       "       jne 1b;               "
-               : : "m"(*rlock) : "eax", "cc");
-}
-
-static inline void spin_lock(spinlock_t *lock)
-{
-       __spin_lock(&lock->rlock);
-#ifdef SPINLOCK_DEBUG
-       lock->call_site = (void RACY*CT(1))TC(read_eip());
-       lock->calling_core = core_id();
-#endif
-}
-
-static inline void spin_unlock(spinlock_t *lock)
-{
-       lock->rlock = 0;
-}
-
-static inline void spinlock_init(spinlock_t *lock)
-#ifdef SPINLOCK_DEBUG
-WRITES(lock->rlock,lock->call_site,lock->calling_core)
-#else
-WRITES(lock->rlock)
-#endif
-{
-       lock->rlock = 0;
-#ifdef SPINLOCK_DEBUG
-       lock->call_site = 0;
-       lock->calling_core = 0;
-#endif
-}
-
-#endif /* !ROS_INCLUDE_ATOMIC_H */
diff --git a/kern/arch/i386/bitmask.h b/kern/arch/i386/bitmask.h
deleted file mode 100644 (file)
index a775d9d..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-#ifndef ROS_ARCH_BITMASK_H
-#define ROS_ARCH_BITMASK_H
-
-#ifndef __IVY__
-#include <ros/noivy.h>
-#endif
-
-#include <string.h>
-#include <sys/types.h>
-#include <atomic.h>
-#include <stdio.h>
-
-#define DECL_BITMASK(name, size) \
-       uint8_t (name)[BYTES_FOR_BITMASK((size))]
-
-#define BYTES_FOR_BITMASK(size) \
-       (((size) - 1) / 8 + 1)
-
-#define BYTES_FOR_BITMASK_WITH_CHECK(size) \
-       ((size) ? ((size) - (1)) / (8) + (1) : (0))
-
-static bool GET_BITMASK_BIT(uint8_t* name, size_t bit) 
-{
-       return (((name)[(bit)/8] & (1 << ((bit) % 8))) ? 1 : 0);
-}
-
-#define SET_BITMASK_BIT(name, bit) \
-       ((name)[(bit)/8] |= (1 << ((bit) % 8)));
-/*
-static void SET_BITMASK_BIT(uint8_t* name, size_t bit)
-{
-       ((name)[(bit)/8] |= (1 << ((bit) % 8)));
-}
-*/
-
-#define CLR_BITMASK_BIT(name, bit) \
-       ((name)[(bit)/8] &= ~(1 << ((bit) % 8)));
-/*
-static void CLR_BITMASK_BIT(uint8_t* name, size_t bit) 
-{
-       ((name)[(bit)/8] &= ~(1 << ((bit) % 8)));
-}
-*/
-
-static void SET_BITMASK_BIT_ATOMIC(uint8_t* name, size_t bit) 
-{
-       (atomic_orb(&(name)[(bit)/8], (1 << ((bit) % 8))));
-}
-
-#define CLR_BITMASK_BIT_ATOMIC(name, bit) \
-       (atomic_andb(&(name)[(bit)/8], ~(1 << ((bit) % 8))))
-
-#define CLR_BITMASK(name, size) \
-({ \
-       {TRUSTEDBLOCK \
-       memset((void*)((uintptr_t)(name)), 0, BYTES_FOR_BITMASK((size))); \
-       } \
-})
-
-#define FILL_BITMASK(name, size) \
-({ \
-       {TRUSTEDBLOCK \
-       memset((void*)((uintptr_t)(name)), 255, BYTES_FOR_BITMASK((size))); \
-       } \
-       (name)[BYTES_FOR_BITMASK((size))-1] >>= (((size) % 8) ? (8 - ((size) % 8)) : 0 ); \
-}) 
-
-#define COPY_BITMASK(newmask, oldmask, size) \
-({ \
-       {TRUSTEDBLOCK \
-       memcpy((void*)((uintptr_t)(newmask)), \
-           (void*)((uintptr_t)(oldmask)), \
-           BYTES_FOR_BITMASK((size))); \
-       } \
-})
-
-// this checks the entire last byte, so keep it 0 in the other macros
-#define BITMASK_IS_CLEAR(name, size) ({ \
-       uint32_t __n = BYTES_FOR_BITMASK((size)); \
-       bool clear = 1; \
-       while (__n-- > 0) { \
-               if ((name)[__n]) { \
-                       clear = 0; \
-                       break;\
-               }\
-       } \
-       clear; })
-
-static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
-{
-       int _size = size;
-       for (int i = 0; i < BYTES_FOR_BITMASK(size); i++) {
-               for (int j = 0; j < MIN(8,_size); j++)
-                       if(!((map[i] >> j) &1))
-                               return FALSE;
-                       _size--;
-       }
-       return TRUE;
-}
-
-#define PRINT_BITMASK(name, size) { \
-       int i;  \
-       int _size = size; \
-       for (i = 0; i < BYTES_FOR_BITMASK(size); i++) { \
-               int j;  \
-               for (j = 0; j < MIN(8,_size); j++) \
-                       printk("%x", ((name)[i] >> j) & 1);     \
-                       _size--; \
-       } \
-       printk("\n"); \
-}
-
-static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(!GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               SET_BITMASK_BIT(m, i);
-       }
-}
-
-static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               CLR_BITMASK_BIT(m, i);
-       }
-}
-#endif /* ROS_ARCH_BITMASK_H */
diff --git a/kern/arch/i386/boot/Makefrag b/kern/arch/i386/boot/Makefrag
deleted file mode 100644 (file)
index 5ad892b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#\r
-# Makefile fragment for the ROS kernel.\r
-# This is NOT a complete makefile;\r
-# you must run GNU make in the top-level directory\r
-# where the GNUmakefile is located.\r
-#\r
-\r
-KERN_BOOT_DIR := $(KERN_DIR)/boot\r
-OBJDIRS += $(KERN_BOOT_DIR)\r
-\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
-\r
-$(OBJDIR)/$(KERN_BOOT_DIR)/%.o: $(KERN_BOOT_DIR)/%.c\r
-       @echo + cc [BOOT] $<\r
-       @mkdir -p $(@D)\r
-       $(V)$(CC) $(KERN_BOOT_CFLAGS) -c -o $@ $<\r
-\r
-$(OBJDIR)/$(KERN_BOOT_DIR)/%.o: $(KERN_BOOT_DIR)/%.S\r
-       @echo + as [BOOT] $<\r
-       @mkdir -p $(@D)\r
-       $(V)$(CC) $(KERN_BOOT_CFLAGS) -c -o $@ $<\r
-\r
-$(OBJDIR)/$(KERN_DIR)/boot: $(KERN_BOOT_OBJS)\r
-       @echo + ld [BOOT] $<\r
-       $(V)$(LD) $(KERN_BOOT_LDFLAGS) -o $@.out $^\r
-       $(V)$(OBJDUMP) -S $@.out >$@.asm\r
-       $(V)$(OBJCOPY) -S -O binary $@.out $@\r
-       $(V)perl $(KERN_BOOT_DIR)/sign.pl $(OBJDIR)/$(KERN_DIR)/boot\r
-\r
diff --git a/kern/arch/i386/boot/boot.S b/kern/arch/i386/boot/boot.S
deleted file mode 100644 (file)
index 22c2fef..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#include <arch/mmu.h>
-       
-.set PROT_MODE_CSEG,0x8                # code segment selector
-.set PROT_MODE_DSEG,0x10        # data segment selector
-.set CR0_PE_ON,0x1             # protected mode enable flag
-       
-###############################################################################
-# ENTRY POINT  
-#   This code should be stored in the first sector of the hard disk.
-#   After the BIOS initializes the hardware on startup or system reset,
-#   it loads this code at physical address 0x7c00 - 0x7d00 (512 bytes).
-#   Then the BIOS jumps to the beginning of it, address 0x7c00,
-#   while running in 16-bit real-mode (8086 compatibility mode).
-#   The Code Segment register (CS) is initially zero on entry.
-#      
-# This code switches into 32-bit protected mode so that all of
-# memory can accessed, then calls into C.
-###############################################################################
-       
-.globl start                                   # Entry point   
-start:         .code16                         # This runs in real mode
-               cli                             # Disable interrupts
-               cld                             # String operations increment
-
-               # Set up the important data segment registers (DS, ES, SS).
-               xorw    %ax,%ax                 # Segment number zero
-               movw    %ax,%ds                 # -> Data Segment
-               movw    %ax,%es                 # -> Extra Segment
-               movw    %ax,%ss                 # -> Stack Segment
-
-               # Set up the stack pointer, growing downward from 0x7c00.
-               movw    $start,%sp              # Stack Pointer
-       
-# Enable A20:
-#   For fascinating historical reasons (related to the fact that
-#   the earliest 8086-based PCs could only address 1MB of physical memory
-#   and subsequent 80286-based PCs wanted to retain maximum compatibility),
-#   physical address line 20 is tied to low when the machine boots.
-#   Obviously this a bit of a drag for us, especially when trying to
-#   address memory above 1MB.  This code undoes this.
-       
-seta20.1:      inb     $0x64,%al               # Get status
-               testb   $0x2,%al                # Busy?
-               jnz     seta20.1                # Yes
-               movb    $0xd1,%al               # Command: Write
-               outb    %al,$0x64               #  output port
-seta20.2:      inb     $0x64,%al               # Get status
-               testb   $0x2,%al                # Busy?
-               jnz     seta20.2                # Yes
-               movb    $0xdf,%al               # Enable
-               outb    %al,$0x60               #  A20
-
-# Switch from real to protected mode:
-#   Up until now, there's been no protection, so we've gotten along perfectly
-#   well without explicitly telling the processor how to translate addresses.
-#   When we switch to protected mode, this is no longer true!
-#   We need at least to set up some "segments" that tell the processor it's
-#   OK to run code at any address, or write to any address.
-#   The 'gdt' and 'gdtdesc' tables below define these segments.
-#   This code loads them into the processor.
-#   We need this setup to ensure the transition to protected mode is smooth.
-
-real_to_prot:  cli                     # Don't allow interrupts: mandatory,
-                                       # since we didn't set up an interrupt
-                                       # descriptor table for handling them
-               lgdt    gdtdesc         # load GDT: mandatory in protected mode
-               movl    %cr0, %eax      # Turn on protected mode
-               orl     $CR0_PE_ON, %eax
-               movl    %eax, %cr0
-
-               # CPU magic: jump to relocation, flush prefetch queue, and
-               # reload %cs.  Has the effect of just jmp to the next
-               # instruction, but simultaneously loads CS with
-               # $PROT_MODE_CSEG.
-               ljmp    $PROT_MODE_CSEG, $protcseg
-       
-               # we've switched to 32-bit protected mode; tell the assembler
-               # to generate code for that mode
-protcseg:      .code32
-               # Set up the protected-mode data segment registers
-               movw    $PROT_MODE_DSEG, %ax    # Our data segment selector
-               movw    %ax, %ds                # -> DS: Data Segment
-               movw    %ax, %es                # -> ES: Extra Segment
-               movw    %ax, %fs                # -> FS
-               movw    %ax, %gs                # -> GS
-               movw    %ax, %ss                # -> SS: Stack Segment
-       
-               call cmain                      # finish the boot load from C.
-                                               # cmain() should not return
-spin:          jmp spin                        # ..but in case it does, spin
-       
-               .p2align 2                      # force 4 byte alignment
-gdt:           SEG_NULL                                # null seg
-               SEG(STA_X|STA_R, 0x0, 0xffffffff)       # code seg
-               SEG(STA_W, 0x0, 0xffffffff)             # data seg
-       
-gdtdesc:       .word   0x17                    # sizeof(gdt) - 1
-               .long   gdt                     # address gdt
diff --git a/kern/arch/i386/boot/main.c b/kern/arch/i386/boot/main.c
deleted file mode 100644 (file)
index d2a7738..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
-#include <arch/x86.h>
-#include <arch/arch.h>
-#include <elf.h>
-
-/**********************************************************************
- * This a dirt simple boot loader, whose sole job is to boot
- * an elf kernel image from the first IDE hard disk.
- *
- * DISK LAYOUT
- *  * This program(boot.S and main.c) is the bootloader.  It should
- *    be stored in the first sector of the disk.
- * 
- *  * The 2nd sector onward holds the kernel image.
- *     
- *  * The kernel image must be in ELF format.
- *
- * BOOT UP STEPS       
- *  * when the CPU boots it loads the BIOS into memory and executes it
- *
- *  * the BIOS intializes devices, sets of the interrupt routines, and
- *    reads the first sector of the boot device(e.g., hard-drive) 
- *    into memory and jumps to it.
- *
- *  * Assuming this boot loader is stored in the first sector of the
- *    hard-drive, this code takes over...
- *
- *  * control starts in bootloader.S -- which sets up protected mode,
- *    and a stack so C code then run, then calls cmain()
- *
- *  * cmain() in this file takes over, reads in the kernel and jumps to it.
- **********************************************************************/
-
-#define SECTSIZE       512
-#define ELFHDR         ((elf_t *) 0x10000) // scratch space
-
-void readsect(void*, uint32_t);
-void readseg(uint32_t, uint32_t, uint32_t);
-
-void
-cmain(void)
-{
-       proghdr_t *ph, *eph;
-
-       // read 1st page off disk
-       readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
-
-       // is this a valid ELF?
-       if (ELFHDR->e_magic != ELF_MAGIC)
-               goto bad;
-
-       // load each program segment (ignores ph flags)
-       ph = (proghdr_t *) ((uint8_t *) ELFHDR + ELFHDR->e_phoff);
-       eph = ph + ELFHDR->e_phnum;
-       for (; ph < eph; ph++)
-               readseg(ph->p_va, ph->p_memsz, ph->p_offset);
-
-       // call the entry point from the ELF header
-       // note: does not return!
-       ((void (*)(void)) (ELFHDR->e_entry & 0x0FFFFFFF))();
-
-bad:
-       outw(0x8A00, 0x8A00);
-       outw(0x8A00, 0x8E00);
-       while (1)
-               /* do nothing */;
-}
-
-// Read 'count' bytes at 'offset' from kernel into virtual address 'va'.
-// Might copy more than asked
-void
-readseg(uint32_t va, uint32_t count, uint32_t offset)
-{
-       uint32_t end_va;
-
-       va &= 0x0FFFFFFF;
-       end_va = va + count;
-       
-       // round down to sector boundary
-       va &= ~(SECTSIZE - 1);
-
-       // translate from bytes to sectors, and kernel starts at sector 1
-       offset = (offset / SECTSIZE) + 1;
-
-       // If this is too slow, we could read lots of sectors at a time.
-       // We'd write more to memory than asked, but it doesn't matter --
-       // we load in increasing order.
-       while (va < end_va) {
-               readsect((uint8_t*) va, offset);
-               va += SECTSIZE;
-               offset++;
-       }
-}
-
-void
-waitdisk(void)
-{
-       // wait for disk ready
-       while ((inb(0x1F7) & 0xC0) != 0x40)
-               /* do nothing */;
-}
-
-void
-readsect(void *dst, uint32_t offset)
-{
-       // wait for disk to be ready
-       waitdisk();
-
-       /* the ISA uses a specified block of memory, 
-          addresses 0x1F0-0x1F7, that can use the special 
-          instructions inb/outb, as demonstrated in the 
-          following code in order to access the disk
-          Offset is 28 bytes long
-       */
-
-       outb(0x1F2, 1);                         // number of sectors to read
-       outb(0x1F3, offset);                    // bits 0-7 (low bits) of 28-bit offset
-       outb(0x1F4, offset >> 8);               // bits 8-15 of 28-bit offset
-       outb(0x1F5, offset >> 16);              // bits 16-23 of 28-bit offset
-       outb(0x1F6, (offset >> 24) | 0xE0);     // bits 24-27 of 28-bit offset
-                                               // bit 28 (= 0) means Disk 0
-                                               // other bits (29-31) must be set to one
-       outb(0x1F7, 0x20);                      // cmd 0x20 - read sectors
-
-       // wait for disk to be ready
-       waitdisk();
-
-       // read a sector
-       insl(0x1F0, dst, SECTSIZE/4);
-}
-
diff --git a/kern/arch/i386/boot/sign.pl b/kern/arch/i386/boot/sign.pl
deleted file mode 100644 (file)
index 8a65e9f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/perl
-
-open(SIG, $ARGV[0]) || die "open $ARGV[0]: $!";
-
-$n = sysread(SIG, $buf, 1000);
-
-if($n > 510){
-       print STDERR "boot block too large: $n bytes (max 510)\n";
-       exit 1;
-}
-
-print STDERR "boot block is $n bytes (max 510)\n";
-
-$buf .= "\0" x (510-$n);
-$buf .= "\x55\xAA";
-
-open(SIG, ">$ARGV[0]") || die "open >$ARGV[0]: $!";
-print SIG $buf;
-close SIG;
diff --git a/kern/arch/i386/colored_caches.c b/kern/arch/i386/colored_caches.c
deleted file mode 100644 (file)
index 78118dc..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2009 The Regents of the University  of California. 
- * See the COPYRIGHT files at the top of this source tree for full 
- * license information.
- * 
- * Kevin Klues <klueska@cs.berkeley.edu>    
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#define SINIT(x) x
-#endif
-
-#include <ros/error.h>
-#include <arch/bitmask.h>
-#include <colored_caches.h>
-#include <process.h>
-
-// Static global variable of caches to assign to the available caches struct
-static cache_t RO l1,l2,l3;
-
-// Convenient global variable for accessing the last level cache
-cache_t* llc_cache;
-
-// Global variables
-available_caches_t RO available_caches;
-
-/************** Cache Related Functions  *****************/
-void cache_init() 
-{
-       // Initialize the caches available on this system.
-       // TODO: Should call out to something reading the acpi tables from 
-       // memory, or something similar.  For now, just initialize them inline
-       available_caches.l1 = SINIT(&l1);
-       available_caches.l2 = SINIT(&l2);
-       available_caches.l3 = SINIT(&l3);
-       llc_cache = &l3;
-       init_cache_properties(&l1,   32,  8, 64);
-       init_cache_properties(&l2,  256,  8, 64);
-       init_cache_properties(&l3, 8192, 16, 64);
-       printk("Cache init successful\n");
-}
-
-void cache_color_alloc_init()
-{
-       init_free_cache_colors_map(&l1);
-       init_free_cache_colors_map(&l2);
-       init_free_cache_colors_map(&l3);
-}
-
diff --git a/kern/arch/i386/colored_page_alloc.h b/kern/arch/i386/colored_page_alloc.h
deleted file mode 100644 (file)
index 4aa5813..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University  of California.  
- * See the COPYRIGHT files at the top of this source tree for full 
- * license information.
- */
-/**
- * @author Kevin Klues <klueska@cs.berkeley.edu>
- */
-#ifndef ROS_KERN_ARCH_COLORED_PAGE_ALLOC_H
-#define ROS_KERN_ARCH_COLORED_PAGE_ALLOC_H
-
-/********** Page Coloring Related Macros ************/
-// Define these to make sure that each level of the cache
-// is initialized and managed properly
-#define DECLARE_CACHE_COLORED_PAGE_LINKS()                    \
-       DECLARE_CACHE_COLORED_PAGE_LINK(l1)                       \
-       DECLARE_CACHE_COLORED_PAGE_LINK(l2)                       \
-       DECLARE_CACHE_COLORED_PAGE_LINK(l3)
-
-#define DECLARE_CACHE_COLORED_PAGE_FREE_LISTS()               \
-       DECLARE_CACHE_COLORED_PAGE_FREE_LIST(l1)                  \
-       DECLARE_CACHE_COLORED_PAGE_FREE_LIST(l2)                  \
-       DECLARE_CACHE_COLORED_PAGE_FREE_LIST(l3)
-       
-#define DECLARE_EXTERN_CACHE_COLORED_PAGE_FREE_LISTS()        \
-       DECLARE_EXTERN_CACHE_COLORED_PAGE_FREE_LIST(l1)           \
-       DECLARE_EXTERN_CACHE_COLORED_PAGE_FREE_LIST(l2)           \
-       DECLARE_EXTERN_CACHE_COLORED_PAGE_FREE_LIST(l3)
-       
-#define DECLARE_CACHE_COLORED_PAGE_ALLOC_FUNCTIONS()          \
-       DECLARE_CACHE_COLORED_PAGE_ALLOC_FUNCTION(l1)             \
-       DECLARE_CACHE_COLORED_PAGE_ALLOC_FUNCTION(l2)             \
-       DECLARE_CACHE_COLORED_PAGE_ALLOC_FUNCTION(l3)
-
-#define INIT_CACHE_COLORED_PAGE_FREE_LISTS()                  \
-       INIT_CACHE_COLORED_PAGE_FREE_LIST(l1)                     \
-       INIT_CACHE_COLORED_PAGE_FREE_LIST(l2)                     \
-       INIT_CACHE_COLORED_PAGE_FREE_LIST(l3)
-
-#define REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LISTS(page)      \
-       REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LIST(page, l1)       \
-       REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LIST(page, l2)       \
-       REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LIST(page, l3)
-       
-#define INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LISTS(page)      \
-       INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LIST(page, l1)       \
-       INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LIST(page, l2)       \
-       INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LIST(page, l3)
-
-#endif // CACHE_COLORING_PAGE_ALLOC_H
diff --git a/kern/arch/i386/console.c b/kern/arch/i386/console.c
deleted file mode 100644 (file)
index a5df0e6..0000000
+++ /dev/null
@@ -1,605 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#include <arch/x86.h>
-#include <arch/arch.h>
-#include <arch/console.h>
-#include <arch/kbdreg.h>
-#include <atomic.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-
-#include <ros/memlayout.h>
-
-void cons_intr(int (*proc)(void));
-void scroll_screen(void);
-
-
-/***** Serial I/O code *****/
-
-#define COM1           0x3F8
-
-#define        COM_RX                  0               // In:  Receive buffer (DLAB=0)
-#define COM_DLL                        0               // Out: Divisor Latch Low (DLAB=1)
-#define COM_DLM                        1               // Out: Divisor Latch High (DLAB=1)
-#define COM_IER                        1               // Out: Interrupt Enable Register
-#define        COM_IER_RDI             0x01    //   Enable receiver data interrupt
-#define COM_IIR                        2               // In:  Interrupt ID Register
-#define COM_FCR                        2               // Out: FIFO Control Register
-#define COM_LCR                        3               // Out: Line Control Register
-#define        COM_LCR_DLAB    0x80    //   Divisor latch access bit
-#define        COM_LCR_WLEN8   0x03    //   Wordlength: 8 bits
-#define COM_MCR                        4               // Out: Modem Control Register
-#define        COM_MCR_RTS             0x02    // RTS complement
-#define        COM_MCR_DTR             0x01    // DTR complement
-#define        COM_MCR_OUT2    0x08    // Out2 complement
-#define COM_LSR                        5               // In:  Line Status Register
-#define COM_LSR_DATA   0x01    //   Data available
-#define COM_LSR_READY  0x20    //   Ready to send
-
-static bool SREADONLY serial_exists;
-
-int
-serial_proc_data(void)
-{
-       if (!(inb(COM1+COM_LSR) & COM_LSR_DATA))
-               return -1;
-       return inb(COM1+COM_RX);
-}
-
-int serial_read_byte()
-{
-       return serial_proc_data();
-}
-
-void
-serial_intr(void)
-{
-       if (serial_exists)
-               cons_intr(serial_proc_data);
-}
-
-void
-serial_init(void)
-{
-       // Turn off the FIFO
-       outb(COM1+COM_FCR, 0);
-       
-       // Set speed; requires DLAB latch
-       outb(COM1+COM_LCR, COM_LCR_DLAB);
-       // Setting speed to 115200 (setting the divider to 1)
-       outb(COM1+COM_DLL, 1);
-       outb(COM1+COM_DLM, 0);
-
-       // 8 data bits, 1 stop bit, parity off; turn off DLAB latch
-       outb(COM1+COM_LCR, COM_LCR_WLEN8 & ~COM_LCR_DLAB);
-
-       // This should turn on hardware flow control
-       outb(COM1+COM_MCR, COM_MCR_RTS | COM_MCR_DTR);
-       // Enable rcv interrupts
-       outb(COM1+COM_IER, COM_IER_RDI);
-
-       // Clear any preexisting overrun indications and interrupts
-       // Serial port doesn't exist if COM_LSR returns 0xFF
-       {
-               bool lbool = ((inb(COM1+COM_LSR) != 0xFF));
-               serial_exists = SINIT(lbool);
-       }
-       (void) inb(COM1+COM_IIR);
-       (void) inb(COM1+COM_RX);
-
-}
-
-void serial_send_byte(uint8_t b)
-{
-       while (!(inb(COM1+COM_LSR) & COM_LSR_READY));
-       outb(COM1, b);
-}
-
-static void
-serial_putc(int c)
-{
-       switch (c & 0xff) {
-       case '\b':
-               serial_send_byte('\b');
-               serial_send_byte((uint8_t)(' '));
-               serial_send_byte('\b');
-               break;
-       case '\n':
-       case '\r':
-               serial_send_byte((uint8_t)('\n'));
-               serial_send_byte((uint8_t)('\r'));
-               break;
-       default:
-               serial_send_byte((uint8_t)(c & 0xff));
-               break;
-       }
-       return;
-}
-
-
-
-/***** Parallel port output code *****/
-// For information on PC parallel port programming, see the class References
-// page.
-
-// Stupid I/O delay routine necessitated by historical PC design flaws
-static void
-delay(void)
-{
-       inb(0x84);
-       inb(0x84);
-       inb(0x84);
-       inb(0x84);
-}
-
-static void
-lpt_putc(int c)
-{
-       int i;
-
-       for (i = 0; !(inb(0x378+1) & 0x80) && i < 12800; i++)
-               delay();
-       outb(0x378+0, c);
-       outb(0x378+2, 0x08|0x04|0x01);
-       outb(0x378+2, 0x08);
-}
-
-
-
-
-/***** Text-mode CGA/VGA display output with scrolling *****/
-#define MAX_SCROLL_LENGTH      20
-#define SCROLLING_CRT_SIZE     (MAX_SCROLL_LENGTH * CRT_SIZE)
-
-static spinlock_t SRACY lock = SPINLOCK_INITIALIZER;
-
-static unsigned SREADONLY addr_6845;
-static uint16_t *SLOCKED(&lock) COUNT(CRT_SIZE) crt_buf;
-static uint16_t SLOCKED(&lock) crt_pos;
-
-static uint16_t (SLOCKED(&lock) scrolling_crt_buf)[SCROLLING_CRT_SIZE];
-static uint16_t SLOCKED(&lock) scrolling_crt_pos;
-static uint8_t SLOCKED(&lock) current_crt_buf;
-
-void
-cga_init(void)
-{
-       volatile uint16_t SLOCKED(&lock)*COUNT(CRT_SIZE) cp;
-       uint16_t was;
-       unsigned pos;
-
-       cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + CGA_BUF);
-       was = *cp;
-       *cp = (uint16_t) 0xA55A;
-       if (*cp != 0xA55A) {
-               cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + MONO_BUF);
-               addr_6845 = SINIT(MONO_BASE);
-       } else {
-               *cp = was;
-               addr_6845 = SINIT(CGA_BASE);
-       }
-       
-       /* Extract cursor location */
-       outb(addr_6845, 14);
-       pos = inb(addr_6845 + 1) << 8;
-       outb(addr_6845, 15);
-       pos |= inb(addr_6845 + 1);
-
-       crt_buf = (uint16_t SLOCKED(&lock)*COUNT(CRT_SIZE)) cp;
-       crt_pos = pos;
-       scrolling_crt_pos = 0;
-       current_crt_buf = 0;
-
-}
-
-static void set_screen(uint8_t screen_num)
-{
-       uint16_t leftovers = (scrolling_crt_pos % CRT_COLS);
-       leftovers = (leftovers) ? CRT_COLS - leftovers : 0;
-       
-       int offset = scrolling_crt_pos + leftovers - (screen_num + 1)*CRT_SIZE;
-       offset = (offset > 0) ? offset : 0;
-
-       memcpy(crt_buf, scrolling_crt_buf + offset, CRT_SIZE * sizeof(uint16_t));
-}
-
-static void scroll_screen_up(void)
-{
-       if(current_crt_buf <  (scrolling_crt_pos / CRT_SIZE))
-               current_crt_buf++;
-       set_screen(current_crt_buf);
-}
-
-static void scroll_screen_down(void)
-{
-       if(current_crt_buf > 0) 
-               current_crt_buf--;
-       set_screen(current_crt_buf);
-}
-
-static void reset_screen(void)
-{
-       current_crt_buf = 0;
-       set_screen(current_crt_buf);
-}
-
-void
-cga_putc(int c)
-{
-       // if no attribute given, then use black on white
-       if (!(c & ~0xFF))
-               c |= 0x0700;
-
-       switch (c & 0xff) {
-       case '\b':
-               if (crt_pos > 0) {
-                       crt_pos--;
-                       scrolling_crt_pos--;
-
-                       crt_buf[crt_pos] = (c & ~0xff) | ' ';
-                       scrolling_crt_buf[scrolling_crt_pos] = crt_buf[crt_pos];
-               }
-               break;
-       case '\n':
-               crt_pos += CRT_COLS;
-               scrolling_crt_pos += CRT_COLS;
-               /* fallthru */
-       case '\r':
-               crt_pos -= (crt_pos % CRT_COLS);
-               scrolling_crt_pos -= (scrolling_crt_pos % CRT_COLS);
-               break;
-       case '\t':
-               cga_putc(' ');
-               cga_putc(' ');
-               cga_putc(' ');
-               cga_putc(' ');
-               cga_putc(' ');
-               break;
-       default:
-               crt_buf[crt_pos++] = c;         /* write the character */
-               scrolling_crt_buf[scrolling_crt_pos++] = c;
-               break;
-       }
-
-       // The purpose of this is to allow the screen to appear as if it is scrolling as
-       // more lines are added beyond the size of the monitor.  The top line is dropped
-       // and everything is shifted up by one.
-       if (crt_pos >= CRT_SIZE) {
-               int i;
-
-               memcpy(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) * sizeof(uint16_t));
-               for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++)
-                       crt_buf[i] = 0x0700 | ' ';
-               crt_pos -= CRT_COLS;
-       }
-       // Do the same for the scrolling crt buffer when it hits its capacity
-       if (scrolling_crt_pos >= SCROLLING_CRT_SIZE) {
-               int i;
-
-               memcpy(scrolling_crt_buf, scrolling_crt_buf + CRT_COLS, 
-                      (SCROLLING_CRT_SIZE - CRT_COLS) * sizeof(uint16_t));
-               for (i = SCROLLING_CRT_SIZE - CRT_COLS; i < SCROLLING_CRT_SIZE; i++)
-                       scrolling_crt_buf[i] = 0x0700 | ' ';
-               scrolling_crt_pos -= CRT_COLS;
-       }
-
-
-       /* move that little blinky thing */
-       outb(addr_6845, 14);
-       outb(addr_6845 + 1, crt_pos >> 8);
-       outb(addr_6845, 15);
-       outb(addr_6845 + 1, crt_pos);
-}
-
-
-/***** Keyboard input code *****/
-
-#define NO             0
-
-#define SHIFT  (1<<0)
-#define CTL            (1<<1)
-#define ALT            (1<<2)
-
-#define CAPSLOCK       (1<<3)
-#define NUMLOCK                (1<<4)
-#define SCROLLLOCK     (1<<5)
-
-#define E0ESC          (1<<6)
-
-static uint8_t (SREADONLY shiftcode)[256] = 
-{
-       [0x1D] CTL,
-       [0x2A] SHIFT,
-       [0x36] SHIFT,
-       [0x38] ALT,
-       [0x9D] CTL,
-       [0xB8] ALT
-};
-
-static uint8_t (SREADONLY togglecode)[256] = 
-{
-       [0x3A] CAPSLOCK,
-       [0x45] NUMLOCK,
-       [0x46] SCROLLLOCK
-};
-
-static uint8_t normalmap[256] =
-{
-       NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00
-       '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
-       'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10
-       'o',  'p',  '[',  ']',  '\n', NO,   'a',  's',
-       'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20
-       '\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v',
-       'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30
-       NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
-       NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
-       '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
-       '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
-       [0xC7] KEY_HOME,        [0x9C] '\n' /*KP_Enter*/,
-       [0xB5] '/' /*KP_Div*/,  [0xC8] KEY_UP,
-       [0xC9] KEY_PGUP,        [0xCB] KEY_LF,
-       [0xCD] KEY_RT,          [0xCF] KEY_END,
-       [0xD0] KEY_DN,          [0xD1] KEY_PGDN,
-       [0xD2] KEY_INS,         [0xD3] KEY_DEL
-};
-
-static uint8_t shiftmap[256] = 
-{
-       NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00
-       '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
-       'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10
-       'O',  'P',  '{',  '}',  '\n', NO,   'A',  'S',
-       'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20
-       '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',
-       'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',  // 0x30
-       NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
-       NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
-       '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
-       '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
-       [0xC7] KEY_HOME,        [0x9C] '\n' /*KP_Enter*/,
-       [0xB5] '/' /*KP_Div*/,  [0xC8] KEY_UP,
-       [0xC9] KEY_PGUP,        [0xCB] KEY_LF,
-       [0xCD] KEY_RT,          [0xCF] KEY_END,
-       [0xD0] KEY_DN,          [0xD1] KEY_PGDN,
-       [0xD2] KEY_INS,         [0xD3] KEY_DEL
-};
-
-#define C(x) (x - '@')
-
-static uint8_t ctlmap[256] = 
-{
-       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
-       NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, 
-       C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'),
-       C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'),
-       C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO, 
-       NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'),
-       C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO,
-       [0x97] KEY_HOME,
-       [0xB5] C('/'),          [0xC8] KEY_UP,
-       [0xC9] KEY_PGUP,        [0xCB] KEY_LF,
-       [0xCD] KEY_RT,          [0xCF] KEY_END,
-       [0xD0] KEY_DN,          [0xD1] KEY_PGDN,
-       [0xD2] KEY_INS,         [0xD3] KEY_DEL
-};
-
-static uint8_t * COUNT(256) (SREADONLY charcode)[4] = {
-       normalmap,
-       shiftmap,
-       ctlmap,
-       ctlmap
-};
-
-/*
- * Get data from the keyboard.  If we finish a character, return it.  Else 0.
- * Return -1 if no data.
- */
-static uint32_t SLOCKED(&lock) shift;
-static bool SLOCKED(&lock) crt_scrolled = FALSE;
-
-static int
-kbd_proc_data(void)
-{
-       int c;
-       uint8_t data;
-
-
-       if ((inb(KBSTATP) & KBS_DIB) == 0)
-               return -1;
-
-       data = inb(KBDATAP);
-
-       if (data == 0xE0) {
-               // E0 escape character
-               shift |= E0ESC;
-               return 0;
-       } else if (data & 0x80) {
-               // Key released
-               data = (shift & E0ESC ? data : data & 0x7F);
-               shift &= ~(shiftcode[data] | E0ESC);
-               return 0;
-       } else if (shift & E0ESC) {
-               // Last character was an E0 escape; or with 0x80
-               data |= 0x80;
-               shift &= ~E0ESC;
-       }
-
-       shift |= shiftcode[data];
-       shift ^= togglecode[data];
-
-       c = charcode[shift & (CTL | SHIFT)][data];
-
-       //Scrolling screen functionality
-       if((shift & SHIFT) && ((c == KEY_UP) || (c == KEY_PGUP))) {
-               crt_scrolled = TRUE;
-               scroll_screen_up();
-               return 0;
-       }
-       else if((shift & SHIFT) && ((c == KEY_DN) || (c == KEY_PGDN))) {
-               crt_scrolled = TRUE;
-               scroll_screen_down();
-               return 0;
-       }
-       else if((shift & SHIFT) && c == KEY_RT) {
-               crt_scrolled = FALSE;
-               reset_screen();
-               return 0;
-       }
-
-       // On keypress other than SHIFT, reset if we were scrolled
-       if(crt_scrolled && (!(shift & SHIFT))) {
-               crt_scrolled = FALSE;
-               reset_screen();
-       }
-
-       //Force character to capital if caps lock on
-       if (shift & CAPSLOCK) {
-               if ('a' <= c && c <= 'z')
-                       c += 'A' - 'a';
-               else if ('A' <= c && c <= 'Z')
-                       c += 'a' - 'A';
-       }
-
-       // Process special keys
-       // Ctrl-Alt-Del: reboot
-       if (!(~shift & (CTL | ALT)) && c == KEY_DEL) {
-               cprintf("Rebooting!\n");
-               outb(0x92, 0x3); // courtesy of Chris Frost
-       }
-
-       return c;
-}
-
-void
-kbd_intr(void)
-{
-       cons_intr(kbd_proc_data);
-}
-
-void
-kbd_init(void)
-{
-}
-
-
-
-/***** General device-independent console code *****/
-// Here we manage the console input buffer,
-// where we stash characters received from the keyboard or serial port
-// whenever the corresponding interrupt occurs.
-
-#define CONSBUFSIZE    512
-struct cons {
-       uint8_t buf[CONSBUFSIZE];
-       uint32_t rpos;
-       uint32_t wpos;
-};
-
-static struct cons SLOCKED(&lock) cons;
-
-// called by device interrupt routines to feed input characters
-// into the circular console input buffer.
-void
-cons_intr(int (*proc)(void))
-{
-       int c;
-
-       while ((c = (*proc)()) != -1) {
-               if (c == 0)
-                       continue;
-               spin_lock_irqsave(&lock);
-               cons.buf[cons.wpos++] = c;
-               if (cons.wpos == CONSBUFSIZE)
-                       cons.wpos = 0;
-               spin_unlock_irqsave(&lock);
-       }
-}
-
-// return the next input character from the console, or 0 if none waiting
-int
-cons_getc(void)
-{
-       int c;
-
-       // 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
-               serial_intr();
-       #endif
-       kbd_intr();
-
-       // grab the next character from the input buffer.
-       spin_lock_irqsave(&lock);
-       if (cons.rpos != cons.wpos) {
-               c = cons.buf[cons.rpos++];
-               if (cons.rpos == CONSBUFSIZE)
-                       cons.rpos = 0;
-               spin_unlock_irqsave(&lock);
-               return c;
-       }
-       spin_unlock_irqsave(&lock);
-       return 0;
-}
-
-// output a character to the console
-void
-cons_putc(int c)
-{
-       //static uint32_t lock; zra: moving up for sharC annotations
-       spin_lock_irqsave(&lock);
-       #ifndef SERIAL_IO
-               serial_putc(c);
-       #endif
-       //lpt_putc(c);
-       cga_putc(c);
-       spin_unlock_irqsave(&lock);
-}
-
-// initialize the console devices
-void
-cons_init(void)
-{
-       cga_init();
-       kbd_init();
-       serial_init();
-
-       if (!serial_exists)
-               cprintf("Serial port does not exist!\n");
-}
-
-
-// `High'-level console I/O.  Used by readline and cprintf.
-
-void
-cputchar(int c)
-{
-       cons_putc(c);
-}
-
-void
-cputbuf(const char*COUNT(len) buf, int len)
-{
-       int i;
-       for(i = 0; i < len; i++)
-               cons_putc(buf[i]);
-}
-
-int
-getchar(void)
-{
-       int c;
-
-       while ((c = cons_getc()) == 0)
-               /* do nothing */;
-       return c;
-}
-
-int
-iscons(int fdnum)
-{
-       // used by readline
-       return 1;
-}
diff --git a/kern/arch/i386/console.h b/kern/arch/i386/console.h
deleted file mode 100644 (file)
index 205581a..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#ifndef _CONSOLE_H_
-#define _CONSOLE_H_
-#ifndef ROS_KERNEL
-# error "This is a ROS kernel header; user programs should not #include it"
-#endif
-
-#include <ros/common.h>
-
-#define MONO_BASE      0x3B4
-#define MONO_BUF       0xB0000
-#define CGA_BASE       0x3D4
-#define CGA_BUF                0xB8000
-
-#define CRT_ROWS       25
-#define CRT_COLS       80
-#define CRT_SIZE       (CRT_ROWS * CRT_COLS)
-
-void cons_init(void);
-void cons_putc(int c);
-int cons_getc(void);
-
-void kbd_intr(void); // irq 1
-void serial_intr(void); // irq 4
-void serial_send_byte(uint8_t b);
-int serial_read_byte();
-
-#endif /* _CONSOLE_H_ */
diff --git a/kern/arch/i386/cpuinfo.c b/kern/arch/i386/cpuinfo.c
deleted file mode 100644 (file)
index 2a59bde..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/arch.h>
-#include <arch/x86.h>
-#include <arch/mmu.h>
-#include <stdio.h>
-#include <assert.h>
-#include <ros/memlayout.h>
-#include <pmap.h>
-#include <kdebug.h>
-#include <string.h>
-
-void print_cpuinfo(void)
-{
-       uint32_t eax, ebx, ecx, edx;
-       uint32_t model, family;
-       uint64_t msr_val;
-       char vendor_id[13];
-       extern char (SNT RO _start)[];
-
-       asm volatile ("cpuid;"
-                 "movl    %%ebx, (%2);"
-                 "movl    %%edx, 4(%2);"
-                 "movl    %%ecx, 8(%2);"
-                : "=a"(eax)
-                : "a"(0), "D"(vendor_id)
-                : "%ebx", "%ecx", "%edx");
-
-       vendor_id[12] = '\0';
-       cprintf("Vendor ID: %s\n", vendor_id);
-       cprintf("Largest Standard Function Number Supported: %d\n", eax);
-       cpuid(0x80000000, &eax, 0, 0, 0);
-       cprintf("Largest Extended Function Number Supported: 0x%08x\n", eax);
-       cpuid(1, &eax, &ebx, &ecx, &edx);
-       family = ((eax & 0x0FF00000) >> 20) + ((eax & 0x00000F00) >> 8);
-       model = ((eax & 0x000F0000) >> 12) + ((eax & 0x000000F0) >> 4);
-       cprintf("Family: %d\n", family);
-       cprintf("Model: %d\n", model);
-       cprintf("Stepping: %d\n", eax & 0x0000000F);
-       // eventually can fill this out with SDM Vol3B App B info, or
-       // better yet with stepping info.  or cpuid 8000_000{2,3,4}
-       switch ( family << 8 | model ) {
-               case(0x061a):
-                       cprintf("Processor: Core i7\n");
-                       break;
-               case(0x060f):
-                       cprintf("Processor: Core 2 Duo or Similar\n");
-                       break;
-               default:
-                       cprintf("Unknown or non-Intel CPU\n");
-       }
-       if (!(edx & 0x00000020))
-               panic("MSRs not supported!");
-       if (!(edx & 0x00001000))
-               panic("MTRRs not supported!");
-       if (!(edx & 0x00002000))
-               panic("Global Pages not supported!");
-       if (!(edx & 0x00000200))
-               panic("Local APIC Not Detected!");
-       if (ecx & 0x00200000)
-               cprintf("x2APIC Detected\n");
-       else
-               cprintf("x2APIC Not Detected\n");
-       if (ecx & 0x00000060) {
-               msr_val = read_msr(IA32_FEATURE_CONTROL);
-               printd("64 Bit Feature Control: 0x%08x\n", msr_val);
-               if ((msr_val & 0x5) == 0x5)
-                       printk("Hardware virtualization supported\n");
-               else
-                       printk("Hardware virtualization not supported\n");
-       } else { 
-               printk("Hardware virtualization not supported\n");
-       }
-       cpuid(0x80000008, &eax, &ebx, &ecx, &edx);
-       cprintf("Physical Address Bits: %d\n", eax & 0x000000FF);
-       cprintf("Cores per Die: %d\n", (ecx & 0x000000FF) + 1);
-    cprintf("This core's Default APIC ID: 0x%08x\n", lapic_get_default_id());
-       msr_val = read_msr(IA32_APIC_BASE);
-       if (msr_val & MSR_APIC_ENABLE)
-               cprintf("Local APIC Enabled\n");
-       else
-               cprintf("Local APIC Disabled\n");
-       if (msr_val & 0x00000100)
-               cprintf("I am the Boot Strap Processor\n");
-       else
-               cprintf("I am an Application Processor\n");
-       cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
-       if (edx & 0x00000100)
-               printk("Invariant TSC present\n");
-       else
-               printk("Invariant TSC not present\n");
-}
-
-void show_mapping(uintptr_t start, size_t size)
-{
-       pde_t LCKD(&vpd_lock) *CT(PTSIZE) pgdir =
-           (pde_t LCKD(&vpd_lock) *CT(PTSIZE))vpd;
-       pte_t *pte;
-       pte_t LCKD(&vpd_lock) *pde;
-       page_t *page;
-       uintptr_t i;
-
-       cprintf("   Virtual    Physical  Ps Dr Ac CD WT U W\n");
-       cprintf("------------------------------------------\n");
-       for(i = 0; i < size; i += PGSIZE, start += PGSIZE) {
-               page = page_lookup(pgdir, (void*SNT)start, &pte);
-               cprintf("%08p  ", start);
-               if (page) {
-                       pde = &pgdir[PDX(start)];
-                       // for a jumbo, pde = pte and PTE_PS (better be) = 1
-                       cprintf("%08p  %1d  %1d  %1d  %1d  %1d  %1d %1d\n", page2pa(page),
-                              (*pte & PTE_PS) >> 7, (*pte & PTE_D) >> 6, (*pte & PTE_A) >> 5,
-                              (*pte & PTE_PCD) >> 4, (*pte & PTE_PWT) >> 3,
-                              (*pte & *pde & PTE_U) >> 2, (*pte & *pde & PTE_W) >> 1);
-               } else
-                       cprintf("%08p\n", 0);
-       }
-}
-
-void backtrace(void)
-{ TRUSTEDBLOCK
-       extern char (SNT RO _start)[];
-       uint32_t *ebp, eip;
-       eipdebuginfo_t debuginfo;
-       char buf[256];
-       int j, i = 1;
-       ebp = (uint32_t*)read_ebp();
-       // this is part of the way back into the call() instruction's bytes
-       // eagle-eyed readers should be able to explain why this is good enough,
-       // and retaddr (just *(ebp + 1) is not)
-       eip = *(ebp + 1) - 1;
-       // jump back a frame (out of backtrace)
-       ebp = (uint32_t*)(*ebp);
-       cprintf("Stack Backtrace:\n");
-       // on each iteration, ebp holds the stack frame and eip an addr in that func
-       while (ebp != 0) {
-               debuginfo_eip(eip, &debuginfo);
-               memset(buf, 0, 256);
-               strncpy(buf, debuginfo.eip_fn_name, MIN(debuginfo.eip_fn_namelen, 256));
-               buf[MIN(debuginfo.eip_fn_namelen, 255)] = 0;
-               cprintf("#%02d [<%p>] in %s+%x(%p) from %s:%d\n", i++,  eip, buf, 
-                       debuginfo.eip_fn_addr - (uint32_t)_start, debuginfo.eip_fn_addr, 
-                       debuginfo.eip_file, debuginfo.eip_line);
-               cprintf("    ebp: %x   Args:", ebp);
-               for (j = 0; j < MIN(debuginfo.eip_fn_narg, 5); j++)
-                       cprintf(" %08x", *(ebp + 2 + j));
-               cprintf("\n");
-               eip = *(ebp + 1) - 1;
-               ebp = (uint32_t*)(*ebp);
-       }
-}
-
-/* Like backtrace, this is probably not the best place for this. */
-void spinlock_debug(spinlock_t *lock)
-{
-#ifdef SPINLOCK_DEBUG
-       eipdebuginfo_t debuginfo;
-       char buf[256];
-       uint32_t eip = (uint32_t)lock->call_site;
-
-       debuginfo_eip(eip, &debuginfo);
-       memset(buf, 0, 256);
-       strncpy(buf, debuginfo.eip_fn_name, MIN(debuginfo.eip_fn_namelen, 256));
-       buf[MIN(debuginfo.eip_fn_namelen, 255)] = 0;
-       printk("Lock %p: last locked at [<%p>] in %s(%p) on core %d\n", lock, eip, buf,
-              debuginfo.eip_fn_addr, lock->calling_core);
-#endif
-}
-
diff --git a/kern/arch/i386/entry.S b/kern/arch/i386/entry.S
deleted file mode 100644 (file)
index 145ca5f..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#include <arch/mmu.h>
-#include <arch/trap.h>
-#include <ros/memlayout.h>
-
-# Shift Right Logical 
-#define SRL(val, shamt)                (((val) >> (shamt)) & ~(-1 << (32 - (shamt))))
-
-
-###################################################################
-# The kernel (this code) is linked at address (KERNBASE + 0x00100000 (1MB)), 
-# but we tell the bootloader to load it at physical address 
-# 0x00100000 (1MB), which is the start of extended memory.
-# (See kernel.ld)
-###################################################################
-
-
-###################################################################
-# RELOC(x) maps a symbol x from its link address to its actual
-# location in physical memory (its load address).       
-###################################################################
-#define        RELOC(x) ((x) - KERNBASE)
-
-
-.set CODE_SEL,0x8              # index of code seg within mygdt
-.set DATA_SEL,0x10             # index of data seg within mygdt
-
-#define MULTIBOOT_PAGE_ALIGN  (1<<0)
-#define MULTIBOOT_MEMORY_INFO (1<<1)
-#define MULTIBOOT_HEADER_MAGIC (0x1BADB002)
-#define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN)
-#define CHECKSUM (-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS))
-
-###################################################################
-# entry point
-###################################################################
-
-.text
-
-# The Multiboot header
-.align 4
-.long MULTIBOOT_HEADER_MAGIC
-.long MULTIBOOT_HEADER_FLAGS
-.long CHECKSUM
-
-.globl         _start
-_start:
-       movw    $0x1234,0x472                   # warm boot
-
-       # Establish our own GDT in place of the boot loader's temporary GDT.
-       lgdt    RELOC(mygdtdesc)                # load descriptor table
-
-       # Immediately reload all segment registers (including CS!)
-       # with segment selectors from the new GDT.
-       movl    $DATA_SEL, %eax                 # Data segment selector
-       movw    %ax,%ds                         # -> DS: Data Segment
-       movw    %ax,%es                         # -> ES: Extra Segment
-       movw    %ax,%ss                         # -> SS: Stack Segment
-       ljmp    $CODE_SEL,$relocated            # reload CS by jumping
-relocated:
-
-       # Clear the frame pointer register (EBP)
-       # so that once we get into debugging C code,
-       # stack backtraces will be terminated properly.
-       movl    $0x0,%ebp                       # nuke frame pointer
-
-    # Set the stack pointer
-       movl    $(bootstacktop),%esp
-
-       # Save multiboot info
-       push    %ebx
-
-       # now to C code
-       movl    $0x1,num_cpus           # init global var, for now
-       call    kernel_init
-
-       # Should never get here, but in case we do, just spin.
-spin:  jmp     spin
-
-###################################################################    
-# See <inc/memlayout.h> for a complete description of these two symbols.
-###################################################################
-.data
-       .globl  vpt
-       .set    vpt, VPT
-       .globl  vpd
-       .set    vpd, (VPT + SRL(VPT, 10))
-
-
-###################################################################
-# boot stack
-###################################################################
-       .p2align        PGSHIFT         # force page alignment
-       .globl          bootstack
-bootstack:
-       .space          KSTKSIZE
-       .globl          bootstacktop   
-bootstacktop:
-
-###################################################################
-# setup the GDT        
-###################################################################
-       .p2align        2               # force 4 byte alignment
-mygdt:
-       SEG_NULL                                # null seg
-       SEG(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg
-       SEG(STA_W, -KERNBASE, 0xffffffff)       # data seg
-mygdtdesc:
-       .word   0x17                    # sizeof(mygdt) - 1
-       .long   RELOC(mygdt)            # address mygdt
-
diff --git a/kern/arch/i386/env.c b/kern/arch/i386/env.c
deleted file mode 100644 (file)
index 33f8d1f..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/trap.h>
-#include <env.h>
-#include <assert.h>
-#include <pmap.h>
-
-//
-// This exits the kernel and starts executing some environment's code.
-// This function does not return.
-// Uses 'iret' or 'sysexit' depending on CS.
-//
-void env_pop_tf(trapframe_t *tf)
-{
-       /* Load the LDT for this process.  Slightly ghetto doing it here. */
-       segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
-       /* copy-in and check the LDT location.  the segmentation hardware write the
-        * accessed bit, so we want the memory to be in the user-writeable area. */
-       segdesc_t *ldt = current->env_procdata->ldt;
-       ldt = (segdesc_t*)MIN((uintptr_t)ldt, UTOP - LDT_SIZE);
-       segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)ldt, LDT_SIZE, 3);
-       my_gdt[GD_LDT >> 3] = ldt_temp;
-       asm volatile("lldt %%ax" :: "a"(GD_LDT));
-
-       /* In case they are enabled elsewhere.  We can't take an interrupt in these
-        * routines, due to how they play with the kernel stack pointer. */
-       disable_irq();
-       /*
-        * If the process entered the kernel via sysenter, we need to leave via
-        * sysexit.  sysenter trapframes have 0 for a CS, which is pushed in
-        * sysenter_handler.
-        */
-       if(tf->tf_cs) {
-               /*
-                * Restores the register values in the Trapframe with the 'iret'
-                * instruction.  This exits the kernel and starts executing some
-                * environment's code.  This function does not return.
-                */
-               asm volatile ("movl %0,%%esp;           "
-                             "popal;                   "
-                             "popl %%gs;               "
-                             "popl %%fs;               "
-                             "popl %%es;               "
-                             "popl %%ds;               "
-                             "addl $0x8,%%esp;         "
-                             "iret                     "
-                             : : "g" (tf) : "memory");
-               panic("iret failed");  /* mostly to placate the compiler */
-       } else {
-               /* Return path of sysexit.  See sysenter_handler's asm for details.
-                * One difference is that this tf could be somewhere other than a stack
-                * (like in a struct proc).  We need to make sure esp is valid once
-                * interrupts are turned on (which would happen on popfl normally), so
-                * we need to save and restore a decent esp (the current one).  We need
-                * a place to save it that is accessible after we change the stack
-                * pointer to the tf *and* that is specific to this core/instance of
-                * sysexit.  The simplest and nicest is to use the tf_esp, which we
-                * can just pop.  Incidentally, the value in oesp would work too.
-                * To prevent popfl from turning interrupts on, we hack the tf's eflags
-                * so that we have a chance to change esp to a good value before
-                * interrupts are enabled.  The other option would be to throw away the
-                * eflags, but that's less desirable. */
-               tf->tf_eflags &= !FL_IF;
-               tf->tf_esp = read_esp();
-               asm volatile ("movl %0,%%esp;           "
-                             "popal;                   "
-                             "popl %%gs;               "
-                             "popl %%fs;               "
-                             "popl %%es;               "
-                             "popl %%ds;               "
-                             "addl $0x10,%%esp;        "
-                             "popfl;                   "
-                             "movl %%ebp,%%ecx;        "
-                             "movl %%esi,%%edx;        "
-                             "popl %%esp;              "
-                             "sti;                     "
-                             "sysexit                  "
-                             : : "g" (tf) : "memory");
-               panic("sysexit failed");  /* mostly to placate your mom */
-       }
-}
-
-/* Walks len bytes from start, executing 'callback' on every PTE, passing it a
- * specific VA and whatever arg is passed in.  Note, this cannot handle jumbo
- * pages. */
-int env_user_mem_walk(env_t* e, void* start, size_t len,
-                      mem_walk_callback_t callback, void* arg)
-{
-       pte_t *pt;
-       uint32_t pdeno, pteno;
-       physaddr_t pa;
-
-       assert((intptr_t)start % PGSIZE == 0 && len % PGSIZE == 0);
-       void* end = (char*)start+len;
-       uint32_t pdeno_start = PDX(start);
-       uint32_t pdeno_end = PDX(ROUNDUP(end,PTSIZE));
-       /* concerned about overflow.  this should catch it for now, given the above
-        * assert. */
-       assert((len == 0) || (pdeno_start < pdeno_end));
-
-       for (pdeno = pdeno_start; pdeno < pdeno_end; pdeno++) {
-               if (!(e->env_pgdir[pdeno] & PTE_P))
-                       continue;
-               /* find the pa and a pointer to the page table */
-               pa = PTE_ADDR(e->env_pgdir[pdeno]);
-               pt = (pte_t*COUNT(NPTENTRIES)) KADDR(pa);
-               /* figure out where we start and end within the page table */
-               uint32_t pteno_start = (pdeno == pdeno_start ? PTX(start) : 0);
-               uint32_t pteno_end = (pdeno == pdeno_end - 1 && PTX(end) != 0 ?
-                                     PTX(end) : NPTENTRIES );
-               int ret;
-               for (pteno = pteno_start; pteno < pteno_end; pteno++) {
-                       if (pt[pteno] & PTE_P)
-                               if((ret = callback(e, &pt[pteno], PGADDR(pdeno, pteno, 0), arg)))
-                                       return ret;
-               }
-       }
-       return 0;
-}
-
-/* Frees (decrefs) all pages of the process's page table, including the page
- * directory.  Does not free the memory that is actually mapped. */
-void env_pagetable_free(env_t* e)
-{
-       static_assert(UVPT % PTSIZE == 0);
-       assert(e->env_cr3 != rcr3());
-       for(uint32_t pdeno = 0; pdeno < PDX(UVPT); pdeno++)
-       {
-               // only look at mapped page tables
-               if (!(e->env_pgdir[pdeno] & PTE_P))
-                       continue;
-
-               // find the pa and va of the page table
-               physaddr_t pa = PTE_ADDR(e->env_pgdir[pdeno]);
-
-               // free the page table itself
-               e->env_pgdir[pdeno] = 0;
-               page_decref(pa2page(pa));
-       }
-
-       // free the page directory
-       physaddr_t pa = e->env_cr3;
-       e->env_cr3 = 0;
-       page_decref(pa2page(pa));
-       tlbflush();
-}
-
diff --git a/kern/arch/i386/init.c b/kern/arch/i386/init.c
deleted file mode 100644 (file)
index c98fbee..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* 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!
-               
-       // TODO: move these back to regular init.  requires fixing the __NETWORK__
-       // inits to not need multiple cores running.
-       // this returns when all other cores are done and ready to receive IPIs
-       #ifndef __SINGLE_CORE__
-               smp_boot();
-       #else
-               smp_percpu_init();
-       #endif
-       proc_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
deleted file mode 100644 (file)
index 77c4361..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#ifndef ROS_ARCH_INIT_H
-#define ROS_ARCH_INIT_H
-
-void arch_init();
-
-#endif // !ROS_ARCH_INIT_H
-
diff --git a/kern/arch/i386/ioapic.c b/kern/arch/i386/ioapic.c
deleted file mode 100644 (file)
index 2e437e6..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-// Not currently sharc complient.
-
-/** @file
- * @brief Basic IOAPIC Driver.
- *
- * This file is responsible for the initalization of the Intel x58 IOAPIC(s)
- * Once the IOAPIC is setup, the function ioapic_route_irq() can be used
- * to route
- *
- * See Ch 17.5.26 in Intel X58 Express Chipset Datasheet
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- * @todo Come up with an impliment a concurrency model for use of the route/unroute functions
- * @todo Once we begin using logical core ID's for groups, adjust route/unroute to utilize this (adjust high word)
- * @todo Some notion of a 'initalized' flag we can check to ensure bootup call order.
- */
-
-#include <arch/mmu.h>
-#include <arch/x86.h>
-#include <arch/apic.h>
-#include <arch/mptables.h>
-#include <arch/pci.h>
-
-ioapic_redirect_t ioapic_redirects[NUM_IRQS];
-
-/**
- * @brief Parse the entries from the mptables relevant to the IOAPIC and initalize the IOAPIC and its data structures
- *
- * This function will loop over the data structures created by MPTables to represent ISA and PCI interrupts
- * and then setup the ioapic_redirects array to map IRQs->IOAPIC/Flags
- * 
- * This function must be called during bootup, before interrupts are rerouted, and after the PCI/MPTable initilization.
- */
-void ioapic_init() {
-       
-       // Set all entires invalid.
-       // We define a entry to be invalid by having an ioapic_address of NULL (0x0)
-       memset(ioapic_redirects, 0x0, sizeof(ioapic_redirects));
-       
-       extern volatile uint32_t num_cpus;
-       uint32_t num_inconsistent_pci_mappings = 0;     // Increment if we find inconsistent mappings between
-                                                                                               //  mptables and the pci bus.
-       
-       // Pull in all the stuff we need from mptables and the pci parsing. These are all stack allocated (cant be null)
-       extern pci_irq_entry_t irq_pci_map[NUM_IRQS];
-       extern pci_int_device_t pci_int_devices[PCI_MAX_BUS][PCI_MAX_DEV];
-       extern ioapic_entry_t ioapic_entries[IOAPIC_MAX_ID];
-       extern isa_int_entry_t isa_int_entries[NUM_IRQS];
-       
-       // Setup the PCI entries
-       for (int i = 0; i < NUM_IRQS; i++) {
-               // Bus is 16 bits as we use a sential BUS value (INVALID_BUS) to denote an invalid bus
-               //  and this valid is out of the range 0->2^8-1
-               uint16_t bus = irq_pci_map[i].bus;
-               uint8_t dev = irq_pci_map[i].dev;
-               uint8_t line = irq_pci_map[i].line;
-               
-               if (bus == INVALID_BUS)
-                       continue;
-
-               // We do the same trick with the dest apic ID as we do with the PCI Bus, so its wider.
-               uint16_t dst_apic_id = pci_int_devices[bus][dev].line[line].dst_apic_id;
-               uint8_t dst_apic_int = pci_int_devices[bus][dev].line[line].dst_apic_int;
-               
-               // Check if this entry has been set
-               if (dst_apic_id == INVALID_DEST_APIC) {
-                       // If we have a valid bus in the irq->pci map, and the pic->int entry doesnt exist, we have a (probably VM) problem
-                       if (num_inconsistent_pci_mappings == 0)
-                               printk("WARNING: INCONSISTENT IRQ->PCI AND PCI->IOAPIC MAPPINGS. Trying to cope...\n");
-                       num_inconsistent_pci_mappings++;
-                       continue;
-               }
-               
-               // If the lowest bit of the apic flags is set to 0, it means the ioapic is not usable (by MP Spec)
-               // We also use this to denote non-existent ioapics in our map
-               if ((ioapic_entries[dst_apic_id].apic_flags & 0x1) == 0) 
-                       panic("IRQ SAYS ITS GOING TO AN IOAPIC LISTED AS INVALID, THATS BAD.");
-                                       
-               ioapic_redirects[i].ioapic_address = ioapic_entries[dst_apic_id].apic_address;
-               ioapic_redirects[i].ioapic_int = dst_apic_int;
-               ioapic_redirects[i].ioapic_flags = IOAPIC_PCI_FLAGS;
-       }
-       
-       // Setup the ISA entries
-       for (int i = 0; i < NUM_IRQS; i++) {
-               
-               uint16_t dst_apic_id = isa_int_entries[i].dst_apic_id;
-               uint8_t dst_apic_int = isa_int_entries[i].dst_apic_int;
-               
-               
-               // Skip invalid entries
-               if (dst_apic_id == INVALID_DEST_APIC)
-                       continue;
-                       
-               if (ioapic_redirects[i].ioapic_address != NULL) {
-                       // This is technically a lie. We could in theory handle this, so long as
-                       //  everything agrees.... however this shouldnt ever really happen
-                       //  as this means we have both PCI and ISA claiming an interrupt
-                       panic("BOTH PCI AND ISA CLAIM TO SHARE AN IRQ. BAD");
-               }
-               
-               // Code to check if this isa irq entry claims to be pci
-               uint16_t pci_bus = irq_pci_map[i].bus;
-               if (pci_bus != INVALID_BUS) {
-                       // PCI bus had an entry for this irq, but we didn't set it during our pci run
-                       //  This means it is likely a broken mptable implimentation. this happens on bochs and kvm
-                       //  lets just set the flags as if its broken, and move on. Hopefully it will work out.
-                       ioapic_redirects[i].ioapic_flags = IOAPIC_BROKEN_PCI_FLAGS;
-                       num_inconsistent_pci_mappings--;
-               }
-               else {
-                       ioapic_redirects[i].ioapic_flags = IOAPIC_ISA_FLAGS;
-               }
-               
-
-               ioapic_redirects[i].ioapic_address = ioapic_entries[dst_apic_id].apic_address;
-               ioapic_redirects[i].ioapic_int = dst_apic_int;
-       }
-       
-       // Things didn't balance out when we scanned the isa bus for the missing pci devices. Die.
-       if (num_inconsistent_pci_mappings != 0) 
-               panic("FAILED TO COPE WITH INCONSISTENT IRQ->PCI AND PCI->IOAPIC MAPPINGS!");
-       
-       // Support for other type of IRQ's goes here.
-       
-       /* Note: We do not technically ever do anything to initalize the IOAPIC
-       *   According to the x58 chipset spec, this is done for us. It starts up
-       *   usable and with everything masked, so there isn't really anything to do
-       *   besides setup our structures.
-       */
-}
-
-
-/** @brief Reconfigure the correct IOAPIC to route a given irq to a given dest
-  * 
-  * This function will take an irq given by 'irq' and using the interal IOAPIC
-  * strucures will adjust the IOAPIC to properly route that IRQ to a core 
-  * (or in the future group of cores) specified by the 'dest' bits.
-  *
-  * This function must be called after ioapic_init() is called.
-  *
-  * There is no notion of success besides invalid data, which casues a panic.
-  *
-  * @todo Logical partition support
-  * @todo Decide on a synchronization mechinism
-  *
-  * @param[in] irq     The IRQ we are trying to route. This is non-kernal-offseted. EX: Pit is IRQ 0, not 32.
-  * @param[in] dest    The core id we want to route irq to
-  */
-
-void ioapic_route_irq(uint8_t irq, uint8_t dest) {
-       
-       if (((irq + KERNEL_IRQ_OFFSET) >= NUM_IRQS) || (ioapic_redirects[irq].ioapic_address == NULL)) {
-               panic("TRYING TO REROUTE AN INVALID IRQ!");
-       }
-
-       // THIS IS A TEMP CHECK. IF WE USE LOGICAL PARTITIONS THIS MUST BE REMOVED
-        extern volatile uint32_t num_cpus;
-       if (dest >= num_cpus)
-               panic("TRYING TO REROUTE TO AN INVALID DESTINATION!");
-       
-       if (irq == 0 && dest != 0)
-               cprintf("WARNING: Rerouting IRQ to core != 0 may cause undefined behavior!\n");
-
-       // Bit pack our redirection entry. This is black magic based on the spec. See the x58 spec.
-       uint32_t redirect_low = KERNEL_IRQ_OFFSET + irq;
-       redirect_low = redirect_low | (ioapic_redirects[irq].ioapic_flags << 8);
-       uint32_t redirect_high = dest << 24;
-       
-       // YOU MUST MUST MUST MUST MUST MUST MUST write the high bits first. If you don't, you get interrupts going to crazy places
-       // Ask Paul about that afternoon of his life.
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address , IOAPIC_REDIRECT_OFFSET + 2*ioapic_redirects[irq].ioapic_int + 1);
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address  + IOAPIC_WRITE_WINDOW_OFFSET, redirect_high);
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address , IOAPIC_REDIRECT_OFFSET + 2*ioapic_redirects[irq].ioapic_int);
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address  + IOAPIC_WRITE_WINDOW_OFFSET, redirect_low);
-}
-
-/** @brief Reconfigure the correct IOAPIC to no longer route a given irq to any core
-  * 
-  * This function will take an irq given by 'irq' and using the interal IOAPIC
-  * strucures will adjust the IOAPIC to no longer route that irq to any destination
-  *
-  * This function must be called after ioapic_init() is called, but need not be called after a matching ioapic_route_irq()
-  *
-  * There is no notion of success besides invalid data, which casues a panic.
-  *
-  * @todo Decide on a synchronization mechinism
-  * 
-  * @param[in] irq     The IRQ we are trying to unroute. This is non-kernal-offseted. EX: Pit is IRQ 0, not 32.
-  */
-void ioapic_unroute_irq(uint8_t irq) {
-
-       if (((irq + KERNEL_IRQ_OFFSET) >= NUM_IRQS) || (ioapic_redirects[irq].ioapic_address == NULL)) {
-               panic("TRYING TO REROUTE AN INVALID IRQ!");
-       }
-       
-       // Must write low first, else we will reroute to a wrong core for a split before turning off
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address , IOAPIC_REDIRECT_OFFSET + 2*ioapic_redirects[irq].ioapic_int);
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address  + IOAPIC_WRITE_WINDOW_OFFSET, IOAPIC_UNROUTE_LOW);
-       
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address , IOAPIC_REDIRECT_OFFSET + 2*ioapic_redirects[irq].ioapic_int + 1);
-       write_mmreg32((uint32_t)ioapic_redirects[irq].ioapic_address  + IOAPIC_WRITE_WINDOW_OFFSET, IOAPIC_UNROUTE_HIGH);
-
-}
diff --git a/kern/arch/i386/ioapic.h b/kern/arch/i386/ioapic.h
deleted file mode 100644 (file)
index 157407f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifndef ROS_KERN_IOAPIC_H
-#define ROS_KERN_IOAPIC_H
-
-#include <ros/common.h>
-
-/* IOAPIC_BASE really go away. This is NOT required by the spec as far as I know.
- * This was originally in apic.h, but Paul moved it here. This is NOT used by
- * anything in the IOAPIC, just some other kernel stuff which uses it for
- * size calculations. It should be called something else and moved.
- */
-#define IOAPIC_BASE                                    0xfec00000 // this is the default, can be changed
-
-/* These are things like level sensitive, edge triggered, fixed, nmi, extint, etc
- * This is based on the x58 chipset spec. There are only 2 combinations so
- * Paul didn't bother to spell them out bit by bit and or them together.
- */
-#define IOAPIC_PCI_FLAGS                       0xa0
-#define IOAPIC_ISA_FLAGS                       0x00
-/* This says how we should treat PCI interrupts that are listed as ISA by mptables.
- * This was determined by trial and error in the VM's. All current VMs that have this
- * 'feature' use ISA style flags. 
- * Author's note: Paul really hates whoever wrote the bochs bios (which is
- * the source of this problem for bochs/kvm/qemu).
- */
-#define IOAPIC_BROKEN_PCI_FLAGS                IOAPIC_ISA_FLAGS 
-
-// Obvious
-#define IOAPIC_MAX_ID                          256
-
-// The magic bits we write to kill unroute an irq. The 16th bit is the important one, being set to 1. 
-// Other bits are just to restore it to a clean boot-like state.
-#define IOAPIC_UNROUTE_LOW                     0x00010000
-#define IOAPIC_UNROUTE_HIGH                    0x00000000
-
-// Mem mapped register magic numbers. Oo magic!
-#define IOAPIC_REDIRECT_OFFSET         0x10
-#define IOAPIC_WRITE_WINDOW_OFFSET     0x10
-
-/* Structure used to define an interrupt redirection entry. 
- * This structure encapsulates:
- *             An IRQ
- *             The flags used for rerouting (edge sensitive, level triggered, etc)
- *             Ioapic ADDR (physical Addr)
- */
-typedef struct IOAPICREDIRECT {
-    void*                      ioapic_address; // NULL means invalid
-       uint8_t                 ioapic_flags;
-       uint8_t                 ioapic_int;
-} ioapic_redirect_t;
-
-// Everyone loves a protoype.
-void ioapic_init();
-void ioapic_route_irq(uint8_t irq, uint8_t dest);
-void ioapic_unroute_irq(uint8_t irq);
-
-#endif /* ROS_KERN_IOAPIC_H */
diff --git a/kern/arch/i386/kbdreg.h b/kern/arch/i386/kbdreg.h
deleted file mode 100644 (file)
index 0c7ffea..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef ROS_KBDREG_H
-#define ROS_KBDREG_H
-
-// Special keycodes
-#define KEY_HOME       0xE0
-#define KEY_END                0xE1
-#define KEY_UP         0xE2
-#define KEY_DN         0xE3
-#define KEY_LF         0xE4
-#define KEY_RT         0xE5
-#define KEY_PGUP       0xE6
-#define KEY_PGDN       0xE7
-#define KEY_INS                0xE8
-#define KEY_DEL                0xE9
-
-
-/* This is i8042reg.h + kbdreg.h from NetBSD. */
-
-#define        KBSTATP         0x64    /* kbd controller status port(I) */
-#define         KBS_DIB        0x01    /* kbd data in buffer */
-#define         KBS_IBF        0x02    /* kbd input buffer low */
-#define         KBS_WARM       0x04    /* kbd input buffer low */
-#define         KBS_OCMD       0x08    /* kbd output buffer has command */
-#define         KBS_NOSEC      0x10    /* kbd security lock not engaged */
-#define         KBS_TERR       0x20    /* kbd transmission error */
-#define         KBS_RERR       0x40    /* kbd receive error */
-#define         KBS_PERR       0x80    /* kbd parity error */
-
-#define        KBCMDP          0x64    /* kbd controller port(O) */
-#define         KBC_RAMREAD    0x20    /* read from RAM */
-#define         KBC_RAMWRITE   0x60    /* write to RAM */
-#define         KBC_AUXDISABLE 0xa7    /* disable auxiliary port */
-#define         KBC_AUXENABLE  0xa8    /* enable auxiliary port */
-#define         KBC_AUXTEST    0xa9    /* test auxiliary port */
-#define         KBC_KBDECHO    0xd2    /* echo to keyboard port */
-#define         KBC_AUXECHO    0xd3    /* echo to auxiliary port */
-#define         KBC_AUXWRITE   0xd4    /* write to auxiliary port */
-#define         KBC_SELFTEST   0xaa    /* start self-test */
-#define         KBC_KBDTEST    0xab    /* test keyboard port */
-#define         KBC_KBDDISABLE 0xad    /* disable keyboard port */
-#define         KBC_KBDENABLE  0xae    /* enable keyboard port */
-#define         KBC_PULSE0     0xfe    /* pulse output bit 0 */
-#define         KBC_PULSE1     0xfd    /* pulse output bit 1 */
-#define         KBC_PULSE2     0xfb    /* pulse output bit 2 */
-#define         KBC_PULSE3     0xf7    /* pulse output bit 3 */
-
-#define        KBDATAP         0x60    /* kbd data port(I) */
-#define        KBOUTP          0x60    /* kbd data port(O) */
-
-#define        K_RDCMDBYTE     0x20
-#define        K_LDCMDBYTE     0x60
-
-#define        KC8_TRANS       0x40    /* convert to old scan codes */
-#define        KC8_MDISABLE    0x20    /* disable mouse */
-#define        KC8_KDISABLE    0x10    /* disable keyboard */
-#define        KC8_IGNSEC      0x08    /* ignore security lock */
-#define        KC8_CPU         0x04    /* exit from protected mode reset */
-#define        KC8_MENABLE     0x02    /* enable mouse interrupt */
-#define        KC8_KENABLE     0x01    /* enable keyboard interrupt */
-#define        CMDBYTE         (KC8_TRANS|KC8_CPU|KC8_MENABLE|KC8_KENABLE)
-
-/* keyboard commands */
-#define        KBC_RESET       0xFF    /* reset the keyboard */
-#define        KBC_RESEND      0xFE    /* request the keyboard resend the last byte */
-#define        KBC_SETDEFAULT  0xF6    /* resets keyboard to its power-on defaults */
-#define        KBC_DISABLE     0xF5    /* as per KBC_SETDEFAULT, but also disable key scanning */
-#define        KBC_ENABLE      0xF4    /* enable key scanning */
-#define        KBC_TYPEMATIC   0xF3    /* set typematic rate and delay */
-#define        KBC_SETTABLE    0xF0    /* set scancode translation table */
-#define        KBC_MODEIND     0xED    /* set mode indicators(i.e. LEDs) */
-#define        KBC_ECHO        0xEE    /* request an echo from the keyboard */
-
-/* keyboard responses */
-#define        KBR_EXTENDED    0xE0    /* extended key sequence */
-#define        KBR_RESEND      0xFE    /* needs resend of command */
-#define        KBR_ACK         0xFA    /* received a valid command */
-#define        KBR_OVERRUN     0x00    /* flooded */
-#define        KBR_FAILURE     0xFD    /* diagnosic failure */
-#define        KBR_BREAK       0xF0    /* break code prefix - sent on key release */
-#define        KBR_RSTDONE     0xAA    /* reset complete */
-#define        KBR_ECHO        0xEE    /* echo response */
-
-#endif /* !ROS_KBDREG_H */
diff --git a/kern/arch/i386/kclock.c b/kern/arch/i386/kclock.c
deleted file mode 100644 (file)
index da4e187..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-/* Support for two time-related hardware gadgets: 1) the run time
- * clock with its NVRAM access functions; 2) the 8253 timer, which
- * generates interrupts on IRQ 0.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/x86.h>
-
-#include <kclock.h>
-
-
-unsigned
-mc146818_read(unsigned reg)
-{
-       outb(IO_RTC, reg);
-       return inb(IO_RTC+1);
-}
-
-void
-mc146818_write(unsigned reg, unsigned datum)
-{
-       outb(IO_RTC, reg);
-       outb(IO_RTC+1, datum);
-}
-
-
-
diff --git a/kern/arch/i386/kdebug.c b/kern/arch/i386/kdebug.c
deleted file mode 100644 (file)
index d59b3e6..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <stab.h>
-#include <string.h>
-#include <assert.h>
-#include <kdebug.h>
-#include <pmap.h>
-#include <process.h>
-
-#include <ros/memlayout.h>
-
-// 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;
-       const stab_t *SNT stab_end;
-       const char *NT BND(__this, stabstr_end) stabstr;
-       const char *SNT stabstr_end;
-} user_stab_data_t;
-
-
-// stab_binsearch(stabs, region_left, region_right, type, addr)
-//
-//     Some stab types are arranged in increasing order by instruction
-//     address.  For example, N_FUN stabs (stab entries with n_type ==
-//     N_FUN), which mark functions, and N_SO stabs, which mark source files.
-//
-//     Given an instruction address, this function finds the single stab
-//     entry of type 'type' that contains that address.
-//
-//     The search takes place within the range [*region_left, *region_right].
-//     Thus, to search an entire set of N stabs, you might do:
-//
-//             left = 0;
-//             right = N - 1;     /* rightmost stab */
-//             stab_binsearch(stabs, &left, &right, type, addr);
-//
-//     The search modifies *region_left and *region_right to bracket the
-//     'addr'.  *region_left points to the matching stab that contains
-//     'addr', and *region_right points just before the next stab.  If
-//     *region_left > *region_right, then 'addr' is not contained in any
-//     matching stab.
-//
-//     For example, given these N_SO stabs:
-//             Index  Type   Address
-//             0      SO     f0100000
-//             13     SO     f0100040
-//             117    SO     f0100176
-//             118    SO     f0100178
-//             555    SO     f0100652
-//             556    SO     f0100654
-//             657    SO     f0100849
-//     this code:
-//             left = 0, right = 657;
-//             stab_binsearch(stabs, &left, &right, N_SO, 0xf0100184);
-//     will exit setting left = 118, right = 554.
-//
-static void
-stab_binsearch(const stab_t *BND(__this, stab_end) stabs,
-           const stab_t *SNT stab_end,
-           int *region_left, int *region_right,
-              int type, uintptr_t addr)
-{
-       int l = *region_left, r = *region_right, any_matches = 0;
-       
-       while (l <= r) {
-               int true_m = (l + r) / 2, m = true_m;
-               
-               // search for earliest stab with right type
-               while (m >= l && stabs[m].n_type != type)
-                       m--;
-               if (m < l) {    // no match in [l, m]
-                       l = true_m + 1;
-                       continue;
-               }
-
-               // actual binary search
-               any_matches = 1;
-               if (stabs[m].n_value < addr) {
-                       *region_left = m;
-                       l = true_m + 1;
-               } else if (stabs[m].n_value > addr) {
-                       *region_right = m - 1;
-                       r = m - 1;
-               } else {
-                       // exact match for 'addr', but continue loop to find
-                       // *region_right
-                       *region_left = m;
-                       l = m;
-                       addr++;
-               }
-       }
-
-       if (!any_matches)
-               *region_right = *region_left - 1;
-       else {
-               // find rightmost region containing 'addr'
-               for (l = *region_right;
-                    l > *region_left && stabs[l].n_type != type;
-                    l--)
-                       /* do nothing */;
-               *region_left = l;
-       }
-}
-
-
-// debuginfo_eip(addr, info)
-//
-//     Fill in the 'info' structure with information about the specified
-//     instruction address, 'addr'.  Returns 0 if information was found, and
-//     negative if not.  But even if it returns negative it has stored some
-//     information into '*info'.
-//
-int
-debuginfo_eip(uintptr_t addr, eipdebuginfo_t *NONNULL info)
-{
-       const stab_t *SNT stab_end;
-       const stab_t *BND(__this,stab_end) stabs;
-       const char *SNT stabstr_end;
-       const char *NT BND(__this,stabstr_end) stabstr;
-       int lfile, rfile, lfun, rfun, lline, rline;
-
-       // Initialize *info
-       info->eip_file = "<unknown>";
-       info->eip_line = 0;
-       info->eip_fn_name = "<unknown>";
-       info->eip_fn_namelen = 9;
-       info->eip_fn_addr = addr;
-       info->eip_fn_narg = 0;
-
-       // Find the relevant set of stabs
-       if (addr >= ULIM) {
-               stab_end = __STAB_END__;
-               stabs = __STAB_BEGIN__;
-               stabstr_end = __STABSTR_END__;
-               stabstr = __STABSTR_BEGIN__;
-       } else {
-               // The user-application linker script, user/user.ld,
-               // puts information about the application's stabs (equivalent
-               // to __STAB_BEGIN__, __STAB_END__, __STABSTR_BEGIN__, and
-               // __STABSTR_END__) in a structure located at virtual address
-               // USTABDATA.
-               const user_stab_data_t *usd = (const user_stab_data_t *COUNT(1))TC(USTABDATA);
-
-               // Make sure this memory is valid.
-               // Return -1 if it is not.  Hint: Call user_mem_check.
-               // LAB 3: Your code here.
-
-               stab_end = usd->stab_end;
-               stabs = usd->stabs;
-               stabstr_end = usd->stabstr_end;
-               stabstr = usd->stabstr;
-
-               // Make sure the STABS and string table memory is valid.
-               // LAB 3: Your code here.
-       }
-
-       // String table validity checks
-       {
-               int stabstrsz = stabstr_end - stabstr;
-               if (stabstr_end <= stabstr || stabstr[stabstrsz-1] != 0)
-                       return -1;
-       }
-
-       // Now we find the right stabs that define the function containing
-       // 'eip'.  First, we find the basic source file containing 'eip'.
-       // Then, we look in that source file for the function.  Then we look
-       // for the line number.
-       
-       // Search the entire set of stabs for the source file (type N_SO).
-       lfile = 0;
-       rfile = (stab_end - stabs) - 1;
-       stab_binsearch(stabs, stab_end, &lfile, &rfile, N_SO, addr);
-       if (lfile == 0)
-               return -1;
-
-       // Search within that file's stabs for the function definition
-       // (N_FUN).
-       lfun = lfile;
-       rfun = rfile;
-       stab_binsearch(stabs, stab_end, &lfun, &rfun, N_FUN, addr);
-
-       if (lfun <= rfun) {
-               // stabs[lfun] points to the function name
-               // in the string table, but check bounds just in case.
-               if (stabs[lfun].n_strx < stabstr_end - stabstr)
-                       info->eip_fn_name = stabstr + stabs[lfun].n_strx;
-               info->eip_fn_addr = stabs[lfun].n_value;
-               addr -= info->eip_fn_addr;
-               // Search within the function definition for the line number.
-               lline = lfun;
-               rline = rfun;
-       } else {
-               // Couldn't find function stab!  Maybe we're in an assembly
-               // file.  Search the whole file for the line number.
-               info->eip_fn_addr = addr;
-               lline = lfile;
-               rline = rfile;
-       }
-       // Ignore stuff after the colon.
-       info->eip_fn_namelen = strfind(info->eip_fn_name, ':') - info->eip_fn_name;
-       
-       // Search within [lline, rline] for the line number stab.
-       // If found, set info->eip_line to the right line number.
-       // If not found, return -1.
-       //
-       // Hint:
-       //      There's a particular stabs type used for line numbers.
-       //      Look at the STABS documentation and <inc/stab.h> to find
-       //      which one.
-       // Your code here.
-
-       stab_binsearch(stabs, stab_end, &lline, &rline, N_SLINE, addr);
-       if (lline <= rline) 
-               // stabs[lline] points to the line number
-               info->eip_line = stabs[lline].n_value;
-       else
-               return -1;
-       
-       // Search backwards from the line number for the relevant filename
-       // stab.
-       // We can't just use the "lfile" stab because inlined functions
-       // can interpolate code from a different file!
-       // Such included source files use the N_SOL stab type.
-       while (lline >= lfile
-              && stabs[lline].n_type != N_SOL
-              && (stabs[lline].n_type != N_SO || !stabs[lline].n_value))
-               lline--;
-       if (lline >= lfile && stabs[lline].n_strx < stabstr_end - stabstr)
-               info->eip_file = stabstr + stabs[lline].n_strx;
-
-       // Set eip_fn_narg to the number of arguments taken by the function,
-       // or 0 if there was no containing function.
-       // Your code here.
-       info->eip_fn_narg = 0;
-       if (lfun <= rfun) {
-               lfun++;
-               while (stabs[lfun++].n_type == N_PSYM)
-                       info->eip_fn_narg++;
-       }
-       
-       return 0;
-}
diff --git a/kern/arch/i386/kernel.ld b/kern/arch/i386/kernel.ld
deleted file mode 100644 (file)
index 03b5d9a..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Simple linker script for the ROS kernel.
-   See the GNU ld 'info' manual ("info ld") to learn the syntax. */
-
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-       /* Link the kernel for 0xC01000C0, but load it at 0x001000C0) */
-
-       .text 0xC01000C0 : AT(0x001000C0) {
-               *(.text .stub .text.* .gnu.linkonce.t.*)
-       }
-
-       PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
-
-       .rodata : {
-               *(.rodata .rodata.* .gnu.linkonce.r.*)
-       }
-
-       /* Include debugging information in kernel memory */
-       .stab : {
-               PROVIDE(stab = .);
-               PROVIDE(__STAB_BEGIN__ = .);
-               *(.stab);
-               PROVIDE(estab = .);
-               PROVIDE(__STAB_END__ = .);
-               BYTE(0)         /* Force the linker to allocate space
-                                  for this section */
-       }
-
-       .stabstr : {
-               PROVIDE(stabstr = .);
-               PROVIDE(__STABSTR_BEGIN__ = .);
-               *(.stabstr);
-               PROVIDE(estabstr = .);
-               PROVIDE(__STABSTR_END__ = .);
-               BYTE(0)         /* Force the linker to allocate space
-                                  for this section */
-       }
-
-       /* Adjust the address for the data segment to the next page */
-       . = ALIGN(0x1000);
-
-       /* The data segment */
-       .data : {
-               *(.data)
-       }
-
-       PROVIDE(edata = .);
-
-       .bss : {
-               *(.bss)
-       }
-
-       PROVIDE(end = .);
-
-       /DISCARD/ : {
-               *(.eh_frame .note.GNU-stack)
-       }
-}
diff --git a/kern/arch/i386/membar.h b/kern/arch/i386/membar.h
deleted file mode 100644 (file)
index 1fa5df9..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _ARCH_MEMBAR_H
-#define _ARCH_MEMBAR_H
-
-#define mb() {rmb(); wmb();}
-#define rmb() ({ asm volatile("lfence"); })
-#define wmb() 
-/* Force a wmb, used in cases where an IPI could beat a write, even though
- *  * write-orderings are respected. */
-#define wmb_f() ({ asm volatile("sfence"); })
-
-#endif
diff --git a/kern/arch/i386/mmu.h b/kern/arch/i386/mmu.h
deleted file mode 100644 (file)
index 00712da..0000000
+++ /dev/null
@@ -1,389 +0,0 @@
-#ifndef ROS_INC_MMU_H
-#define ROS_INC_MMU_H
-
-#ifndef __ASSEMBLER__
-#include <ros/common.h>
-#endif
-
-#include <ros/arch/mmu.h>
-
-/*
- * This file contains definitions for the x86 memory management unit (MMU),
- * including paging- and segmentation-related data structures and constants,
- * the %cr0, %cr4, and %eflags registers, and traps.
- */
-
-/*
- *
- *     Part 1.  Paging data structures and constants.
- *
- */
-
-// A linear address 'la' has a three-part structure as follows:
-//
-// +--------10------+-------10-------+---------12----------+
-// | Page Directory |   Page Table   | Offset within Page  |
-// |      Index     |      Index     |                     |
-// +----------------+----------------+---------------------+
-//  \--- PDX(la) --/ \--- PTX(la) --/ \---- PGOFF(la) ----/
-//  \----------- PPN(la) -----------/
-//
-// The PDX, PTX, PGOFF, and PPN macros decompose linear addresses as shown.
-// To construct a linear address la from PDX(la), PTX(la), and PGOFF(la),
-// use PGADDR(PDX(la), PTX(la), PGOFF(la)).
-
-// page number field of address
-#define LA2PPN(la)     (((uintptr_t) (la)) >> PTXSHIFT)
-#define PTE2PPN(pte)   LA2PPN(pte)
-#define VPN(la)                PPN(la)         // used to index into vpt[]
-
-// page directory index
-#define PDX(la)                ((((uintptr_t) (la)) >> PDXSHIFT) & 0x3FF)
-#define VPD(la)                PDX(la)         // used to index into vpd[]
-
-// page table index
-#define PTX(la)                ((((uintptr_t) (la)) >> PTXSHIFT) & 0x3FF)
-
-// offset in page
-#define PGOFF(la)      (((uintptr_t) (la)) & 0xFFF)
-
-// offset in jumbo page
-#define JPGOFF(la)     (((uintptr_t) (la)) & 0x003FFFFF)
-
-// construct PTE from PPN and flags
-#define PTE(ppn, flags) ((ppn) << PTXSHIFT | (flags))
-
-// construct linear address from indexes and offset
-#define PGADDR(d, t, o)        ((void*SNT) ((d) << PDXSHIFT | (t) << PTXSHIFT | (o)))
-
-// Page directory and page table constants.
-#define NPDENTRIES     1024            // page directory entries per page directory
-#define NPTENTRIES     1024            // page table entries per page table
-
-#define PTXSHIFT       12              // offset of PTX in a linear address
-#define PDXSHIFT       22              // offset of PDX in a linear address
-
-// Page table/directory entry flags.
-#define PTE_P          0x001   // Present
-#define PTE_W          0x002   // Writeable
-#define PTE_U          0x004   // User
-#define PTE_PWT                0x008   // Write-Through
-#define PTE_PCD                0x010   // Cache-Disable
-#define PTE_A          0x020   // Accessed
-#define PTE_D          0x040   // Dirty
-#define PTE_PS         0x080   // Page Size (only applies to PDEs)
-#define PTE_PAT                0x080   // PAT (only applies to second layer PTEs)
-#define PTE_G          0x100   // Global Page
-
-#define PTE_PERM       (PTE_W | PTE_U) // The permissions fields
-// commly used access modes
-#define PTE_KERN_RW    PTE_W           // Kernel Read/Write
-#define PTE_KERN_RO    0               // Kernel Read-Only
-#define PTE_USER_RW    (PTE_W | PTE_U) // Kernel/User Read/Write
-#define PTE_USER_RO    PTE_U           // Kernel/User Read-Only
-
-// The PTE_AVAIL bits aren't used by the kernel or interpreted by the
-// hardware, so user processes are allowed to set them arbitrarily.
-#define PTE_AVAIL      0xE00   // Available for software use
-
-// Only flags in PTE_USER may be used in system calls.
-#define PTE_USER       (PTE_AVAIL | PTE_P | PTE_W | PTE_U)
-
-// address in page table entry
-#define PTE_ADDR(pte)  ((physaddr_t) (pte) & ~0xFFF)
-
-// Control Register flags
-#define CR0_PE         0x00000001      // Protection Enable
-#define CR0_MP         0x00000002      // Monitor coProcessor
-#define CR0_EM         0x00000004      // Emulation
-#define CR0_TS         0x00000008      // Task Switched
-#define CR0_ET         0x00000010      // Extension Type
-#define CR0_NE         0x00000020      // Numeric Error
-#define CR0_WP         0x00010000      // Write Protect
-#define CR0_AM         0x00040000      // Alignment Mask
-#define CR0_NW         0x20000000      // Not Writethrough - more tricky than it sounds
-#define CR0_CD         0x40000000      // Cache Disable
-#define CR0_PG         0x80000000      // Paging
-
-// These two relate to the cacheability (L1, etc) of the page directory
-#define CR3_PWT                0x00000008      // Page directory caching write through
-#define CR3_PCD                0x00000010      // Page directory caching disabled
-
-#define CR4_VME                0x00000001      // V86 Mode Extensions
-#define CR4_PVI                0x00000002      // Protected-Mode Virtual Interrupts
-#define CR4_TSD                0x00000004      // Time Stamp Disable
-#define CR4_DE         0x00000008      // Debugging Extensions
-#define CR4_PSE                0x00000010      // Page Size Extensions
-#define CR4_PAE                0x00000020      // Physical Address Extensions
-#define CR4_MCE                0x00000040      // Machine Check Enable
-#define CR4_PGE                0x00000080      // Global Pages Enabled
-#define CR4_PCE                0x00000100      // Performance counter enable
-#define CR4_OSFXSR     0x00000200      // OS support for FXSAVE/FXRSTOR
-#define CR4_OSXMME     0x00000400      // OS support for unmasked SIMD FP exceptions
-#define CR4_VMXE       0x00002000      // VMX enable
-#define CR4_SMXE       0x00004000      // SMX enable
-#define CR4_OSXSAVE    0x00040000      // XSAVE and processor extended states-enabled
-
-// Eflags register
-#define FL_CF          0x00000001      // Carry Flag
-#define FL_PF          0x00000004      // Parity Flag
-#define FL_AF          0x00000010      // Auxiliary carry Flag
-#define FL_ZF          0x00000040      // Zero Flag
-#define FL_SF          0x00000080      // Sign Flag
-#define FL_TF          0x00000100      // Trap Flag
-#define FL_IF          0x00000200      // Interrupt Flag
-#define FL_DF          0x00000400      // Direction Flag
-#define FL_OF          0x00000800      // Overflow Flag
-#define FL_IOPL_MASK   0x00003000      // I/O Privilege Level bitmask
-#define FL_IOPL_0      0x00000000      //   IOPL == 0
-#define FL_IOPL_1      0x00001000      //   IOPL == 1
-#define FL_IOPL_2      0x00002000      //   IOPL == 2
-#define FL_IOPL_3      0x00003000      //   IOPL == 3
-#define FL_NT          0x00004000      // Nested Task
-#define FL_RF          0x00010000      // Resume Flag
-#define FL_VM          0x00020000      // Virtual 8086 mode
-#define FL_AC          0x00040000      // Alignment Check
-#define FL_VIF         0x00080000      // Virtual Interrupt Flag
-#define FL_VIP         0x00100000      // Virtual Interrupt Pending
-#define FL_ID          0x00200000      // ID flag
-
-// Page fault error codes
-#define FEC_PR         0x1     // Page fault caused by protection violation
-#define FEC_WR         0x2     // Page fault caused by a write
-#define FEC_U          0x4     // Page fault occured while in user mode
-
-
-/*
- *
- *     Part 2.  Segmentation data structures and constants.
- *
- */
-
-// Global descriptor numbers
-#define GD_NULL   0x00     // NULL descriptor
-#define GD_KT     0x08     // kernel text
-#define GD_KD     0x10     // kernel data
-#define GD_UT     0x18     // user text
-#define GD_UD     0x20     // user data
-#define GD_TSS    0x28     // Task segment selector
-#define GD_LDT    0x30     // local descriptor table
-
-#ifdef __ASSEMBLER__
-
-/*
- * Macros to build GDT entries in assembly.
- */
-#define SEG_NULL                                               \
-       .word 0, 0;                                             \
-       .byte 0, 0, 0, 0
-#define SEG(type,base,lim)                                     \
-       .word (((lim) >> 12) & 0xffff), ((base) & 0xffff);      \
-       .byte (((base) >> 16) & 0xff), (0x90 | (type)),         \
-               (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
-
-#else  // not __ASSEMBLER__
-
-#include <ros/common.h>
-
-// Segment Descriptors
-typedef struct Segdesc {
-       unsigned sd_lim_15_0 : 16;  // Low bits of segment limit
-       unsigned sd_base_15_0 : 16; // Low bits of segment base address
-       unsigned sd_base_23_16 : 8; // Middle bits of segment base address
-       unsigned sd_type : 4;       // Segment type (see STS_ constants)
-       unsigned sd_s : 1;          // 0 = system, 1 = application
-       unsigned sd_dpl : 2;        // Descriptor Privilege Level
-       unsigned sd_p : 1;          // Present
-       unsigned sd_lim_19_16 : 4;  // High bits of segment limit
-       unsigned sd_avl : 1;        // Unused (available for software use)
-       unsigned sd_rsv1 : 1;       // Reserved
-       unsigned sd_db : 1;         // 0 = 16-bit segment, 1 = 32-bit segment
-       unsigned sd_g : 1;          // Granularity: limit scaled by 4K when set
-       unsigned sd_base_31_24 : 8; // High bits of segment base address
-} segdesc_t;
-// Null segment
-#define SEG_NULL       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
-// Segment that is loadable but faults when used
-#define SEG_FAULT      { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0 }
-// Normal segment
-#define SEG(type, base, lim, dpl)                                                                      \
-{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,      \
-    type, 1, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                       \
-    (unsigned) (base) >> 24 }
-// System segment (LDT)
-#define SEG_SYS(type, base, lim, dpl)                                                                  \
-{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,      \
-    type, 0, 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
-#define STA_X          0x8         // Executable segment
-#define STA_E          0x4         // Expand down (non-executable segments)
-#define STA_C          0x4         // Conforming code segment (executable only)
-#define STA_W          0x2         // Writeable (non-executable segments)
-#define STA_R          0x2         // Readable (executable segments)
-#define STA_A          0x1         // Accessed
-
-// System segment type bits
-#define STS_T16A       0x1         // Available 16-bit TSS
-#define STS_LDT                0x2         // Local Descriptor Table
-#define STS_T16B       0x3         // Busy 16-bit TSS
-#define STS_CG16       0x4         // 16-bit Call Gate
-#define STS_TG         0x5         // Task Gate / Coum Transmitions
-#define STS_IG16       0x6         // 16-bit Interrupt Gate
-#define STS_TG16       0x7         // 16-bit Trap Gate
-#define STS_T32A       0x9         // Available 32-bit TSS
-#define STS_T32B       0xB         // Busy 32-bit TSS
-#define STS_CG32       0xC         // 32-bit Call Gate
-#define STS_IG32       0xE         // 32-bit Interrupt Gate
-#define STS_TG32       0xF         // 32-bit Trap Gate
-
-#define SEG_COUNT      7               // Number of segments in the steady state
-#define LDT_SIZE       (8192 * sizeof(segdesc_t))
-
-/*
- *
- *     Part 3.  Traps.
- *
- */
-
-#ifndef __ASSEMBLER__
-
-// Task state segment format (as described by the Pentium architecture book)
-typedef struct Taskstate {
-       uint32_t ts_link;       // Old ts selector
-       uintptr_t ts_esp0;      // Stack pointers and segment selectors
-       uint16_t ts_ss0;        //   after an increase in privilege level
-       uint16_t ts_padding1;
-       uintptr_t ts_esp1;
-       uint16_t ts_ss1;
-       uint16_t ts_padding2;
-       uintptr_t ts_esp2;
-       uint16_t ts_ss2;
-       uint16_t ts_padding3;
-       physaddr_t ts_cr3;      // Page directory base
-       uintptr_t ts_eip;       // Saved state from last task switch
-       uint32_t ts_eflags;
-       uint32_t ts_eax;        // More saved state (registers)
-       uint32_t ts_ecx;
-       uint32_t ts_edx;
-       uint32_t ts_ebx;
-       uintptr_t ts_esp;
-       uintptr_t ts_ebp;
-       uint32_t ts_esi;
-       uint32_t ts_edi;
-       uint16_t ts_es;         // Even more saved state (segment selectors)
-       uint16_t ts_padding4;
-       uint16_t ts_cs;
-       uint16_t ts_padding5;
-       uint16_t ts_ss;
-       uint16_t ts_padding6;
-       uint16_t ts_ds;
-       uint16_t ts_padding7;
-       uint16_t ts_fs;
-       uint16_t ts_padding8;
-       uint16_t ts_gs;
-       uint16_t ts_padding9;
-       uint16_t ts_ldt;
-       uint16_t ts_padding10;
-       uint16_t ts_t;          // Trap on task switch
-       uint16_t ts_iomb;       // I/O map base address
-} taskstate_t;
-
-// Gate descriptors for interrupts and traps
-typedef struct Gatedesc {
-       unsigned gd_off_15_0 : 16;   // low 16 bits of offset in segment
-       unsigned gd_ss : 16;         // segment selector
-       unsigned gd_args : 5;        // # args, 0 for interrupt/trap gates
-       unsigned gd_rsv1 : 3;        // reserved(should be zero I guess)
-       unsigned gd_type : 4;        // type(STS_{TG,IG32,TG32})
-       unsigned gd_s : 1;           // must be 0 (system)
-       unsigned gd_dpl : 2;         // DPL - highest ring allowed to use this
-       unsigned gd_p : 1;           // Present
-       unsigned gd_off_31_16 : 16;  // high bits of offset in segment
-} gatedesc_t;
-
-// Set up a normal interrupt/trap gate descriptor.
-// - istrap: 1 for a trap (= exception) gate, 0 for an interrupt gate.
-//   - interrupt gates automatically disable interrupts (cli)
-// - sel: Code segment selector for interrupt/trap handler
-// - off: Offset in code segment for interrupt/trap handler
-// - dpl: Descriptor Privilege Level -
-//       the privilege level required for software to invoke
-//       this interrupt/trap gate explicitly using an int instruction.
-#define SETGATE(gate, istrap, sel, off, dpl)                   \
-{                                                              \
-       (gate).gd_off_15_0 = (uint32_t) (off) & 0xffff;         \
-       (gate).gd_ss = (sel);                                   \
-       (gate).gd_args = 0;                                     \
-       (gate).gd_rsv1 = 0;                                     \
-       (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32;        \
-       (gate).gd_s = 0;                                        \
-       (gate).gd_dpl = (dpl);                                  \
-       (gate).gd_p = 1;                                        \
-       (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)                        \
-{                                                              \
-       (gate).gd_off_15_0 = (uint32_t) (off) & 0xffff;         \
-       (gate).gd_ss = (ss);                                    \
-       (gate).gd_args = 0;                                     \
-       (gate).gd_rsv1 = 0;                                     \
-       (gate).gd_type = STS_CG32;                              \
-       (gate).gd_s = 0;                                        \
-       (gate).gd_dpl = (dpl);                                  \
-       (gate).gd_p = 1;                                        \
-       (gate).gd_off_31_16 = (uint32_t) (off) >> 16;           \
-}
-
-// Pseudo-descriptors used for LGDT, LLDT and LIDT instructions.
-typedef struct Pseudodesc {
-       uint16_t pd_lim;                // Limit
-       uint32_t pd_base;               // Base address
-} __attribute__ ((packed)) pseudodesc_t;
-
-extern segdesc_t (COUNT(SEG_COUNT) RO gdt)[];
-extern pseudodesc_t gdt_pd;
-
-#endif /* !__ASSEMBLER__ */
-
-#endif /* !ROS_INC_MMU_H */
diff --git a/kern/arch/i386/mptables.c b/kern/arch/i386/mptables.c
deleted file mode 100644 (file)
index 4cc6a62..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-// Not currently sharc complient. However
-// we should never be modifying these structures post smp_boot().
-
-#include <arch/ioapic.h>
-#include <arch/pci.h>
-#include <arch/mptables.h>
-
-#include <ros/common.h>
-#include <stdio.h>
-#include <string.h>
-#include <kmalloc.h>
-#include <arch/x86.h>
-
-/** @file
- * @brief Basic MP Tables Parser
- *
- * This file is responsible for locating, checksuming, and parsing the 
- * MultiProcessor Specification Tables.
- *
- * See Intel Multiprocessor Specification for more info
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- * @todo Extended table support (why?)
- * @todo Expanded error checking?
- * @todo virtaddr_t to match physaddr_t support?
- */
-
-// Important global items
-enum interrupt_modes current_interrupt_mode;
-
-proc_entry_t   *COUNT(mp_entries_count[PROC])   mp_proc_entries = NULL;
-bus_entry_t            *COUNT(mp_entries_count[BUS])    mp_bus_entries = NULL;
-ioapic_entry_t *COUNT(mp_entries_count[IOAPIC]) mp_ioapic_entries = NULL;
-int_entry_t            *COUNT(mp_entries_count[INT])    mp_int_entries = NULL;
-int_entry_t            *COUNT(mp_entries_count[LINT])   mp_lint_entries = NULL; 
-// ^ Not a typo. lint entries == int entries, so We just use that.
-
-
-int mp_entries_count[NUM_ENTRY_TYPES]; // How large each array is.
-
-pci_int_device_t pci_int_devices[PCI_MAX_BUS][PCI_MAX_DEV];
-isa_int_entry_t isa_int_entries[NUM_IRQS];
-ioapic_entry_t ioapic_entries[IOAPIC_MAX_ID];
-
-
-/** @brief Entry function to the mptable parser. Calling this function results in the parsing of the tables and setup of all structures
- *
- * This function does the following:
- *     - Search various locations in memory for the MP Floating Structure 
- *  - Checkum the floating structure to make sure its valid
- *  - Locate the MP Configuration Header, and checksum it
- *  - Locate all entries of type proc, bus, ioapic, int, lint
- *  - Parse the above entries and form the data structures that the rest of the system relies upon
- */
-void mptables_parse() {
-       
-       // Before we do anything. We didn't pack our structs because BSD didnt. Make sure we're sane.
-       if (    (sizeof(proc_entry_t)   != entry_types[PROC].length) || 
-                       (sizeof(bus_entry_t)    != entry_types[BUS].length) || 
-                       (sizeof(ioapic_entry_t) != entry_types[IOAPIC].length) || 
-                       (sizeof(int_entry_t)    != entry_types[INT].length) || 
-                       (sizeof(mpfps_t)                != MPFPS_SIZE) ||
-                       (sizeof(mpcth_t)                != MPCTH_SIZE) )
-                               panic("MPTable structure sizes out of sync with spec");
-                       
-                       
-       mpfps_t *mpfps;
-       
-       // Memsets to initalize all our structures to invalid entries
-       
-       /* Setup the indexable ioapic array.
-        * YOU MUST check the flag field to see if its 0. If 0, unusable.
-        * This is defined by MPTables, and I leaverage this with the memset below to set invalid
-        */
-       memset(ioapic_entries, 0, sizeof(ioapic_entries));
-       
-       // We define an IOAPIC DEST ID of 0xFF (>=256) to be invalid. Pack with all 1's.
-       memset(pci_int_devices, 0xFF, sizeof(pci_int_devices));
-       memset(isa_int_entries, 0xFF, sizeof(isa_int_entries));
-       
-       
-       mptables_info("Starting MPTables Parsing...\n");
-       
-       /*  Basic procedure:
-        *      1) Find floating pointer
-        *      2) Go to addr referenced by floating pointer
-        *      3) Read table header info
-        *
-        * We now have to search through 3 address regions searching for a magic string.
-        *
-        *
-        * Note: The pointer can actually be elsewhere. See the FBSD MPTables implimentation for more info
-        * Just doesn't make sense right now to check more places.
-        */
-       
-       // Search the BIOS ROM Address Space (MOST LIKELY)
-       mptables_dump("-->Searching BIOS ROM Area...\n");
-       mpfps = find_floating_pointer((physaddr_t)KADDR(BIOS_ROM_BASE), (physaddr_t)KADDR(BIOS_ROM_BOUND));
-       
-       if (mpfps == NULL) {
-               
-               /* Search the EBDA UNTESTED, haven't found something that uses this.
-                *
-                * First, we have to find the EBDA Addr.
-                * This USSUALLY works (based on third hand info). May be some cases where it doesnt.
-                * See osdev x86 mem-map for more information
-                */
-               physaddr_t ebda_base = READ_FROM_STORED_PHYSADDR32(EBDA_POINTER);
-               
-               if (ebda_base) {
-                       ebda_base = ebda_base << 4;
-                       ebda_base = (physaddr_t)KADDR(ebda_base);
-                       physaddr_t ebda_bound = ebda_base + EBDA_SIZE - sizeof(mpfps_t);
-                       
-                       mptables_dump("-->Searching EBDA...\n");
-                       mpfps = find_floating_pointer(ebda_base, ebda_bound);
-               }
-       }
-
-       if (mpfps == NULL) {
-               /* Search the last KB of system memory UNTESTED
-                * Note: Will only be there if it not in the EBDA. So this must be called after the EBDA check.
-                * This logic is ripped from mptables without much understanding. No machine to test it on.
-                */
-               
-               physaddr_t top_of_mem = READ_FROM_STORED_PHYSADDR32(TOPOFMEM_POINTER);
-               
-               if (top_of_mem) {
-                       --top_of_mem;
-                       top_of_mem = top_of_mem * 1024;
-                       
-                       top_of_mem = (physaddr_t)KADDR(top_of_mem);
-               
-               mptables_dump("-->Searching top of (real mode) Ram...\n");
-                       mpfps = find_floating_pointer(top_of_mem, top_of_mem + 1024 - sizeof(mpfps_t));
-               }
-       }
-       
-       if (mpfps == NULL) {
-               /* Search the last KB of system memory based on a 640K limited, due to CMOS lying
-                * Note: Will only be there if it not in the EBDA. So this must be called after the EBDA check.
-                * This IS tested. Thanks VirtualBox!
-                */
-                               
-               physaddr_t top_of_mem = DEFAULT_TOPOFMEM;
-               
-               if (top_of_mem) {
-                               
-                       top_of_mem = top_of_mem - 1024;
-                       
-                       top_of_mem = (physaddr_t)KADDR(top_of_mem);
-               
-               mptables_dump("-->Searching top of (real mode) Ram 640K cap, incase CMOS lied...\n");
-                       mpfps = find_floating_pointer(top_of_mem, top_of_mem + 1024 - sizeof(mpfps_t));
-               }
-       }
-
-       /* If we can't find the pointer, it means we are running on a non-mp compliant machine.
-        * This is bad. We can't do interrupts the way we want.
-        * We could have this trigger a MODE in which we operate using the standard PIC, if we really wanted...
-        */
-       if (mpfps == NULL) {
-               panic("MPTABLES Not found. IOAPIC and interrupts will not function properly. <Insert whale held up by smaller birds here>");
-       }
-       
-       mptables_info("-->MPTables Floating Pointer Structure found @ KVA 0x%p.\n", mpfps);
-       
-       mptables_info("-->Current Interrupt Mode: ");
-       // Identify our interrupt mode
-       if (mpfps->mpfb2 & IMCRP_MASK) {
-               current_interrupt_mode = PIC;
-               mptables_info("PIC\n");
-               // TODO: Do SOMETHING here. We've never found such a system (they are generally ancient). Should we just panic?
-       }
-       else {
-               current_interrupt_mode = VW;
-               mptables_info("Virtual Wire\n");
-       }
-       
-       configuration_parse((physaddr_t)KADDR((uint32_t)(mpfps->pap)));
-       
-       proc_parse();
-       bus_parse();
-       ioapic_parse();
-       int_parse();
-       lint_parse();
-       
-}
-
-
-/** @brief Take the given memory range and search for the MP Floating Structure
- * 
- * This function will look at every sizeof(mpfps_t) chunch of memory for a given 4byte value (_MP_)
- * until bound is reached (inclusive).
- *
- * Note: Doesn't ensure bounds are sane. This shouldnt be an issue as this function should be priviate to mptables_parse()
- *
- * @param[in] base     The base (kernel virtual) address we start looking at
- * @param[in] bound The bound (inclusive kernel virtual) address we stop looking at
- * 
- * @return MPFPS The virtual address of the base of the floating point structure
- * @return NULL No floating point structure exists in this range
- */
-mpfps_t *find_floating_pointer(physaddr_t base, physaddr_t bound) {
-
-       uint32_t count = (bound - base + sizeof(mpfps_t))/sizeof(mpfps_t);
-
-       // This trusted count was authorized with the blessing of Zach.
-       // Blame Intel and the MP Spec for making me do this cast.
-       mpfps_t* mpfps = (mpfps_t* COUNT(count)) TC(base);
-
-       // Loop over the entire range looking for the signature. The signature is ascii _MP_, which is
-       //  stored in the given MP_SIG
-       while ( ((physaddr_t)mpfps <= bound) && (READ_FROM_STORED_VIRTADDR32(mpfps->signature) != MP_SIG)) {
-               mpfps++;
-       }
-       
-       if ((physaddr_t)mpfps > bound) 
-               return NULL;
-       
-       // Now perform a checksum on the float
-       if (checksum((physaddr_t)mpfps, sizeof(mpfps_t) * mpfps->length) == FALSE) {
-               mptables_dump("-->Failed a MPTables Floating Pointer Structure checksum @ KVA 0x%p.\n", mpfps);
-               
-               // If we fail we need to keep checking. But if we are on the last addr
-               //      we just fail.
-               if ((physaddr_t)mpfps == bound)
-                       return NULL;
-               
-               return find_floating_pointer((physaddr_t)(mpfps + 1), bound);
-       }
-       
-       return mpfps;
-}
-
-/** @brief Perform the mptable checksum on the memory given by addr and len
- *
- * This function will take len bytes of memory starting at the (kernel virtual)
- * address addr and sum them together. If the result is 0, the checksum is valid. 
- *
- * @param[in] addr     The base (kernel virtual) address we start checking 
- * @param[in] len      How many bytes to look at
- * 
- * @return TRUE Valid checksum
- * @return FALSE Invalid checksum
- */
-bool checksum(physaddr_t addr, uint32_t len) {
-       // MP Table checksums must add up to 0.
-       uint8_t checksum = 0;
-       
-       // Yet another trusted cast. 
-       // See comment at start of find_floating_pointer
-       uint8_t *addr_p = (uint8_t* COUNT(len)) TC(addr);
-
-       for (int i = 0; i < len; i++)
-               checksum += *(addr_p + i);
-
-       return (checksum == 0);
-}
-
-/** @brief Parse the configuration MP Table given a valid address to the base of the table
- *
- * This function begin examining a given (kernel virtual) address assuming it is the base 
- * of the configuration table. It will determine the size of the table, and then loop over
- * each entry in the table, loading all entires into the correct corresponding data structures
- *
- * @param[in] conf_addr                The base (kernel virtual) address of the configuration table
- */    
-void configuration_parse(physaddr_t conf_addr) {
-       
-       int num_processed[NUM_ENTRY_TYPES];
-       
-       // Another. See comment at start of find_floating_pointer
-       mpcth_t *mpcth = (mpcth_t* COUNT(1)) TC(conf_addr);
-       
-       for (int i = 0; i < NUM_ENTRY_TYPES; i++) {
-               mp_entries_count[i] = num_processed[i] = 0;
-       }
-               
-       // Do 1 pass to figure out how much space to allocate.
-       // Note: Length here means length in bytes. This is from the mp spec.
-       uint16_t num_entries = mpcth->entry_count;
-       uint16_t mpct_length = mpcth->base_table_length;
-       uint16_t entries_length = mpct_length - sizeof(mpcth);
-       
-       // Now perform a checksum on the configuration table
-       if (checksum((physaddr_t)mpcth, mpct_length) == FALSE) {
-               panic("FAILED MP CONFIGURATION CHECKSUM.");
-       }
-       
-       uint8_t * COUNT(entries_length) entry_base = (uint8_t* COUNT(entries_length)) TC(mpcth + 1);
-       uint8_t * BND(entry_base, entry_base + entries_length) current_addr = entry_base;
-       
-       for (int i = 0; i < num_entries; i++) {
-               uint8_t current_type = *current_addr;
-               if (current_type >= NUM_ENTRY_TYPES)
-                       panic("CORRUPT MPTABLES CONFIGURATION ENTRY");
-                       
-               mp_entries_count[current_type]++;
-               current_addr += entry_types[current_type].length;
-       }
-       
-       // Allocate the correct space in the arrays (unrolled for ivy reasons)
-       if (mp_entries_count[PROC] != 0) {
-               mp_proc_entries = kmalloc(mp_entries_count[PROC] * entry_types[PROC].length , 0);
-               if (mp_proc_entries == NULL)
-                       panic("Failed to allocate space for mp_proc_entires");
-       }
-
-       if (mp_entries_count[BUS] != 0) {
-               mp_bus_entries = kmalloc(mp_entries_count[BUS] * entry_types[BUS].length , 0);
-               if (mp_bus_entries == NULL)
-                       panic("Failed to allocate space for mp_bus_entires");
-       }
-
-       if (mp_entries_count[IOAPIC] != 0) {
-               mp_ioapic_entries = kmalloc(mp_entries_count[IOAPIC] * entry_types[IOAPIC].length , 0);
-               if (mp_ioapic_entries == NULL)
-                       panic("Failed to allocate space for mp_ioapic_entires");
-       }
-       
-       if (mp_entries_count[INT] != 0) {
-               mp_int_entries = kmalloc(mp_entries_count[INT] * entry_types[INT].length , 0);
-               if (mp_int_entries == NULL)
-                       panic("Failed to allocate space for mp_int_entires");
-       }
-
-       if (mp_entries_count[LINT] != 0) {
-               mp_lint_entries = kmalloc(mp_entries_count[LINT] * entry_types[LINT].length , 0);
-               if (mp_lint_entries == NULL)
-                       panic("Failed to allocate space for mp_lint_entires");
-       }
-       
-       current_addr = entry_base;
-       
-       for (int i = 0; i < num_entries; i++) {
-               uint8_t current_type = *((uint8_t*)current_addr);
-               if (current_type >= NUM_ENTRY_TYPES)
-                       panic("CORRUPT MPTABLES CONFIGURATION ENTRY.. after we already checked? Huh.");
-               
-               if (num_processed[current_type] >= mp_entries_count[current_type])
-                       panic("MPTABLES LIED ABOUT NUMBER OF ENTRIES. NO IDEA WHAT TO DO!");
-               
-               switch (current_type) {
-                       case PROC:
-                               memcpy( &mp_proc_entries[num_processed[PROC]], 
-                                               current_addr,  
-                                               entry_types[PROC].length);
-                               break;
-                       
-                       case BUS:
-                               memcpy( &mp_bus_entries[num_processed[BUS]], 
-                                               current_addr,  
-                                               entry_types[BUS].length);
-                               break;
-                       case IOAPIC:
-                               memcpy( &mp_ioapic_entries[num_processed[IOAPIC]], 
-                                               // This is needed due to the void* in the entry
-                                               //  no clean way of doing this. Sorry Zach.
-                                               (ioapic_entry_t* COUNT(1)) TC(current_addr),  
-                                               entry_types[IOAPIC].length);
-                               break;
-                       case INT:
-                               memcpy( &mp_int_entries[num_processed[INT]], 
-                                               current_addr,  
-                                               entry_types[INT].length);
-                               break;
-                       case LINT:
-                               memcpy( &mp_lint_entries[num_processed[LINT]], 
-                                               (void*)current_addr,  
-                                               entry_types[LINT].length);
-                               break;
-                                               
-                       default: panic("UNKNOWN ENTRY TYPE");
-               }
-
-               num_processed[current_type]++;
-               current_addr += entry_types[current_type].length;
-       }
-       
-       // We'd do extended table support stuff here (or alter the loop above)
-       
-       // We now have all of our entries copied into a single structure we can index into. Yay.
-}
-
-/** @brief Parse all processor mptable entires
- *
- * This function will loop over the raw proc entry structure and parse it into a usable form.
- * This currently just prints stuff if dumping is enabled.
- */
-void proc_parse() {
-       // For now, we don't do anything with the processor entries. Just print them.
-       
-       for (int i = 0; i < mp_entries_count[PROC]; i++){
-               mptables_dump("Proc entry %u\n", i);
-               mptables_dump("-->type: %x\n", mp_proc_entires[i].type);
-               mptables_dump("-->apic ID: %x\n", mp_proc_entires[i].apic_id);
-               mptables_dump("-->apic Version: %x\n", mp_proc_entires[i].apic_version);
-               mptables_dump("-->cpu Flags: %x\n", mp_proc_entires[i].cpu_flags);
-               mptables_dump("-->cpu Signaure: %x\n", mp_proc_entires[i].cpu_signature);
-               mptables_dump("-->feature Flags: %x\n", mp_proc_entires[i].feature_flags);
-       }
-       
-       mptables_dump("\n");
-}
-
-/** @brief Parse all bus mptable entires
- *
- * This function will loop over the raw bus entry structure and parse it into a usable form
- * This currently just prints stuff if dumping is enabled. (With a basic sanity check).
- */
-void bus_parse() {
-       // Do we need to sort this?
-       // For now, don't. We assume the index into this structure matches the type.
-       // This seems to be implied from the configuration
-       
-       for (int i = 0; i < mp_entries_count[BUS]; i++){
-               if (i != mp_bus_entries[i].bus_id) 
-                       panic("Oh noes! We need to sort entries. The MP Spec lied! Ok lied is too strong a word, it implied.");
-                       
-               mptables_dump("Bus entry %u\n", i);
-               mptables_dump("-->type: %x\n", mp_bus_entries[i].type);
-               mptables_dump("-->Bus ID: %x\n", mp_bus_entries[i].bus_id);
-               mptables_dump("-->Bus: %c%c%c\n", mp_bus_entries[i].bus_type[0], mp_bus_entries[i].bus_type[1], mp_bus_entries[i].bus_type[2]);
-       
-       }
-       
-       mptables_dump("\n");
-}
-
-/** @brief Parse all ioapic mptable entires
- *
- * This function will loop over the raw ioapic entry structure and parse it into a usable form.
- * ioapic_entires[] contains all found ioapics after this function.
- */
-void ioapic_parse() {
-
-       // Note: We don't check if the apicFlags is 0. If zero, unusable
-       // This should be done elsewhere.
-       
-       // mp_entries_count[IOAPIC] contains the number of ioapics on this system
-       
-       for (int i = 0; i < mp_entries_count[IOAPIC]; i++){
-               
-               memcpy((void*)(ioapic_entries + mp_ioapic_entries[i].apic_id), (void*)(mp_ioapic_entries + i), sizeof(ioapic_entry_t));
-               
-               mptables_dump("IOAPIC entry %u\n", i);
-               mptables_dump("-->type: %x\n", mp_ioapic_entries[i].type);
-               mptables_dump("-->apic_id: %x\n", mp_ioapic_entries[i].apic_id);
-               mptables_dump("-->apic_version: %x\n", mp_ioapic_entries[i].apic_version);
-               mptables_dump("-->apic_flags: %x\n", mp_ioapic_entries[i].apic_flags);
-               mptables_dump("-->apic_address: %p\n", mp_ioapic_entries[i].apic_address);
-               
-       }
-       mptables_dump("\n");
-}
-
-/** @brief Parse all interrupt mptable entires
- *
- * This function will loop over the raw interrupt entry structure and parse it into a usable form.
- * pci_int_devices[] and isa_int_entries[] will be populated after this function is called.
- */
-void int_parse() {
-       // create a massive array, tied together with bus/dev, for indexing
-       
-       for (int i = 0; i < mp_entries_count[INT]; i++){
-               mptables_dump("Interrupt entry %u\n", i);
-               mptables_dump("-->type: %x\n", mp_int_entries[i].type);
-               mptables_dump("-->int Type: %x\n", mp_int_entries[i].int_type);
-               mptables_dump("-->int Flags: %x\n", mp_int_entries[i].int_flags);
-               mptables_dump("-->src Bus ID: %u\n", mp_int_entries[i].src_bus_id);
-               mptables_dump("-->src Device: %u (PCI ONLY)\n", (mp_int_entries[i].src_bus_irq >> 2) & 0x1F);
-               mptables_dump("-->src Bus IRQ: %x\n", mp_int_entries[i].src_bus_irq);
-               mptables_dump("-->dst Apic ID: %u\n", mp_int_entries[i].dst_apic_id);
-               mptables_dump("-->dst Apic INT: %u\n", mp_int_entries[i].dst_apic_int);
-                                       
-       }
-       mptables_dump("\n");
-
-       // Populate the PCI/ISA structure with the interrupt entries.
-       for (int i = 0; i < mp_entries_count[INT]; i++) {
-               if (strncmp(mp_bus_entries[mp_int_entries[i].src_bus_id].bus_type, "PCI", 3) == 0) {
-                       int bus_idx, dev_idx, line_idx;
-                       bus_idx = mp_int_entries[i].src_bus_id;
-                       dev_idx = (mp_int_entries[i].src_bus_irq >> 2) & 0x1F;
-                       line_idx = mp_int_entries[i].src_bus_irq & 0x3;
-                       pci_int_devices[bus_idx][dev_idx].line[line_idx].dst_apic_id = mp_int_entries[i].dst_apic_id;
-                       pci_int_devices[bus_idx][dev_idx].line[line_idx].dst_apic_int = mp_int_entries[i].dst_apic_int;
-               }
-               
-               if (strncmp(mp_bus_entries[mp_int_entries[i].src_bus_id].bus_type, "ISA", 3) == 0) {
-                       int irq = mp_int_entries[i].src_bus_irq;
-                       int int_type = mp_int_entries[i].int_type;
-                       
-                       if (int_type == 3) {
-                               /* THIS IS WHERE THE PIC CONNECTS TO THE IOAPIC
-                                * WE DON'T CURRENTLY DO ANYTHING WITH THIS, BUT SHOULD WE NEED TO
-                                * HERES WHERE TO LOOK!
-                                * WE MUST NOT PLACE THIS INTO OUR TABLE AS IRQ HAS NO REAL MEANING AFAPK
-                                */
-                               continue;
-                               
-                               /* Note. On the dev boxes the pit and pic both claim to be on irq 0
-                                * However the pit and the pic are on different ioapic entries.
-                                * Seems odd. Not sure whats up with this. Paul assumes the IRQ has no meaning
-                                * in regards to the pic... which makes sense.
-                                */
-                       }
-                                               
-                       if ((isa_int_entries[irq].dst_apic_id != 0xFFFF) && 
-                                ((isa_int_entries[irq].dst_apic_id != mp_int_entries[i].dst_apic_id) 
-                                  || (isa_int_entries[irq].dst_apic_int != mp_int_entries[i].dst_apic_int)))
-                               panic("SAME IRQ MAPS TO DIFFERENT IOAPIC/INTN'S. THIS DEFIES LOGIC.");
-                       
-                       isa_int_entries[irq].dst_apic_id = mp_int_entries[i].dst_apic_id;
-                       isa_int_entries[irq].dst_apic_int = mp_int_entries[i].dst_apic_int;
-               }                       
-       }
-}
-
-/** @brief Parse all local interrupt mptable entires
- *
- * This function will loop over the raw local interrupt entry structure and parse it into a usable form.
- * This currently just prints stuff if dumping is enabled.
- */
-
-void lint_parse() {
-       // For now, we don't do anything with the local interrupt entries
-       
-       for (int i = 0; i < mp_entries_count[LINT]; i++){
-               mptables_dump("Local Interrupt entry %u\n", i);
-               mptables_dump("-->type: %x\n", mp_lint_entries[i].type);
-               mptables_dump("-->int Type: %x\n", mp_lint_entries[i].int_type);
-               mptables_dump("-->src Bus ID: %x\n", mp_lint_entries[i].src_bus_id);
-               mptables_dump("-->src Bus IRQ: %x\n", mp_lint_entries[i].src_bus_irq);
-               mptables_dump("-->dst Apic ID: %p\n", mp_lint_entries[i].dst_apic_id);
-               mptables_dump("-->dst Apic INT: %p\n", mp_lint_entries[i].dst_apic_int);
-               
-       }
-}
diff --git a/kern/arch/i386/mptables.h b/kern/arch/i386/mptables.h
deleted file mode 100644 (file)
index afee595..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifndef ROS_INC_MPTABLES_H
-#define ROS_INC_MPTABLES_H
-
-#include <ros/common.h>
-#include <pmap.h>
-
-/* 
- * LICENCE NOTE: Most of these structures and some constants
- * were blatently ripped out of BSD with <3. Only the camel 
- * casing has been changed to protect the innocent.
- */
-
-// OBSCENELY IMPORTANT NOTE: None of this is packed. I didn't do it because BSD didnt. This may need to change
-
-#define mptables_info(...)  printk(__VA_ARGS__)  
-#define mptables_dump(...)  //printk(__VA_ARGS__)  
-
-// The HEX representation of the ascii string _MP_ we search for
-#define MP_SIG                         0x5f504d5f      /* _MP_ */
-
-// Base and (inclusive bound) of the BIOS region to check
-#define BIOS_ROM_BASE          0xf0000
-#define BIOS_ROM_BOUND                 0xffff0 
-
-// Where to look for the EBDA pointer
-// Bound is dynamic. In first KB
-#define EBDA_POINTER           0x040e 
-#define EBDA_SIZE                      1024
-
-/* BIOS: base memory size */
-#define TOPOFMEM_POINTER       0x0413          
-#define IMCRP_MASK                     0x80
-
-// Sometimes the BIOS is a lying pain in my ass
-// so don't believe it and assume this top of memory and check it
-#define DEFAULT_TOPOFMEM       0xa0000
-
-// How many entry types exist? Won't ever change
-#define NUM_ENTRY_TYPES        5
-
-#define INVALID_DEST_APIC      0xffff
-
-#define MPFPS_SIZE                     16 // For ivy
-#define MPCTH_SIZE                     44
-
-// Sorry Zach, this has to be done.
-#define READ_FROM_STORED_PHYSADDR32(addr)  READ_FROM_STORED_VIRTADDR32(KADDR(addr))
-#define READ_FROM_STORED_VIRTADDR32(addr)  *((uint32_t* SAFE)addr)
-
-
-enum interrupt_modes {
-       PIC, // PIC Mode 
-       VW,  // Virtural Wire Mode (Dev Boxes)
-       SIO  // Once we fix up the ioapic, shift to this mode (not currently used)
-};
-
-// Start BSDs lovingly barrowed structs/etc
-
-enum entry_types {
-       PROC =          0,
-       BUS  =          1,
-       IOAPIC =        2,
-       INT =           3,
-       LINT =          4
-};
-
-enum bus_types {
-    CBUS = 1,
-    CBUSII = 2,
-    EISA = 3,
-    ISA = 6,
-    PCI = 13,
-    XPRESS = 18,
-    MAX_BUSTYPE = 18,
-    UNKNOWN_BUSTYPE = 0xff
-};
-
-typedef struct BUSTYPENAME {
-    uint8_t    type;
-    char       name[ 7 ];
-} bus_type_name_t;
-
-static bus_type_name_t bus_type_table[] =
-{
-    { CBUS,            "CBUS"   },
-    { CBUSII,          "CBUSII" },
-    { EISA,            "EISA"   },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { ISA,             "ISA"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { PCI,             "PCI"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    },
-    { UNKNOWN_BUSTYPE, "---"    }
-};
-
-
-
-typedef struct TABLE_ENTRY {
-    uint8_t    type;
-    uint8_t    length;
-    char       name[ 32 ];
-} table_entry_t;
-
-static table_entry_t entry_types[] =
-{
-    { 0, 20, "Processor" },
-    { 1,  8, "Bus" },
-    { 2,  8, "I/O APIC" },
-    { 3,  8, "I/O INT" },
-    { 4,  8, "Local INT" }
-};
-
-/* MP Floating Pointer Structure */
-typedef struct MPFPS {
-    char       signature[ 4 ];
-    void*      pap;
-    uint8_t    length;
-    uint8_t    spec_rev;
-    uint8_t    checksum;
-    uint8_t    mpfb1;
-    uint8_t    mpfb2;
-    uint8_t    mpfb3;
-    uint8_t    mpfb4;
-    uint8_t    mpfb5;
-} mpfps_t;
-
-
-/* MP Configuration Table Header */
-typedef struct MPCTH {
-    char       signature[ 4 ];
-    uint16_t   base_table_length;
-    uint8_t            spec_rev;
-    uint8_t            checksum;
-    uint8_t            oem_id[ 8 ];
-    uint8_t            product_id[ 12 ];
-    void*              oem_table_pointer;
-    uint16_t   oem_table_size;
-    uint16_t   entry_count;
-    void*              apic_address;
-    uint16_t   extended_table_length;
-    uint8_t            extended_table_checksum;
-    uint8_t            reserved;
-} mpcth_t;
-
-typedef struct PROCENTRY {
-    uint8_t            type;
-    uint8_t            apic_id;
-    uint8_t            apic_version;
-    uint8_t            cpu_flags;
-    uint32_t   cpu_signature;
-    uint32_t   feature_flags;
-    uint32_t   reserved1;
-    uint32_t   reserved2;
-} proc_entry_t;
-
-typedef struct BUSENTRY {
-    uint8_t    type;
-    uint8_t    bus_id;
-    char (NT bus_type)[ 6 ];
-} bus_entry_t;
-
-typedef struct IOAPICENTRY {
-    uint8_t    type;
-    uint8_t    apic_id;
-    uint8_t    apic_version;
-    uint8_t    apic_flags;
-    void*      apic_address;
-} ioapic_entry_t;
-
-typedef struct INTENTRY {
-    uint8_t            type;
-    uint8_t            int_type;
-    uint16_t   int_flags;
-    uint8_t            src_bus_id;
-    uint8_t            src_bus_irq;
-    uint8_t            dst_apic_id;
-    uint8_t            dst_apic_int;
-} int_entry_t;
-
-typedef struct PCIINTENTRY {
-    uint16_t   dst_apic_id; // A value of INVALID_DEST_APIC means invalid (>=256)
-    uint8_t            dst_apic_int;
-} pci_int_entry_t;
-
-typedef pci_int_entry_t isa_int_entry_t;
-
-typedef struct PCIINTDEVICE {
-       pci_int_entry_t line[4];
-} pci_int_device_t;
-
-// Prototypes
-void mptables_parse();
-mpfps_t * COUNT(MPFPS_SIZE) find_floating_pointer(physaddr_t base, physaddr_t bound);
-bool checksum(physaddr_t addr, uint32_t len);
-void configuration_parse(physaddr_t conf_addr);
-
-void proc_parse();
-void bus_parse();
-void ioapic_parse();
-void int_parse();
-void lint_parse();
-
-#endif /* !ROS_INC_MPTABLES_H */
diff --git a/kern/arch/i386/ne2k.c b/kern/arch/i386/ne2k.c
deleted file mode 100644 (file)
index 6acd541..0000000
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/mmu.h>
-#include <arch/x86.h>
-#include <arch/smp.h>
-#include <arch/apic.h>
-#include <arch/pci.h>
-#include <arch/ne2k.h>
-
-#include <ros/memlayout.h>
-
-#include <atomic.h>
-#include <stdio.h>
-#include <string.h>
-#include <trap.h>
-#include <kmalloc.h>
-
-#include <pmap.h>
-#include <timing.h>
-
-/** @file
- * @brief NE2K Driver Sketch
- *
- * EXPERIMENTAL.
- *
- * Rough driver. Appears to work in QEMU. Probably completely broken under heavy load.
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- * @todo Everything
- */
-
-#define NE2K_RESET_R_ADDR 0x1f
-#define NE2K_PG0_RW_CR 0x00
-#define NE2K_PG0_RW_ISR 0x07
-#define NE2K_PG0_W_IMR 0x0F
-#define NE2K_PG0_W_PSTRT 0x1
-#define NE2K_PG0_W_PSTP 0x2
-#define NE2K_PG0_W_RCR 0xC
-#define NE2K_PG0_R_RSR 0xC
-#define NE2K_PG0_R_TSR 0x4
-#define NE2K_PG0_W_TCR 0xD
-#define NE2K_PG1_RW_PAR 0x1
-#define NE2K_PG0_W_RSAR0 0x08
-#define NE2K_PG0_W_RSAR1 0x09
-#define NE2K_PG0_W_RBCR0 0x0A
-#define NE2K_PG0_W_RBCR1 0x0B
-#define NE2K_PG0_W_TBCR0 0x05
-#define NE2K_PG0_W_TBCR1 0x06
-#define NE2K_PG0_W_TPSR  0x04
-#define NE2K_PG0_W_DCR 0x0E
-#define NE2K_PG1_RW_CURR 0x07
-#define NE2K_PG0_RW_BNRY 0x03
-
-#define NE2K_PAGE_SIZE 256
-
-#define NE2K_PMEM_START   (16*1024)
-#define NE2K_PMEM_SIZE   (32*1024)
-#define NE2K_NUM_PAGES                 ((NE2K_PMEM_SIZE - NE2K_PMEM_START) / NE2K_PAGE_SIZE)
-#define NE2K_NUM_RECV_PAGES    (NE2K_NUM_PAGES / 2)
-#define NE2K_NUM_SEND_PAGES    (NE2K_NUM_PAGES / 2)
-#define NE2K_FIRST_RECV_PAGE   (NE2K_PMEM_START / NE2K_PAGE_SIZE)
-#define NE2K_LAST_RECV_PAGE    NE2K_FIRST_RECV_PAGE + NE2K_NUM_RECV_PAGES
-#define NE2K_FIRST_SEND_PAGE   NE2K_LAST_RECV_PAGE + 1
-
-
-#define SET_PAGE_0() (inb(ne2k_io_base_addr + NE2K_PG0_RW_CR) & 0x3F)
-
-extern uint32_t eth_up; // Fix this                               
-uint32_t ne2k_irq;      // And this
-uint32_t ne2k_io_base_addr;
-char device_mac[6];
-
-extern uint32_t packet_buffer_count;
-extern char* packet_buffer[PACKET_BUFFER_SIZE];
-extern uint32_t packet_buffer_sizes[PACKET_BUFFER_SIZE];
-extern uint32_t packet_buffer_head;
-extern uint32_t packet_buffer_tail;
-spinlock_t packet_buffer_lock;
-
-
-void* base_page;
-uint32_t num_pages = 0;
-
-extern char *CT(PACKET_HEADER_SIZE + len) (*packet_wrap)(const char *CT(len) data, size_t len);
-extern int (*send_frame)(const char *CT(len) data, size_t len);
-
-
-void ne2k_init() {
-       
-       if (ne2k_scan_pci() < 0) return;
-       ne2k_mem_alloc();
-       ne2k_configure_nic();
-       ne2k_read_mac();
-       //ne2k_test_interrupts();
-
-       packet_wrap = &ne2k_packet_wrap;
-       send_frame = &ne2k_send_frame;
-
-        ne2k_setup_interrupts();
-
-       eth_up = 1;
-
-       return;
-}
-
-
-int ne2k_scan_pci() {
-       
-       extern pci_dev_entry_t pci_dev_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-       extern uint16_t pci_irq_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-
-       cprintf("Searching for NE2000 Network device...");
-
-       for (int i = 0; i < PCI_MAX_BUS; i++)
-               for (int j = 0; j < PCI_MAX_DEV; j++)
-                       for (int k = 0; k < PCI_MAX_FUNC; k++) {
-                               uint32_t address;
-                               uint32_t lbus = i;
-                               uint32_t ldev = j;
-                               uint32_t lfunc = k;
-                               uint32_t lreg = 0; 
-                               uint32_t result  = 0;
-       
-                               uint16_t dev_id = pci_dev_map[i][j][k].dev_id;
-                               uint16_t ven_id = pci_dev_map[i][j][k].ven_id;
-
-                               // Vender DNE
-                               if (ven_id == INVALID_VENDOR_ID) 
-                                       continue;
-
-                               // Ignore non RealTek 8168 Devices
-                               if (ven_id != NE2K_VENDOR_ID || dev_id != NE2K_DEV_ID)
-                                       continue;
-                               cprintf(" found on BUS %x DEV %x\n", i, j);
-
-                               // Find the IRQ
-                               ne2k_irq = pci_irq_map[i][j][k];
-                               ne2k_debug("-->IRQ: %u\n", ne2k_irq);
-
-                               // Loop over the BARs
-                               for (int k = 0; k <= 5; k++) {
-                                       lreg = 4 + k;
-                                       address = MK_CONFIG_ADDR(lbus, ldev, lfunc, lreg << 2); 
-                               outl(PCI_CONFIG_ADDR, address);
-                               result = inl(PCI_CONFIG_DATA);
-                                       
-                                       if (result == 0) // (0 denotes no valid data)
-                                               continue;
-
-                                       // Read the bottom bit of the BAR. 
-                                       if (result & PCI_BAR_IO_MASK) {
-                                               result = result & PCI_IO_MASK;
-                                               ne2k_debug("-->BAR%u: %s --> %x\n", k, "IO", result);
-                                       } else {
-                                               result = result & PCI_MEM_MASK;
-                                               ne2k_debug("-->BAR%u: %s --> %x\n", k, "MEM", result);
-                                       }
-                       
-                                       // TODO Switch to memory mapped instead of IO?
-                                       if (k == 0) // BAR0 denotes the IO Addr for the device
-                                               ne2k_io_base_addr = result;                                             
-                               }
-                               
-               return 0;
-       }
-       cprintf(" not found. No device configured.\n");
-       
-       return -1;
-}
-
-void ne2k_configure_nic() {
-       
-       ne2k_debug("-->Configuring Device.\n");
-       
-       // Reset. Yes reading from this addr resets it
-       inb(ne2k_io_base_addr + NE2K_RESET_R_ADDR);
-
-       // Configure
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR,  0x22);
-       outb(ne2k_io_base_addr + NE2K_PG0_W_PSTRT,  NE2K_FIRST_RECV_PAGE);
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_BNRY, NE2K_FIRST_RECV_PAGE + 1);
-
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, (0x22 & 0x3F) | 0x40);
-       outb(ne2k_io_base_addr + NE2K_PG1_RW_CURR, NE2K_FIRST_RECV_PAGE + 2);
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, 0x22);
-       outb(ne2k_io_base_addr + NE2K_PG0_W_PSTP, NE2K_LAST_RECV_PAGE);
-       outb(ne2k_io_base_addr + NE2K_PG0_W_DCR, 0x94); 
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR,  0x22);
-       
-       outb(ne2k_io_base_addr + NE2K_PG0_W_RCR,  0xDF);
-       outb(ne2k_io_base_addr + NE2K_PG0_W_TCR,  0xE0);
-       
-
-       //uint8_t isr = inb(ne2k_io_base_addr + NE2K_PG0_RW_ISR);
-       //cprintf("isr: %x\n", isr);
-
-       
-       return;
-}
-
-void ne2k_setup_interrupts() {
-       
-       extern handler_t interrupt_handlers[];
-       
-       ne2k_debug("-->Setting interrupts.\n");
-       
-       // Kernel based interrupt stuff
-       register_interrupt_handler(interrupt_handlers, KERNEL_IRQ_OFFSET + ne2k_irq, ne2k_interrupt_handler, (void *)0);
-       
-       ioapic_route_irq(ne2k_irq, 6);  
-       
-       SET_PAGE_0();
-
-        outb(ne2k_io_base_addr + NE2K_PG0_W_IMR,  0xBF);
-
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_ISR, 0xFF);
-       return;
-}
-
-void ne2k_mem_alloc() {
-       
-       num_pages = ROUNDUP(NE2K_NUM_PAGES * NE2K_PAGE_SIZE, PGSIZE) / PGSIZE;
-       base_page = get_cont_pages(LOG2_UP(num_pages), 0);      
-}
-
-void ne2k_read_mac() {
-
-       uint8_t cr = inb(ne2k_io_base_addr + NE2K_PG0_RW_CR);
-       
-       // Set correct bits
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, 0xA);
-       outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR0, 0x0);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR1, 0x0);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR0, 0x6);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR1, 0x0);
-
-
-       for (int i = 0; i < 6; i++)
-               device_mac[i] = inb(ne2k_io_base_addr + 0x10) & inb(ne2k_io_base_addr + 0x10);
-
-       // Set page 1
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, (cr & 0x3F) | 0x40);
-
-       for (int i = 0; i < 6; i++) 
-           outb(ne2k_io_base_addr + NE2K_PG1_RW_PAR + i, device_mac[i]);
-
-       
-       ne2k_debug("-->DEVICE MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & device_mac[0], 0xFF & device_mac[1],        
-                                                                   0xFF & device_mac[2], 0xFF & device_mac[3], 
-                                                                0xFF & device_mac[4], 0xFF & device_mac[5]);
-       // Restore old setting.
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, cr);
-       return;
-}
-
-void ne2k_test_interrupts() {
-       
-       cprintf("Generating Interrupt...\n");
-       outb(ne2k_io_base_addr + 0x0A, 0x00);
-       outb(ne2k_io_base_addr + 0x0B, 0x00);
-       outb(ne2k_io_base_addr + 0x00, 0x0A);
-       udelay(10000000);
-
-       cprintf("Generating Interrupt again...\n");
-       outb(ne2k_io_base_addr + 0x0A, 0x00);
-       outb(ne2k_io_base_addr + 0x0B, 0x00);
-       outb(ne2k_io_base_addr + 0x00, 0x0A);
-       udelay(10000000);
-       
-}
-
-// We need to evaluate this routine in terms of concurrency.
-// We also need to figure out whats up with different core interrupts
-void ne2k_interrupt_handler(trapframe_t *tf, void* data) {
-       
-       ne2k_interrupt_debug("\nNE2K interrupt on core %u!\n", lapic_get_id());
-
-       SET_PAGE_0();
-
-       uint8_t isr= inb(ne2k_io_base_addr + NE2K_PG0_RW_ISR);
-       ne2k_interrupt_debug("isr: %x\n", isr);
-       
-       while (isr != 0x0) {
-
-               // TODO: Other interrupt cases.
-
-               if (isr & 0x1) {
-                       ne2k_interrupt_debug("-->Packet received.\n");
-                       ne2k_handle_rx_packet();
-               }
-               
-               SET_PAGE_0();
-
-               // Clear interrupts
-               isr = inb(ne2k_io_base_addr + NE2K_PG0_RW_ISR);
-               outb(ne2k_io_base_addr + NE2K_PG0_RW_ISR, isr);
-
-       }
-
-       ne2k_handle_rx_packet();
-       
-       return;                         
-}
-
-// @TODO: Is this broken? Didn't change it after kmalloc changed
-void ne2k_handle_rx_packet() {
-       
-       SET_PAGE_0();
-
-        uint8_t bound = inb(ne2k_io_base_addr + NE2K_PG0_RW_BNRY);
-
-        uint8_t cr = inb(ne2k_io_base_addr + NE2K_PG0_RW_CR);
-        
-       // Set page 1
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, (cr & 0x3F) | 0x40);
-
-       uint8_t next = inb(ne2k_io_base_addr + NE2K_PG1_RW_CURR);
-
-       // Restore old setting.
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, cr);
-
-        uint8_t start = NE2K_FIRST_RECV_PAGE;
-        uint8_t stop = NE2K_LAST_RECV_PAGE;
-
-       // Broken mult packets?
-       if (((bound + 1) == next) || (((bound + 1) == stop) && (start == next))) {
-               ne2k_debug("NO PACKET TO PROCESS\n");
-               return;
-       }
-
-       uint32_t kmalloc_size;
-
-       if (MAX_FRAME_SIZE % NE2K_PAGE_SIZE) {
-               kmalloc_size = ((MAX_FRAME_SIZE / NE2K_PAGE_SIZE) + 1) * NE2K_PAGE_SIZE;
-       } else {
-               kmalloc_size = MAX_FRAME_SIZE;
-       }
-       
-       char *rx_buffer = kmalloc(kmalloc_size, 0);
-       
-       if (rx_buffer == NULL) panic ("Can't allocate page for incoming packet.");
-
-        uint8_t curr = bound + 1;
-
-       uint8_t header[4];
-       uint16_t packet_len = 0xFFFF;
-       uint16_t page_count = 0;
-       for (int i = 0, n = 0; i < (MAX_FRAME_SIZE / NE2K_PAGE_SIZE); i++) {
-               if (curr == stop)
-                       curr = start;                   
-
-               outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR0, 0x0);
-               outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR1, curr);
-
-
-               // Fix this. Its hard coded to 256
-               outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR0, 0);
-               outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR1, 0x1);
-       
-               outb(ne2k_io_base_addr + NE2K_PG0_RW_CR, 0x0A);
-
-               for (int j = 0; j < NE2K_PAGE_SIZE; j++) {
-                       uint8_t val = inb(ne2k_io_base_addr + 0x10);
-                       if ((i == 0) && (j < 4)) {
-                               header[j] = val;
-                       } else { 
-                               rx_buffer[n++] = val;
-                       }
-               }
-
-               if (i == 0) {
-                       packet_len = ((uint16_t)header[3] << 8) | (uint16_t)header[2];
-                       if (packet_len % NE2K_PAGE_SIZE) {
-                               page_count = (packet_len / NE2K_PAGE_SIZE) + 1;
-                       } else {
-                               page_count = (packet_len / NE2K_PAGE_SIZE);
-                       }
-               }
-               
-               if ((i + 1) == page_count)
-                       break;
-
-               curr++;
-       
-       }
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_BNRY, curr);
-
-       if (packet_len == 0) {
-               ne2k_debug("Triggered on an empty packet.\n");
-               return;
-       }
-
-       spin_lock(&packet_buffer_lock);
-
-       if (packet_buffer_count >= PACKET_BUFFER_SIZE) {
-               printk("WARNING: DROPPING PACKET!\n");
-               spin_unlock(&packet_buffer_lock);
-               kfree(rx_buffer);
-               return;
-       }
-
-       packet_buffer[packet_buffer_tail] = rx_buffer;
-       packet_buffer_sizes[packet_buffer_tail] = packet_len;
-
-       packet_buffer_tail = (packet_buffer_tail + 1) % PACKET_BUFFER_SIZE;
-       packet_buffer_count = packet_buffer_count + 1;
-
-       spin_unlock(&packet_buffer_lock);
-       
-       return;
-}
-
-// copied with love (and modification) from tcp/ip illistrated vl 2 1995 pg 236
-// bsd licenced
-uint16_t cksum(char *CT(len) ip, int len) {
-       
-       uint32_t sum = 0;
-       // Next two lines for ivy. Grr.
-       char *curr_ip = ip;
-       int curr_len = len;
-
-       while(curr_len > 1) {
-               sum += *((uint16_t*) curr_ip);
-               curr_ip = curr_ip + 2;
-               
-               if(sum & 0x80000000)    /* if high order bit set, fold */
-                       sum = (sum & 0xFFFF) + (sum >> 16);
-                       curr_len -= 2;
-               }
-
-               if(curr_len)             /* take care of left over byte */
-                       sum += *curr_ip;
-                 
-               while(sum>>16)
-                       sum = (sum & 0xFFFF) + (sum >> 16);
-
-               return ~sum;
-}
-
-
-// Main routine to send a frame. May be completely broken.
-int ne2k_send_frame(const char *data, size_t len) {
-
-       if (data == NULL)
-               return -1;
-       if (len == 0)
-               return 0;
-
-
-       if (len > MAX_FRAME_SIZE) {
-               ne2k_frame_debug("-->Frame Too Large!\n");
-               return -1;
-       }
-
-        outb(ne2k_io_base_addr + NE2K_PG0_W_IMR,  0x00);
-
-
-       // The TPSR takes a page #
-       // The RSAR takes a byte offset, but since a page is 256 bits
-       // and we are writing on page boundries, the low bits are 0, and
-       // the high bits are a page #
-       outb(ne2k_io_base_addr + NE2K_PG0_W_TPSR, NE2K_FIRST_SEND_PAGE);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR0, 0x0);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RSAR1, NE2K_FIRST_SEND_PAGE);
-
-       
-       outb(ne2k_io_base_addr + NE2K_PG0_W_TBCR0, len & 0xFF);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_TBCR1, len >> 8);
-
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR0, len & 0xFF);
-        outb(ne2k_io_base_addr + NE2K_PG0_W_RBCR1, len >> 8);
-
-       
-       outb(ne2k_io_base_addr + NE2K_PG0_RW_CR,  0x12);
-       
-
-       for (int i = 0; i<len; i = i + 1) {
-               outb(ne2k_io_base_addr + 0x10, *(uint8_t*)(data + i));
-               //printk("sent: %x\n", *(uint8_t*)(data + i));
-       }
-       
-       while(( inb(ne2k_io_base_addr + NE2K_PG0_RW_ISR) & 0x40) == 0);
-
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_ISR,  0x40);
-
-        outb(ne2k_io_base_addr + NE2K_PG0_W_IMR,  0xBF);
-
-        outb(ne2k_io_base_addr + NE2K_PG0_RW_CR,  0x1E);
-       
-       
-       return len;
-}
-
-// This function is a complete hack for syscalls until we get a stack.
-// the day I delete this monstrosity of code I will be a happy man --Paul
-char *CT(PACKET_HEADER_SIZE + len) ne2k_packet_wrap(const char* data, size_t len) {
-       
-       #define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
-                           (((uint16_t)(A) & 0x00ff) << 8))
-       #define htonl(A) ((((uint32_t)(A) & 0xff000000) >> 24) | \
-                           (((uint32_t)(A) & 0x00ff0000) >> 8)  | \
-                           (((uint32_t)(A) & 0x0000ff00) << 8)  | \
-                           (((uint32_t)(A) & 0x000000ff) << 24))
-       #define ntohs  htons
-       #define ntohl  htohl
-       if ((len == 0) || (data == NULL))
-               return NULL;
-       // Hard coded to paul's laptop's mac
-       //Format for Makelocal file: -DUSER_MAC_ADDRESS="{0x00, 0x23, 0x32, 0xd5, 0xae, 0x82}"
-       char dest_mac_address[6] = USER_MAC_ADDRESS;
-       
-       
-       uint32_t source_ip = 0xC0A8000A; // 192.168.0.10
-       uint32_t dest_ip   = 0xC0A8000B; // 192.168.0.11
-  
-       
-       if (len > MAX_PACKET_DATA) {
-               ne2k_frame_debug("Bad packet size for packet wrapping");
-               return NULL;
-       }
-       
-       struct eth_packet* wrap_buffer = kmalloc(MAX_PACKET_SIZE, 0);
-       
-       if (wrap_buffer == NULL) {
-               ne2k_frame_debug("Can't allocate page for packet wrapping");
-               return NULL;
-       }
-       
-       struct ETH_Header *eth_header = &wrap_buffer->eth_head.eth_head;
-       struct IP_Header *ip_header = &wrap_buffer->eth_head.ip_head;
-       struct UDP_Header *udp_header = &wrap_buffer->eth_head.udp_head;
-       
-       // Setup eth data
-       for (int i = 0; i < 6; i++) 
-               eth_header->dest_mac[i] = dest_mac_address[i];
-               
-       for (int i = 0; i < 6; i++) 
-               eth_header->source_mac[i] = device_mac[i];
-               
-       eth_header->eth_type = htons(0x0800);
-       
-       // Setup IP data
-       ip_header->ip_opts0 = htonl((4<<28) | (5 << 24) | (len + 28));
-       ip_header->ip_opts1 = 0;
-       //ip_header->ip_opts2 = 0x4f2f110a;
-        ip_header->ip_opts2 = 0x0000110a;
-
-       ip_header->source_ip = htonl(source_ip);
-       ip_header->dest_ip = htonl(dest_ip);
-       
-
-       ip_header->ip_opts2 =   ip_header->ip_opts2 | 
-                               ((uint32_t)cksum((char*)ip_header, sizeof(struct IP_Header)) << 16);
-       // Setup UDP Data
-       udp_header->source_port = htons(44443);
-       udp_header->dest_port = htons(44444);
-       udp_header->length = htons(8 + len);
-       udp_header->checksum = 0;
-       
-       memcpy (&wrap_buffer->data[0], data, len);
-       
-       return (char *CT(PACKET_HEADER_SIZE + len))wrap_buffer; 
-}
diff --git a/kern/arch/i386/ne2k.h b/kern/arch/i386/ne2k.h
deleted file mode 100644 (file)
index 54f94bb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef ROS_INC_NE2K_H
-#define ROS_INC_NE2K_H
-
-#include <ros/common.h>
-#include <trap.h>
-#include <pmap.h>
-#include <arch/nic_common.h>
-
-#define ne2k_debug(...)  //cprintf(__VA_ARGS__)  
-#define ne2k_interrupt_debug(...) //cprintf(__VA_ARGS__)  
-#define ne2k_frame_debug(...) //cprintf(__VA_ARGS__)  
-
-#define NIC_IRQ_CPU                    5
-
-// Macro for formatting PCI Configuration Address queries
-#define MK_CONFIG_ADDR(BUS, DEV, FUNC, REG) (unsigned long)( (BUS << 16) | (DEV << 11) | \
-                                                             (FUNC << 8) | REG  | \
-                                                             ((uint32_t)0x80000000))
-#define NE2K_VENDOR_ID 0x10EC
-#define NE2K_DEV_ID 0x8029
-
-void ne2k_init();
-int ne2k_scan_pci();
-void ne2k_configure_nic();
-void ne2k_setup_interrupts();
-void ne2k_interrupt_handler(trapframe_t *tf, void* data);
-void ne2k_mem_alloc();
-void ne2k_read_mac();
-void ne2k_test_interrupts();
-void ne2k_handle_rx_packet();
-int ne2k_send_frame(const char *CT(len) data, size_t len);
-char *CT(PACKET_HEADER_SIZE + len) ne2k_packet_wrap(const char *CT(len) data, size_t len);
-
-#endif /* !ROS_INC_NE2K_H */
diff --git a/kern/arch/i386/nic_common.c b/kern/arch/i386/nic_common.c
deleted file mode 100644 (file)
index 6fa5433..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/** @file
- * @brief Common Nic Variables
- *
- * See Info below 
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/nic_common.h>
-
-uint8_t eth_up = 0; 
-
-// Hacky stuff for syscall hack. Go away.
-uint32_t packet_buffer_count = 0;
-char* packet_buffer[PACKET_BUFFER_SIZE];
-uint32_t packet_buffer_sizes[PACKET_BUFFER_SIZE];
-uint32_t packet_buffer_head = 0;
-uint32_t packet_buffer_tail = 0;
-spinlock_t packet_buffer_lock = SPINLOCK_INITIALIZER;
-
-
-char* (*packet_wrap)(const char *CT(len) data, size_t len);
-int (*send_frame)(const char *CT(len) data, size_t len);
diff --git a/kern/arch/i386/nic_common.h b/kern/arch/i386/nic_common.h
deleted file mode 100644 (file)
index 79e7cdd..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef ROS_INC_NIC_COMMON_H
-#define ROS_INC_NIC_COMMON_H
-
-#include <ros/common.h>
-#include <trap.h>
-#include <pmap.h>
-
-
-// Basic packet sizing
-// TODO handle jumbo packets
-#define ETHERNET_ENCAP_SIZE    18
-#define MTU                    1500    
-#define MAX_FRAME_SIZE         ETHERNET_ENCAP_SIZE + MTU       
-       
-// This is to make it simply compile when not in __NETWORK__ mode.
-#ifndef USER_MAC_ADDRESS
-#define USER_MAC_ADDRESS {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
-#endif
-
-// v----- Evil line ------v
-// Hacky stuff for syscalls go away.
-
-#define PACKET_BUFFER_SIZE 1024
-
-struct ETH_Header
-{
-       char dest_mac[6];
-       char source_mac[6];
-       uint16_t eth_type;
-};
-
-
-struct IP_Header
-{
-       uint32_t ip_opts0;
-       uint32_t ip_opts1;
-       uint32_t ip_opts2;
-       uint32_t source_ip;
-       uint32_t dest_ip;
-};
-
-struct UDP_Header
-{
-       uint16_t source_port;
-       uint16_t dest_port;
-       uint16_t length;
-       uint16_t checksum;
-};     
-
-#define MINIMUM_PACKET_SIZE 14 // kinda evil. probably evil.
-#define MAX_PACKET_SIZE                MTU
-
-#define PACKET_HEADER_SIZE  sizeof(struct packet_header) //IP UDP ETH
-#define MAX_PACKET_DATA                MAX_FRAME_SIZE - PACKET_HEADER_SIZE
-// This number needs verification! Also, this is a huge hack, as the driver shouldnt care about UDP/IP etc.
-
-struct packet_header {
-       struct ETH_Header eth_head;
-       struct IP_Header ip_head;
-       struct UDP_Header udp_head;
-} __attribute__((packed));
-
-struct eth_packet {
-       struct packet_header eth_head;
-       char data[MTU-PACKET_HEADER_SIZE];
-} __attribute__((packed));
-
-
-// ^----- Evil line ------^
-
-#endif /* !ROS_INC_NIC_COMMON_H */
diff --git a/kern/arch/i386/page_alloc.c b/kern/arch/i386/page_alloc.c
deleted file mode 100644 (file)
index 0ab6c1c..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Copyright (c) 2009 The Regents of the University  of California. 
- * See the COPYRIGHT files at the top of this source tree for full 
- * license information.
- * 
- * Kevin Klues <klueska@cs.berkeley.edu>    
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#define SINIT(x) x
-#endif
-
-#include <sys/queue.h>
-#include <page_alloc.h>
-#include <pmap.h>
-#include <kmalloc.h>
-
-spinlock_t colored_page_free_list_lock;
-
-page_list_t LCKD(&colored_page_free_list_lock) * CT(llc_cache->num_colors) RO
-  colored_page_free_list = NULL;
-
-static void page_alloc_bootstrap() {
-       // Allocate space for the array required to manage the free lists
-       size_t list_size = llc_cache->num_colors*sizeof(page_list_t);
-       page_list_t LCKD(&colored_page_free_list_lock)*tmp =
-           (page_list_t*)boot_alloc(list_size,PGSIZE);
-       colored_page_free_list = SINIT(tmp);
-}
-
-/*
- * Initialize the memory free lists.
- * After this point, ONLY use the functions below
- * to allocate and deallocate physical memory via the 
- * page_free_lists. 
- */
-void page_alloc_init()
-{
-       // First Bootstrap the page alloc process
-       static bool RO bootstrapped = FALSE;
-       if(!bootstrapped) {
-               bootstrapped = SINIT(TRUE);
-               page_alloc_bootstrap();
-       }
-
-       // Then, initialize the array required to manage the colored page free list
-       for(int i=0; i<llc_cache->num_colors; i++) {
-               LIST_INIT(&(colored_page_free_list[i]));
-       }
-
-       //  Then, mark the pages already in use by the kernel. 
-       //  1) Mark page 0 as in use.
-       //     This way we preserve the real-mode IDT and BIOS structures
-       //     in case we ever need them.  (Currently we don't, but...)
-       //  2) Mark the rest of base memory as free.
-       //  3) Then comes the IO hole [IOPHYSMEM, EXTPHYSMEM).
-       //     Mark it as in use so that it can never be allocated.      
-       //  4) Then extended memory [EXTPHYSMEM, ...).
-       //     Some of it is in use, some is free.
-       int i;
-       extern char (SNT RO end)[];
-       physaddr_t physaddr_after_kernel = PADDR(PTRROUNDUP(boot_freemem, PGSIZE));
-
-       pages[0].page_ref = 1;
-       // alloc the second page, since we will need it later to init the other cores
-       // probably need to be smarter about what page we use (make this dynamic) TODO
-       pages[1].page_ref = 1;
-       for (i = 2; i < LA2PPN(IOPHYSMEM); i++) {
-               pages[i].page_ref = 0;
-               LIST_INSERT_HEAD(
-                  &(colored_page_free_list[get_page_color(page2ppn(&pages[i]), 
-                                                              llc_cache)]),
-                  &pages[i],
-                  page_link
-               );
-       }
-       for (i = LA2PPN(IOPHYSMEM); i < LA2PPN(EXTPHYSMEM); i++) {
-               pages[i].page_ref = 1;
-       }
-       for (i = LA2PPN(EXTPHYSMEM); i < LA2PPN(physaddr_after_kernel); i++) {
-               pages[i].page_ref = 1;
-       }
-       for (i = LA2PPN(physaddr_after_kernel); i < LA2PPN(maxaddrpa); i++) {
-               pages[i].page_ref = 0;
-               LIST_INSERT_HEAD(
-                  &(colored_page_free_list[get_page_color(page2ppn(&pages[i]), 
-                                                              llc_cache)]),
-                  &pages[i],
-                  page_link
-               );
-       }
-       // this block out all memory above maxaddrpa.  will need another mechanism
-       // to allocate and map these into the kernel address space
-       for (i = LA2PPN(maxaddrpa); i < npages; i++) {
-               pages[i].page_ref = 1;
-       }
-       printk("Page alloc init successful\n");
-}
-
diff --git a/kern/arch/i386/pci.c b/kern/arch/i386/pci.c
deleted file mode 100644 (file)
index 7276444..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-// Not currently sharc complient. 
-
-/** @file
- * @brief Basic PCI Driver.
- *
- * This file is responsible for the scanning the PCI bus and recording
- * all the information needed for ouR OS to function. 
- *
- * No PCI Specifications (or even consulted) were harmed in the making of this file.
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- * @todo Build an entire useful PCI subsystem, not this hack with a few data structures laying around
- *
- */
-
-#include <arch/x86.h>
-#include <stdio.h>
-#include <string.h>
-#include <arch/pci.h>
-
-// A value of INVALID_IRQ (something 256 or larger) means invalid
-uint16_t pci_irq_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-
-pci_dev_entry_t pci_dev_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-
-// NOTE: If we care about ALL devices associated with an IRQ, not just the last device, this needs to be some sort of linked structure
-pci_irq_entry_t irq_pci_map[NUM_IRQS];
-
-/**
- * @brief Perform the actual PCI bus parsing
- *
- * See file description.
- * 
- * This function must be called during bootup, before ioapic_init().
- */
-void pci_init() {
-       
-       // Initalize the irq->pci table (pci->irq below)
-       // Setting all 1's forces an invalid entry, as bus = INVALID_BUS = 0xFFFF.
-       memset(irq_pci_map, 0xFF, sizeof(irq_pci_map));
-       
-       uint32_t address;
-       uint32_t bus = 0;
-       uint32_t dev = 0;
-       uint32_t func = 0;
-       uint32_t reg = 0; 
-       uint32_t result  = 0;
-       pci_debug("Scanning PCI Bus....\n");
-
-       for (int i = 0; i < PCI_MAX_BUS; i++)
-               for (int j = 0; j < PCI_MAX_DEV; j++)
-                       for (int k = 0; k < PCI_MAX_FUNC; k++) {
-
-                               bus = i;
-                               dev = j;
-                               func = k;
-                               reg = 0; // PCI REGISTER 0
-                               
-                               // Set the fields invalid.
-                               pci_irq_map[i][j][k] = INVALID_IRQ;
-                               pci_dev_map[i][j][k].dev_id = INVALID_VENDOR_ID;
-
-                               address = MK_CONFIG_ADDR(bus, dev, func, reg); 
-
-                               // Probe current bus/dev
-                               outl(PCI_CONFIG_ADDR, address);
-                               result = inl(PCI_CONFIG_DATA);
-       
-                               uint16_t dev_id = result >> PCI_DEVICE_OFFSET;
-                               uint16_t ven_id = result & PCI_VENDOR_MASK;
-
-                               // Vender DNE
-                               if (ven_id == INVALID_VENDOR_ID) 
-                                       continue;
-
-                               pci_debug("Found device on BUS %x DEV %x FUNC %x: DEV_ID: %x VEN_ID: %x\n", i, j, k, dev_id, ven_id);
-
-                               // Find the IRQ
-                               address = MK_CONFIG_ADDR(bus, dev, func, PCI_IRQ_REG);
-                               outl(PCI_CONFIG_ADDR, address);
-                               uint16_t irq = inl(PCI_CONFIG_DATA) & PCI_IRQ_MASK;
-                               pci_debug("-->IRQ: %u\n", irq);
-                               
-                               // Find the line (a-d)
-                               address = MK_CONFIG_ADDR(bus, dev, func, PCI_IRQ_REG);
-                               outl(PCI_CONFIG_ADDR, address);
-                               uint8_t line = (inl(PCI_CONFIG_DATA) & PCI_LINE_MASK) >> PCI_LINE_SHFT;
-                               
-                               // If intn == 0, no interrupts used.
-                               if (line != INVALID_LINE) {
-                                       
-                                       // Now shift A to 0, B to 1, etc.
-                                       // This starts off as A 1, B 2 (grr)
-                                       line--;
-                               
-                                       pci_irq_map[i][j][k] = irq;
-                                       pci_dev_map[i][j][k].dev_id = dev_id;
-                                       pci_dev_map[i][j][k].ven_id = ven_id;
-                                       irq_pci_map[irq].bus = i;
-                                       irq_pci_map[irq].dev = j;
-                                       irq_pci_map[irq].func = k;
-                                       irq_pci_map[irq].line = line;
-                                       
-                                       // @todo We may want to perform some check to make sure we arent overwriting some current irq entry and maintain that info
-                               }
-                               
-
-                               /* Loop over the BARs
-                                * Right now we don't do anything useful with this data. 
-                                * This is legacy code in which I pulled data from the BARS during NIC development
-                                * At some point we will have to use this, so the code is still here.
-                                */
-                               
-                               // Note: These magic numbers are from the PCI spec (according to OSDev).
-                               #ifdef CHECK_BARS
-                               for (int k = 0; k <= 5; k++) {
-                                       reg = 4 + k;
-                                       address = MK_CONFIG_ADDR(bus, dev, func, reg << 2);     
-                               outl(PCI_CONFIG_ADDR, address);
-                               result = inl(PCI_CONFIG_DATA);
-                                       
-                                       if (result == 0) // (0 denotes no valid data)
-                                               continue;
-
-                                       // Read the bottom bit of the BAR. 
-                                       if (result & PCI_BAR_IO_MASK) {
-                                               result = result & PCI_IO_MASK;
-                                               pci_debug("-->BAR%u: %s --> %x\n", k, "IO", result);
-                                       } else {
-                                               result = result & PCI_MEM_MASK;
-                                               pci_debug("-->BAR%u: %s --> %x\n", k, "MEM", result);
-                                       }                                       
-                               }
-                               #endif
-                               
-                               pci_debug("\n");
-                       }               
-}
diff --git a/kern/arch/i386/pci.h b/kern/arch/i386/pci.h
deleted file mode 100644 (file)
index ce35923..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifndef ROS_INC_PCI_H
-#define ROS_INC_PCI_H
-
-#define pci_debug(...) // printk(__VA_ARGS__)  
-
-// Macro for creating the address fed to the PCI config register 
-// Several generations away from OSDev inline code.
-#define MK_CONFIG_ADDR(BUS, DEV, FUNC, REG) (unsigned long)( (BUS << 16) | (DEV << 11) | \
-                                                             (FUNC << 8) | REG  | \
-                                                             ((uint32_t)0x80000000))
-
-// General PCI Magic numbers yanked from OSDev / BSD. Yay magic!
-#define PCI_CONFIG_ADDR     0xCF8
-#define PCI_CONFIG_DATA     0xCFC
-#define INVALID_VENDOR_ID   0xFFFF
-
-#define INVALID_IRQ                    0xFFFF
-#define INVALID_BUS                    0xFFFF
-#define INVALID_LINE           0x0000
-
-#define PCI_IO_MASK         0xFFF8
-#define PCI_MEM_MASK        0xFFFFFFF0
-#define PCI_IRQ_MASK           0xFF
-#define PCI_LINE_MASK          0xFF00
-#define PCI_LINE_SHFT          0x8
-#define PCI_VENDOR_MASK                0xFFFF
-#define PCI_DEVICE_OFFSET      0x10
-#define PCI_IRQ_REG                    0x3c
-
-#define PCI_MAX_BUS                    256
-#define PCI_MAX_DEV                    32
-#define PCI_MAX_FUNC           8
-#define PCI_BAR_IO_MASK                0x1
-#define NUM_IRQS                       256
-
-// Offset used for indexing IRQs. Why isnt this defined elsewhere?
-#define KERNEL_IRQ_OFFSET      32
-
-// Run the PCI Code to loop over the PCI BARs. For now we don't use the BARs, dont check em.
-#define CHECK_BARS                     0
-
-typedef struct PCIIRQENTRY {
-       uint16_t bus; // Bus larger than 255 denotes invalid entry.
-                                 // This is why bus is 16 bits not 8.
-       uint8_t dev;
-       uint8_t func;
-       uint8_t line;
-} pci_irq_entry_t;
-
-typedef struct PCIDEVENTRY {
-       uint16_t dev_id; 
-       uint16_t ven_id;
-} pci_dev_entry_t;
-
-void pci_init();
-
-#endif /* !ROS_INC_PCI_H */
diff --git a/kern/arch/i386/pmap.c b/kern/arch/i386/pmap.c
deleted file mode 100644 (file)
index c221f3a..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-#ifdef __SHARC__
-#pragma nosharc
-#define SINIT(x) x
-#endif
-
-/* See COPYRIGHT for copyright information. */
-#include <arch/x86.h>
-#include <arch/arch.h>
-#include <arch/mmu.h>
-#include <arch/apic.h>
-
-#include <ros/error.h>
-#include <sys/queue.h>
-
-#include <atomic.h>
-#include <string.h>
-#include <assert.h>
-#include <pmap.h>
-#include <kclock.h>
-#include <env.h>
-#include <stdio.h>
-#include <kmalloc.h>
-#include <page_alloc.h>
-
-// These variables are set in i386_vm_init()
-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
-page_t *RO pages = NULL;          // Virtual address of physical page array
-
-// Global descriptor table.
-//
-// The kernel and user segments are identical (except for the DPL).
-// To load the SS register, the CPL must equal the DPL.  Thus,
-// we must duplicate the segments for the user and the kernel.
-//
-segdesc_t gdt[] =
-{
-       // 0x0 - unused (always faults -- for trapping NULL far pointers)
-       SEG_NULL,
-
-       // 0x8 - kernel code segment
-       [GD_KT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 0),
-
-       // 0x10 - kernel data segment
-       [GD_KD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 0),
-
-       // 0x18 - user code segment
-       [GD_UT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 3),
-
-       // 0x20 - user data segment
-       [GD_UD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 3),
-
-       // 0x28 - tss, initialized in idt_init()
-       [GD_TSS >> 3] = SEG_NULL,
-
-       // 0x30 - LDT, set per-process in proc_startcore()
-       [GD_LDT >> 3] = SEG_NULL
-};
-
-pseudodesc_t gdt_pd = {
-       sizeof(gdt) - 1, (unsigned long) gdt
-};
-
-static int
-nvram_read(int r)
-{
-       return mc146818_read(r) | (mc146818_read(r + 1) << 8);
-}
-
-bool enable_pse(void)
-{
-       uint32_t edx, cr4;
-       cpuid(1, 0, 0, 0, &edx);
-       if (edx & CPUID_PSE_SUPPORT) {
-               cr4 = rcr4();
-               cr4 |= CR4_PSE;
-               lcr4(cr4);
-               return 1;
-       } else
-               return 0;
-}
-
-// --------------------------------------------------------------
-// Set up initial memory mappings and turn on MMU.
-// --------------------------------------------------------------
-
-static void check_boot_pgdir(bool pse);
-
-//
-// Given pgdir, a pointer to a page directory,
-// walk the 2-level page table structure to find
-// the page table entry (PTE) for linear address la.
-// Return a pointer to this PTE.
-//
-// If the relevant page table doesn't exist in the page directory:
-//     - If create == 0, return 0.
-//     - Otherwise allocate a new page table, install it into pgdir,
-//       and return a pointer into it.
-//        (Questions: What data should the new page table contain?
-//       And what permissions should the new pgdir entry have?
-//       Note that we use the 486-only "WP" feature of %cr0, which
-//       affects the way supervisor-mode writes are checked.)
-//
-// This function abstracts away the 2-level nature of
-// the page directory by allocating new page tables
-// as needed.
-// 
-// boot_pgdir_walk may ONLY be used during initialization,
-// before the page_free_list has been set up.
-// It should panic on failure.  (Note that boot_alloc already panics
-// on failure.)
-//
-// Supports returning jumbo (4MB PSE) PTEs.  To create with a jumbo, pass in 2.
-// 
-// Maps non-PSE PDEs as U/W.  W so the kernel can, U so the user can read via
-// UVPT.  UVPT security comes from the UVPT mapping (U/R).  All other kernel pages
-// protected at the second layer
-static pte_t*
-boot_pgdir_walk(pde_t *COUNT(NPDENTRIES) pgdir, uintptr_t la, int create)
-{
-       pde_t* the_pde = &pgdir[PDX(la)];
-       void* new_table;
-
-       if (*the_pde & PTE_P) {
-               if (*the_pde & PTE_PS)
-                       return (pte_t*)the_pde;
-               return &((pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(*the_pde)))[PTX(la)];
-       }
-       if (!create)
-               return NULL;
-       if (create == 2) {
-               if (JPGOFF(la))
-                       panic("Attempting to find a Jumbo PTE at an unaligned VA!");
-               *the_pde = PTE_PS | PTE_P;
-               return (pte_t*)the_pde;
-       }
-       new_table = boot_alloc(PGSIZE, PGSIZE);
-       memset(new_table, 0, PGSIZE);
-       *the_pde = (pde_t)PADDR(new_table) | PTE_P | PTE_W | PTE_U | PTE_G;
-       return &((pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(*the_pde)))[PTX(la)];
-}
-
-//
-// Map [la, la+size) of linear address space to physical [pa, pa+size)
-// in the page table rooted at pgdir.  Size is a multiple of PGSIZE.
-// Use permission bits perm|PTE_P for the entries.
-//
-// This function may ONLY be used during initialization,
-// before the page_free_list has been set up.
-//
-// To map with Jumbos, set PTE_PS in perm
-static void
-boot_map_segment(pde_t *COUNT(NPDENTRIES) pgdir, uintptr_t la, size_t size, physaddr_t pa, int perm)
-{
-       uintptr_t i;
-       pte_t *pte;
-       // la can be page unaligned, but weird things will happen
-       // unless pa has the same offset.  pa always truncates any
-       // possible offset.  will warn.  size can be weird too. 
-       if (PGOFF(la)) {
-               warn("la not page aligned in boot_map_segment!");
-               size += PGOFF(la);
-       }
-       if (perm & PTE_PS) {
-               if (JPGOFF(la) || JPGOFF(pa))
-                       panic("Tried to map a Jumbo page at an unaligned address!");
-               // need to index with i instead of la + size, in case of wrap-around
-               for (i = 0; i < size; i += JPGSIZE, la += JPGSIZE, pa += JPGSIZE) {
-                       pte = boot_pgdir_walk(pgdir, la, 2);
-                       *pte = PTE_ADDR(pa) | PTE_P | perm;
-               }
-       } else {
-               for (i = 0; i < size; i += PGSIZE, la += PGSIZE, pa += PGSIZE) {
-                       pte = boot_pgdir_walk(pgdir, la, 1);
-                       if (*pte & PTE_PS)
-                               // if we start using the extra flag for PAT, which we aren't,
-                               // this will warn, since PTE_PS and PTE_PAT are the same....
-                               warn("Possibly attempting to map a regular page into a Jumbo PDE");
-                       *pte = PTE_ADDR(pa) | PTE_P | perm;
-               }
-       }
-}
-
-// could consider having an API to allow these to dynamically change
-// MTRRs are for physical, static ranges.  PAT are linear, more granular, and 
-// more dynamic
-void setup_default_mtrrs(barrier_t* smp_barrier)
-{
-       // disable interrupts
-       int8_t state = 0;
-       disable_irqsave(&state);
-       // barrier - if we're meant to do this for all cores, we'll be 
-       // passed a pointer to an initialized barrier
-       if (smp_barrier)
-               waiton_barrier(smp_barrier);
-       
-       // disable caching      cr0: set CD and clear NW
-       lcr0((rcr0() | CR0_CD) & ~CR0_NW);
-       // flush caches
-       cache_flush();
-       // flush tlb
-       tlb_flush_global();
-       // disable MTRRs, and sets default type to WB (06)
-       write_msr(IA32_MTRR_DEF_TYPE, 0x00000006);
-
-       // Now we can actually safely adjust the MTRRs
-       // MTRR for IO Holes (note these are 64 bit values we are writing)
-       // 0x000a0000 - 0x000c0000 : VGA - WC 0x01
-       write_msr(IA32_MTRR_PHYSBASE0, PTE_ADDR(VGAPHYSMEM) | 0x01);
-       // if we need to have a full 64bit val, use the UINT64 macro
-       write_msr(IA32_MTRR_PHYSMASK0, 0x0000000ffffe0800);
-       // 0x000c0000 - 0x00100000 : IO devices (and ROM BIOS) - UC 0x00
-       write_msr(IA32_MTRR_PHYSBASE1, PTE_ADDR(DEVPHYSMEM) | 0x00);
-       write_msr(IA32_MTRR_PHYSMASK1, 0x0000000ffffc0800);
-       // APIC/IOAPIC holes
-       /* Going to skip them, since we set their mode using PAT when we 
-        * map them in 
-        */
-       // make sure all other MTRR ranges are disabled (should be unnecessary)
-       write_msr(IA32_MTRR_PHYSMASK2, 0);
-       write_msr(IA32_MTRR_PHYSMASK3, 0);
-       write_msr(IA32_MTRR_PHYSMASK4, 0);
-       write_msr(IA32_MTRR_PHYSMASK5, 0);
-       write_msr(IA32_MTRR_PHYSMASK6, 0);
-       write_msr(IA32_MTRR_PHYSMASK7, 0);
-
-       // keeps default type to WB (06), turns MTRRs on, and turns off fixed ranges
-       write_msr(IA32_MTRR_DEF_TYPE, 0x00000806);
-       // reflush caches and TLB
-       cache_flush();
-       tlb_flush_global();
-       // turn on caching
-       lcr0(rcr0() & ~(CR0_CD | CR0_NW));
-       // barrier
-       if (smp_barrier)
-               waiton_barrier(smp_barrier);
-       // enable interrupts
-       enable_irqsave(&state);
-}
-
-
-// Set up a two-level page table:
-//    boot_pgdir is its linear (virtual) address of the root
-//    boot_cr3 is the physical adresss of the root
-// Then turn on paging.  Then effectively turn off segmentation.
-// (i.e., the segment base addrs are set to zero).
-// 
-// This function only sets up the kernel part of the address space
-// (ie. addresses >= UTOP).  The user part of the address space
-// will be setup later.
-//
-// From UTOP to ULIM, the user is allowed to read but not write.
-// Above ULIM the user cannot read (or write). 
-void
-vm_init(void)
-{
-       pde_t* pgdir;
-       uint32_t cr0, edx;
-       size_t n;
-       bool pse;
-
-       pse = enable_pse();
-       if (pse)
-               cprintf("PSE capability detected.\n");
-
-       // we paniced earlier if we don't support PGE.  turn it on now.
-       // it's used in boot_map_segment, which covers all of the mappings that are
-       // the same for all address spaces.  and also for the VPT mapping below.
-       lcr4(rcr4() | CR4_PGE);
-
-       // set up mtrr's for core0.  other cores will do the same later
-       setup_default_mtrrs(0);
-
-       /*
-        * PSE status: 
-        * - can walk and set up boot_map_segments with jumbos but can't
-        *   insert yet.  need to look at the page_dir and friends.
-        * - anything related to a single struct Page still can't handle 
-        *   jumbos.  will need to think about and adjust Page functions
-        * - do we want to store info like this in the struct Page?  or just check
-        *   by walking the PTE
-        * - when we alloc a page, and we want it to be 4MB, we'll need
-        *   to have contiguous memory, etc
-        * - there's a difference between having 4MB page table entries
-        *   and having 4MB Page tracking structs.  changing the latter will
-        *   break a lot of things
-        * - showmapping and friends work on a 4KB granularity, but map to the
-        *   correct entries
-        * - need to not insert / boot_map a single page into an area that is 
-        *   already holding a jumbo page.  will need to break the jumbo up so that
-        *   we can then insert the lone page.  currently warns.
-        * - some inherent issues with the pgdir_walks returning a PTE, and we
-        *   don't know whether it is a jumbo (PDE) or a regular PTE.
-        */
-
-       //////////////////////////////////////////////////////////////////////
-       // create initial page directory.
-       pgdir = boot_alloc(PGSIZE, PGSIZE);
-       memset(pgdir, 0, PGSIZE);
-       boot_pgdir = pgdir;
-       boot_cr3 = PADDR(pgdir);
-       // helpful if you want to manually walk with kvm / bochs
-       //printk("pgdir va = %08p, pgdir pa = %08p\n\n", pgdir, PADDR(pgdir));
-
-       //////////////////////////////////////////////////////////////////////
-       // Recursively insert PD in itself as a page table, to form
-       // a virtual page table at virtual address VPT.
-       // (For now, you don't have understand the greater purpose of the
-       // following two lines.  Unless you are eagle-eyed, in which case you
-       // should already know.)
-
-       // Permissions: kernel RW, user NONE, Global Page
-       pgdir[PDX(VPT)] = PADDR(pgdir) | PTE_W | PTE_P | PTE_G;
-
-       // same for UVPT
-       // Permissions: kernel R, user R, Global Page
-       pgdir[PDX(UVPT)] = PADDR(pgdir) | PTE_U | PTE_P | PTE_G;
-
-       //////////////////////////////////////////////////////////////////////
-       // Map the kernel stack (symbol name "bootstack").  The complete VA
-       // range of the stack, [KSTACKTOP-PTSIZE, KSTACKTOP), breaks into two
-       // pieces:
-       //     * [KSTACKTOP-KSTKSIZE, KSTACKTOP) -- backed by physical memory
-       //     * [KSTACKTOP-PTSIZE, KSTACKTOP-KSTKSIZE) -- not backed => faults
-       //     Permissions: kernel RW, user NONE
-       // Your code goes here:
-
-       // remember that the space for the kernel stack is allocated in the binary.
-       // bootstack and bootstacktop point to symbols in the data section, which 
-       // at this point are like 0xc010b000.  KSTACKTOP is the desired loc in VM
-       boot_map_segment(pgdir, (uintptr_t)KSTACKTOP - KSTKSIZE, 
-                        KSTKSIZE, PADDR(bootstack), PTE_W | PTE_G);
-
-       //////////////////////////////////////////////////////////////////////
-       // Map all of physical memory at KERNBASE. 
-       // Ie.  the VA range [KERNBASE, 2^32) should map to
-       //      the PA range [0, 2^32 - KERNBASE)
-       // We might not have 2^32 - KERNBASE bytes of physical memory, but
-       // we just set up the mapping anyway.
-       // Permissions: kernel RW, user NONE
-       // Your code goes here: 
-       
-       // this maps all of the possible phys memory
-       // note the use of unsigned underflow to get size = 0x40000000
-       //boot_map_segment(pgdir, KERNBASE, -KERNBASE, 0, PTE_W);
-       // but this only maps what is available, and saves memory.  every 4MB of
-       // mapped memory requires a 2nd level page: 2^10 entries, each covering 2^12
-       // need to modify tests below to account for this
-       if (pse) {
-               // map the first 4MB as regular entries, to support different MTRRs
-               boot_map_segment(pgdir, KERNBASE, JPGSIZE, 0, PTE_W | PTE_G);
-               boot_map_segment(pgdir, KERNBASE + JPGSIZE, maxaddrpa - JPGSIZE, JPGSIZE,
-                                PTE_W | PTE_G | PTE_PS);
-       } else
-               boot_map_segment(pgdir, KERNBASE, maxaddrpa, 0, PTE_W | PTE_G);
-
-       // APIC mapping: using PAT (but not *the* PAT flag) to make these type UC
-       // IOAPIC
-       boot_map_segment(pgdir, (uintptr_t)IOAPIC_BASE, PGSIZE, IOAPIC_BASE, 
-                        PTE_PCD | PTE_PWT | PTE_W | PTE_G);
-       // Local APIC
-       boot_map_segment(pgdir, (uintptr_t)LAPIC_BASE, PGSIZE, LAPIC_BASE,
-                        PTE_PCD | PTE_PWT | PTE_W | PTE_G);
-
-       // Check that the initial page directory has been set up correctly.
-       check_boot_pgdir(pse);
-
-       //////////////////////////////////////////////////////////////////////
-       // On x86, segmentation maps a VA to a LA (linear addr) and
-       // paging maps the LA to a PA.  I.e. VA => LA => PA.  If paging is
-       // turned off the LA is used as the PA.  Note: there is no way to
-       // turn off segmentation.  The closest thing is to set the base
-       // address to 0, so the VA => LA mapping is the identity.
-
-       // Current mapping: VA KERNBASE+x => PA x.
-       //     (segmentation base=-KERNBASE and paging is off)
-
-       // From here on down we must maintain this VA KERNBASE + x => PA x
-       // mapping, even though we are turning on paging and reconfiguring
-       // segmentation.
-
-       // Map VA 0:4MB same as VA KERNBASE, i.e. to PA 0:4MB.
-       // (Limits our kernel to <4MB)
-       /* They mean linear address 0:4MB, and the kernel < 4MB is only until 
-        * segmentation is turned off.
-        * once we turn on paging, segmentation is still on, so references to
-        * KERNBASE+x will get mapped to linear address x, which we need to make 
-        * sure can map to phys addr x, until we can turn off segmentation and
-        * KERNBASE+x maps to LA KERNBASE+x, which maps to PA x, via paging
-        */
-       pgdir[0] = pgdir[PDX(KERNBASE)];
-
-       // Install page table.
-       lcr3(boot_cr3);
-
-       // Turn on paging.
-       cr0 = rcr0();
-       // CD and NW should already be on, but just in case these turn on caching
-       cr0 |= CR0_PE|CR0_PG|CR0_AM|CR0_WP|CR0_NE|CR0_MP;
-       cr0 &= ~(CR0_TS|CR0_EM|CR0_CD|CR0_NW);
-       lcr0(cr0);
-
-       // Current mapping: KERNBASE+x => x => x.
-       // (x < 4MB so uses paging pgdir[0])
-
-       // Reload all segment registers.
-       asm volatile("lgdt gdt_pd");
-       asm volatile("movw %%ax,%%gs" :: "a" (GD_UD|3));
-       asm volatile("movw %%ax,%%fs" :: "a" (GD_UD|3));
-       asm volatile("movw %%ax,%%es" :: "a" (GD_KD));
-       asm volatile("movw %%ax,%%ds" :: "a" (GD_KD));
-       asm volatile("movw %%ax,%%ss" :: "a" (GD_KD));
-       asm volatile("ljmp %0,$1f\n 1:\n" :: "i" (GD_KT));  // reload cs
-       asm volatile("lldt %%ax" :: "a" (0));
-
-       // Final mapping: KERNBASE+x => KERNBASE+x => x.
-
-       // This mapping was only used after paging was turned on but
-       // before the segment registers were reloaded.
-       pgdir[0] = 0;
-
-       // Flush the TLB for good measure, to kill the pgdir[0] mapping.
-       tlb_flush_global();
-}
-
-//
-// Checks that the kernel part of virtual address space
-// has been setup roughly correctly(by i386_vm_init()).
-//
-// This function doesn't test every corner case,
-// in fact it doesn't test the permission bits at all,
-// but it is a pretty good sanity check. 
-//
-static physaddr_t check_va2pa(pde_t *COUNT(NPDENTRIES) pgdir, uintptr_t va);
-
-static void
-check_boot_pgdir(bool pse)
-{
-       uint32_t i, n;
-       pde_t *pgdir, pte;
-
-       pgdir = boot_pgdir;
-
-       // check phys mem
-       //for (i = 0; KERNBASE + i != 0; i += PGSIZE)
-       // adjusted check to account for only mapping avail mem
-       if (pse)
-               for (i = 0; i < maxaddrpa; i += JPGSIZE)
-                       assert(check_va2pa(pgdir, KERNBASE + i) == i);
-       else
-               for (i = 0; i < maxaddrpa; i += PGSIZE)
-                       assert(check_va2pa(pgdir, KERNBASE + i) == i);
-
-       // check kernel stack
-       for (i = 0; i < KSTKSIZE; i += PGSIZE)
-               assert(check_va2pa(pgdir, KSTACKTOP - KSTKSIZE + i) == PADDR(bootstack) + i);
-
-       // check for zero/non-zero in PDEs
-       for (i = 0; i < NPDENTRIES; i++) {
-               switch (i) {
-               case PDX(VPT):
-               case PDX(UVPT):
-               case PDX(KSTACKTOP-1):
-               case PDX(LAPIC_BASE): // LAPIC mapping.  TODO: remove when MTRRs are up
-                       assert(pgdir[i]);
-                       break;
-               default:
-                       //if (i >= PDX(KERNBASE))
-                       // adjusted check to account for only mapping avail mem
-                       // and you can't KADDR maxpa (just above legal range)
-                       // maxaddrpa can be up to maxpa, so assume the worst
-                       if (i >= PDX(KERNBASE) && i <= PDX(KADDR(maxaddrpa-1)))
-                               assert(pgdir[i]);
-                       else
-                               assert(pgdir[i] == 0);
-                       break;
-               }
-       }
-
-       /* check permissions
-        * user read-only.  check for user and write, should be only user
-        * eagle-eyed viewers should be able to explain the extra cases.
-        * for the mongoose-eyed, remember that weird shit happens when you loop
-        * through UVPT.  Specifically, you can't loop once, then look at a jumbo
-        * page that is kernel only.  That's the end of the page table for you, so
-        * having a U on the entry doesn't make sense.  Thus we check for a jumbo
-        * page, and special case it.  This will happen at 0xbf701000.  Why is this
-        * magical?  Get your eagle glasses and figure it out. */
-       for (i = UTOP; i < ULIM; i+=PGSIZE) {
-               pte = get_va_perms(pgdir, (void*SAFE)TC(i));
-               if (pte & PTE_P) {
-                       if (i == UVPT+(VPT >> 10))
-                               continue;
-                       if (*pgdir_walk(pgdir, (void*SAFE)TC(i), 0) & PTE_PS) {
-                               assert((pte & PTE_U) != PTE_U);
-                               assert((pte & PTE_W) != PTE_W);
-                       } else {
-                               assert((pte & PTE_U) == PTE_U);
-                               assert((pte & PTE_W) != PTE_W);
-                       }
-               }
-       }
-       // kernel read-write.
-       for (i = ULIM; i <= KERNBASE + maxaddrpa - PGSIZE; i+=PGSIZE) {
-               pte = get_va_perms(pgdir, (void*SAFE)TC(i));
-               if ((pte & PTE_P) && (i != VPT+(UVPT>>10))) {
-                       assert((pte & PTE_U) != PTE_U);
-                       assert((pte & PTE_W) == PTE_W);
-               }
-       }
-       // special mappings
-       pte = get_va_perms(pgdir, (void*SAFE)TC(UVPT+(VPT>>10)));
-       assert((pte & PTE_U) != PTE_U);
-       assert((pte & PTE_W) != PTE_W);
-
-       // note this means the kernel cannot directly manipulate this virtual address
-       // convince yourself this isn't a big deal, eagle-eyes!
-       pte = get_va_perms(pgdir, (void*SAFE)TC(VPT+(UVPT>>10)));
-       assert((pte & PTE_U) != PTE_U);
-       assert((pte & PTE_W) != PTE_W);
-
-       cprintf("check_boot_pgdir() succeeded!\n");
-}
-
-// This function returns the physical address of the page containing 'va',
-// defined by the page directory 'pgdir'.  The hardware normally performs
-// this functionality for us!  We define our own version to help check
-// the check_boot_pgdir() function; it shouldn't be used elsewhere.
-
-static physaddr_t
-check_va2pa(pde_t *COUNT(NPDENTRIES) _pgdir, uintptr_t va)
-{
-       pte_t *COUNT(NPTENTRIES) p;
-       pde_t *COUNT(1) pgdir;
-
-       pgdir = &_pgdir[PDX(va)];
-       if (!(*pgdir & PTE_P))
-               return ~0;
-       if (*pgdir & PTE_PS)
-               return PTE_ADDR(*pgdir);
-       p = (pte_t*COUNT(NPTENTRIES)) KADDR(PTE_ADDR(*pgdir));
-       if (!(p[PTX(va)] & PTE_P))
-               return ~0;
-       return PTE_ADDR(p[PTX(va)]);
-}
-
-/* 
- * Remove the second level page table associated with virtual address va.
- * Will 0 out the PDE for that page table.
- * Panics if the page table has any present entries.
- * This should be called rarely and with good cause.
- * Currently errors if the PDE is jumbo or not present.
- */
-error_t        pagetable_remove(pde_t *pgdir, void *va)
-{
-       pde_t* the_pde = &pgdir[PDX(va)];
-
-       if (!(*the_pde & PTE_P) || (*the_pde & PTE_PS))
-               return -EFAULT;
-       pte_t* page_table = (pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(*the_pde));
-       for (int i = 0; i < NPTENTRIES; i++) 
-               if (page_table[i] & PTE_P)
-                       panic("Page table not empty during attempted removal!");
-       *the_pde = 0;
-       page_decref(pa2page(PADDR(page_table)));
-       return 0;
-}
-
-// Given 'pgdir', a pointer to a page directory, pgdir_walk returns
-// a pointer to the page table entry (PTE) for linear address 'va'.
-// This requires walking the two-level page table structure.
-//
-// If the relevant page table doesn't exist in the page directory, then:
-//    - If create == 0, pgdir_walk returns NULL.
-//    - Otherwise, pgdir_walk tries to allocate a new page table
-//     with page_alloc.  If this fails, pgdir_walk returns NULL.
-//    - Otherwise, pgdir_walk returns a pointer into the new page table.
-//
-// This is boot_pgdir_walk, but using page_alloc() instead of boot_alloc().
-// Unlike boot_pgdir_walk, pgdir_walk can fail.
-//
-// Hint: you can turn a Page * into the physical address of the
-// page it refers to with page2pa() from kern/pmap.h.
-//
-// Supports returning jumbo (4MB PSE) PTEs.  To create with a jumbo, pass in 2.
-pte_t*
-pgdir_walk(pde_t *pgdir, const void *SNT va, int create)
-{
-       pde_t* the_pde = &pgdir[PDX(va)];
-       page_t *new_table;
-
-       if (*the_pde & PTE_P) {
-               if (*the_pde & PTE_PS)
-                       return (pte_t*)the_pde;
-               return &((pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(*the_pde)))[PTX(va)];
-       }
-       if (!create)
-               return NULL;
-       if (create == 2) {
-               if (JPGOFF(va))
-                       panic("Attempting to find a Jumbo PTE at an unaligned VA!");
-               *the_pde = PTE_PS | PTE_P;
-               return (pte_t*)the_pde;
-       }
-       if (kpage_alloc(&new_table))
-               return NULL;
-       page_setref(new_table,1);
-       memset(page2kva(new_table), 0, PGSIZE);
-       *the_pde = (pde_t)page2pa(new_table) | PTE_P | PTE_W | PTE_U;
-       return &((pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(*the_pde)))[PTX(va)];
-}
-
-/* Returns the effective permissions for PTE_U, PTE_W, and PTE_P on a given
- * virtual address.  Note we need to consider the composition of every PTE in
- * the page table walk. */
-int get_va_perms(pde_t *pgdir, const void *SNT va)
-{
-       pde_t the_pde = pgdir[PDX(va)];
-       pte_t the_pte;
-
-       if (!(the_pde & PTE_P))
-               return 0;
-       if (the_pde & PTE_PS)
-               return the_pde & (PTE_U | PTE_W | PTE_P);
-       the_pte = ((pde_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(the_pde)))[PTX(va)];
-       if (!(the_pte & PTE_P))
-               return 0;
-       return the_pte & the_pde & (PTE_U | PTE_W | PTE_P);
-}
-
-void *get_free_va_range(pde_t *pgdir, uintptr_t addr, size_t len)
-{
-       return NULL;
-}
-
-/* Flushes a TLB, including global pages.  We should always have the CR4_PGE
- * flag set, but just in case, we'll check.  Toggling this bit flushes the TLB.
- */
-void tlb_flush_global(void)
-{
-       uint32_t cr4 = rcr4();
-       if (cr4 & CR4_PGE) {
-               lcr4(cr4 & ~CR4_PGE);
-               lcr4(cr4);
-       } else 
-               lcr3(rcr3());
-}
-
-void
-page_check(void)
-{
-       page_t *pp, *pp0, *pp1, *pp2;
-       page_list_t fl[1024];
-       pte_t *ptep;
-
-       // should be able to allocate three pages
-       pp0 = pp1 = pp2 = 0;
-       assert(kpage_alloc(&pp0) == 0);
-       assert(kpage_alloc(&pp1) == 0);
-       assert(kpage_alloc(&pp2) == 0);
-       page_setref(pp0, 0);
-       page_setref(pp1, 0);
-       page_setref(pp2, 0);
-
-       assert(pp0);
-       assert(pp1 && pp1 != pp0);
-       assert(pp2 && pp2 != pp1 && pp2 != pp0);
-
-       // temporarily steal the rest of the free pages
-       for(int i=0; i<llc_cache->num_colors; i++) {
-               fl[i] = colored_page_free_list[i];
-               LIST_INIT(&colored_page_free_list[i]);
-       }
-
-       // should be no free memory
-       assert(kpage_alloc(&pp) == -ENOMEM);
-
-       // Fill pp1 with bogus data and check for invalid tlb entries
-       memset(page2kva(pp1), 0xFFFFFFFF, PGSIZE);
-
-       // there is no page allocated at address 0
-       assert(page_lookup(boot_pgdir, (void *) 0x0, &ptep) == NULL);
-
-       // there is no free memory, so we can't allocate a page table 
-       assert(page_insert(boot_pgdir, pp1, 0x0, 0) < 0);
-
-       // free pp0 and try again: pp0 should be used for page table
-       page_free(pp0);
-       assert(page_insert(boot_pgdir, pp1, 0x0, 0) == 0);
-       tlb_invalidate(boot_pgdir, 0x0);
-       // DEP Should have shot down invalid TLB entry - let's check
-       { TRUSTEDBLOCK
-         int *x = 0x0;
-         assert(*x == 0xFFFFFFFF);
-       }
-       assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0));
-       assert(check_va2pa(boot_pgdir, 0x0) == page2pa(pp1));
-       assert(pp1->page_ref == 1);
-       assert(pp0->page_ref == 1);
-
-       // should be able to map pp2 at PGSIZE because pp0 is already allocated for page table
-       assert(page_insert(boot_pgdir, pp2, (void*SNT) PGSIZE, 0) == 0);
-       assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp2));
-       assert(pp2->page_ref == 1);
-
-       // Make sure that pgdir_walk returns a pointer to the pte and
-       // not the table or some other garbage
-       {
-         pte_t *p = (pte_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(boot_pgdir[PDX(PGSIZE)]));
-         assert(pgdir_walk(boot_pgdir, (void *SNT)PGSIZE, 0) == &p[PTX(PGSIZE)]);
-       }
-
-       // should be no free memory
-       assert(kpage_alloc(&pp) == -ENOMEM);
-
-       // should be able to map pp2 at PGSIZE because it's already there
-       assert(page_insert(boot_pgdir, pp2, (void*SNT) PGSIZE, PTE_U) == 0);
-       assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp2));
-       assert(pp2->page_ref == 1);
-
-       // Make sure that we actually changed the permission on pp2 when we re-mapped it
-       {
-         pte_t *p = pgdir_walk(boot_pgdir, (void*SNT)PGSIZE, 0);
-         assert(((*p) & PTE_U) == PTE_U);
-       }
-
-       // pp2 should NOT be on the free list
-       // could happen in ref counts are handled sloppily in page_insert
-       assert(kpage_alloc(&pp) == -ENOMEM);
-
-       // should not be able to map at PTSIZE because need free page for page table
-       assert(page_insert(boot_pgdir, pp0, (void*SNT) PTSIZE, 0) < 0);
-
-       // insert pp1 at PGSIZE (replacing pp2)
-       assert(page_insert(boot_pgdir, pp1, (void*SNT) PGSIZE, 0) == 0);
-
-       // should have pp1 at both 0 and PGSIZE, pp2 nowhere, ...
-       assert(check_va2pa(boot_pgdir, 0) == page2pa(pp1));
-       assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp1));
-       // ... and ref counts should reflect this
-       assert(pp1->page_ref == 2);
-       assert(pp2->page_ref == 0);
-
-       // pp2 should be returned by page_alloc
-       assert(kpage_alloc(&pp) == 0 && pp == pp2);
-       page_setref(pp, 0);
-
-       // unmapping pp1 at 0 should keep pp1 at PGSIZE
-       page_remove(boot_pgdir, 0x0);
-       assert(check_va2pa(boot_pgdir, 0x0) == ~0);
-       assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp1));
-       assert(pp1->page_ref == 1);
-       assert(pp2->page_ref == 0);
-
-       // unmapping pp1 at PGSIZE should free it
-       page_remove(boot_pgdir, (void*SNT) PGSIZE);
-       assert(check_va2pa(boot_pgdir, 0x0) == ~0);
-       assert(check_va2pa(boot_pgdir, PGSIZE) == ~0);
-       assert(pp1->page_ref == 0);
-       assert(pp2->page_ref == 0);
-
-       // so it should be returned by page_alloc
-       assert(kpage_alloc(&pp) == 0 && pp == pp1);
-       page_setref(pp, 0);
-
-       // should be no free memory
-       assert(kpage_alloc(&pp) == -ENOMEM);
-
-       // forcibly take pp0 back
-       assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0));
-       boot_pgdir[0] = 0;
-       assert(pp0->page_ref == 1);
-       pp0->page_ref = 0;
-
-       // Catch invalid pointer addition in pgdir_walk - i.e. pgdir + PDX(va)
-       {
-         // Give back pp0 for a bit
-         page_free(pp0);
-
-         void *SNT va = (void *SNT)((PGSIZE * NPDENTRIES) + PGSIZE);
-         pte_t *p2 = pgdir_walk(boot_pgdir, va, 1);
-         pte_t *p = (pte_t*COUNT(NPTENTRIES))KADDR(PTE_ADDR(boot_pgdir[PDX(va)]));
-         assert(p2 == &p[PTX(va)]);
-
-         // Clean up again
-         boot_pgdir[PDX(va)] = 0;
-         pp0->page_ref = 0;
-       }
-
-       // give free list back
-       for(int i=0; i<llc_cache->num_colors; i++)
-               colored_page_free_list[i] = fl[i];
-
-       // free the pages we took
-       page_free(pp0);
-       page_free(pp1);
-       page_free(pp2);
-
-       cprintf("page_check() succeeded!\n");
-}
-
-/* 
-
-    // testing code for boot_pgdir_walk 
-       pte_t* temp;
-       temp = boot_pgdir_walk(pgdir, VPT + (VPT >> 10), 1);
-       cprintf("pgdir = %p\n", pgdir);
-       cprintf("test recursive walking pte_t* = %p\n", temp);
-       cprintf("test recursive walking entry = %p\n", PTE_ADDR(temp));
-       temp = boot_pgdir_walk(pgdir, 0xc0400000, 1);
-       cprintf("LA = 0xc0400000 = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0400070, 1);
-       cprintf("LA = 0xc0400070 = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0800000, 0);
-       cprintf("LA = 0xc0800000, no create = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0600070, 1);
-       cprintf("LA = 0xc0600070 = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0600090, 0);
-       cprintf("LA = 0xc0600090, nc = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0608070, 0);
-       cprintf("LA = 0xc0608070, nc = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0800070, 1);
-       cprintf("LA = 0xc0800070 = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0b00070, 0);
-       cprintf("LA = 0xc0b00070, nc = %p\n", temp);
-       temp = boot_pgdir_walk(pgdir, 0xc0c00000, 0);
-       cprintf("LA = 0xc0c00000, nc = %p\n", temp);
-
-       // testing for boot_map_seg
-       cprintf("\n");
-       cprintf("before mapping 1 page to 0x00350000\n");
-       cprintf("0xc4000000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc4000000, 1));
-       cprintf("0xc4000000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc4000000, 1)));
-       boot_map_segment(pgdir, 0xc4000000, 4096, 0x00350000, PTE_W);
-       cprintf("after mapping\n");
-       cprintf("0xc4000000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc4000000, 1));
-       cprintf("0xc4000000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc4000000, 1)));
-
-       cprintf("\n");
-       cprintf("before mapping 3 pages to 0x00700000\n");
-       cprintf("0xd0000000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0000000, 1));
-       cprintf("0xd0000000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0000000, 1)));
-       cprintf("0xd0001000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0001000, 1));
-       cprintf("0xd0001000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0001000, 1)));
-       cprintf("0xd0002000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0002000, 1));
-       cprintf("0xd0002000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0002000, 1)));
-       boot_map_segment(pgdir, 0xd0000000, 4096*3, 0x00700000, 0);
-       cprintf("after mapping\n");
-       cprintf("0xd0000000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0000000, 1));
-       cprintf("0xd0000000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0000000, 1)));
-       cprintf("0xd0001000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0001000, 1));
-       cprintf("0xd0001000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0001000, 1)));
-       cprintf("0xd0002000's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xd0002000, 1));
-       cprintf("0xd0002000's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xd0002000, 1)));
-
-       cprintf("\n");
-       cprintf("before mapping 1 unaligned to 0x00500010\n");
-       cprintf("0xc8000010's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc8000010, 1));
-       cprintf("0xc8000010's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc8000010, 1)));
-       cprintf("0xc8001010's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc8001010, 1));
-       cprintf("0xc8001010's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc8001010, 1)));
-       boot_map_segment(pgdir, 0xc8000010, 4096, 0x00500010, PTE_W);
-       cprintf("after mapping\n");
-       cprintf("0xc8000010's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc8000010, 1));
-       cprintf("0xc8000010's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc8000010, 1)));
-       cprintf("0xc8001010's &pte: %08x\n",boot_pgdir_walk(pgdir, 0xc8001010, 1));
-       cprintf("0xc8001010's pte: %08x\n",*(boot_pgdir_walk(pgdir, 0xc8001010, 1)));
-
-       cprintf("\n");
-       boot_map_segment(pgdir, 0xe0000000, 4096, 0x10000000, PTE_W);
-
-*/
diff --git a/kern/arch/i386/process.c b/kern/arch/i386/process.c
deleted file mode 100644 (file)
index 06aa9cd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <arch/arch.h>
-#include <arch/trap.h>
-#include <process.h>
-#include <pmap.h>
-#include <smp.h>
-
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-
-// architecture-specific process initialization code
-void proc_init_arch(struct proc *SAFE p)
-{
-}
-
-// architecture-specific process termination code
-void proc_free_arch(struct proc *SAFE p)
-{
-}
-
-void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
-                         uint32_t entryp, uint32_t stack_top)
-{
-       /* Set up appropriate initial values for the segment registers.
-        * GD_UD is the user data segment selector in the GDT, and
-        * GD_UT is the user text segment selector (see inc/memlayout.h).
-        * The low 2 bits of each segment register contains the
-        * Requestor Privilege Level (RPL); 3 means user mode. */
-       tf->tf_ds = GD_UD | 3;
-       tf->tf_es = GD_UD | 3;
-       tf->tf_ss = GD_UD | 3;
-       tf->tf_esp = stack_top;
-       tf->tf_cs = GD_UT | 3;
-       /* set the env's EFLAGSs to have interrupts enabled */
-       tf->tf_eflags |= 0x00000200; // bit 9 is the interrupts-enabled
-
-       tf->tf_eip = entryp;
-
-       /* Coupled closely with user's entry.S.  id is the vcoreid, which entry.S
-        * uses to determine what to do.  vcoreid == 0 is the main core/context. */
-       tf->tf_regs.reg_eax = vcoreid;
-}
-
-/* For cases that we won't return from a syscall via the normal path, and need
- * to set the syscall return value in the registers manually.  Like in a syscall
- * moving to RUNNING_M */
-void proc_set_syscall_retval(trapframe_t *SAFE tf, intreg_t value)
-{
-       tf->tf_regs.reg_eax = value;
-}
diff --git a/kern/arch/i386/rl8168.c b/kern/arch/i386/rl8168.c
deleted file mode 100644 (file)
index 00c6bb0..0000000
+++ /dev/null
@@ -1,717 +0,0 @@
-/** @filec
- * @brief RL8168 Driver       
- *
- * EXPERIMENTAL. DO NOT USE IF YOU DONT KNOW WHAT YOU ARE DOING
- *
- * See Info below 
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <arch/mmu.h>
-#include <arch/x86.h>
-#include <arch/smp.h>
-#include <arch/apic.h>
-#include <arch/pci.h>
-#include <arch/rl8168.h>
-
-#include <ros/memlayout.h>
-
-#include <atomic.h>
-#include <stdio.h>
-#include <string.h>
-#include <trap.h>
-#include <kmalloc.h>
-
-#include <pmap.h>
-
-/** @file
- * @brief Realtek RL8168 Driver
- *
- * EXPERIMENTAL. DO NOT USE IF YOU DONT KNOW WHAT YOU ARE DOING
- *
- * 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
- *
- * @author Paul Pearce <pearce@eecs.berkeley.edu>
- *
- * @todo Move documention below into doxygen format.
- * @todo See list in code
- */
-
-
-/* RealTek 8168d (8111d) NIC Driver
- *
- * Written by Paul Pearce.
- *
- * This is a really rough "driver". Really, its not a driver, just a kernel hack to give
- * the kernel a way to receive and send packets. The basis of the init code is the OSDEV
- * page on the 8169 chipset, which is a varient of this chipset (most 8169 drivers work 
- * on the 8168d). http://wiki.osdev.org/RTL8169
- * 
- * Basic ideas (although no direct code) were gleamed from the OpenBSD re(4) driver,
- * which can be found in sys/dev/ic/re.c. sys/dev/ic/rtl81x9reg.h is needed to make
- * sense of the constants used in re.c.
- *
- * This is an ongoing work in progress. Main thing is we need a kernel interface for PCI
- * devices and network devices, that we can hook into, instead of providing arbitary functions
- * 
- * TODO: Remove hacky syscall hack stuff (once we get a real stack).
- * TODO: Jumbo frame support
- * TODO: Use high priority transmit ring for syscall stuff.
- * TODO: Discuss panic conditions.
- * TODO: Shutdown cleanup kfrees()
- * TODO: Use onboard timer interrupt to check for packets, instead of writing a bit each time we have a packet.
- * TODO: CONCURRENCY!
- */
-
-struct Descriptor
-{
-    unsigned int command,  /* command/status dword */
-                 vlan,     /* currently unused */
-                 low_buf,  /* low 32-bits of physical buffer address */
-                 high_buf; /* high 32-bits of physical buffer address */
-};
-
-
-uint32_t rl8168_io_base_addr = 0;
-uint32_t rl8168_irq = 0;
-char device_mac[6];
-
-struct Descriptor *CT(NUM_RX_DESCRIPTORS) rx_des_kva;
-unsigned long rx_des_pa;
-
-struct Descriptor *CT(NUM_TX_DESCRIPTORS) tx_des_kva;
-unsigned long tx_des_pa;
-
-uint32_t rx_des_cur = 0;
-uint32_t tx_des_cur = 0;
-
-extern int eth_up;
-extern uint32_t packet_buffer_count;
-extern char* packet_buffer[PACKET_BUFFER_SIZE];
-extern uint32_t packet_buffer_sizes[PACKET_BUFFER_SIZE];
-extern uint32_t packet_buffer_head;
-extern uint32_t packet_buffer_tail;
-spinlock_t packet_buffer_lock;
-
-extern char *CT(PACKET_HEADER_SIZE + len) (*packet_wrap)(const char *CT(len) data, size_t len);
-extern int (*send_frame)(const char *CT(len) data, size_t len);
-
-
-void rl8168_init() {
-
-       if (rl8168_scan_pci() < 0) return;
-       rl8168_read_mac();
-       rl8168_setup_descriptors();
-       rl8168_configure();
-       rl8168_setup_interrupts();
-       packet_wrap = &rl8168_packet_wrap;
-        send_frame = &rl8168_send_frame;
-
-       eth_up = 1;
-       
-       //Trigger sw based nic interrupt
-/*     cprintf("Generating interrupt...\n");
-       outb(rl8168_io_base_addr + 0x38, 0x1);
-       cprintf("sleeping\n");
-       udelay(3000000);
-       cprintf("done\n");
-*/
-       return;
-}
-
-
-int rl8168_scan_pci() {
-       
-       extern pci_dev_entry_t pci_dev_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-       extern uint16_t pci_irq_map[PCI_MAX_BUS][PCI_MAX_DEV][PCI_MAX_FUNC];
-
-       cprintf("Searching for RealTek 8168 Network device...");
-
-       for (int i = 0; i < PCI_MAX_BUS; i++)
-               for (int j = 0; j < PCI_MAX_DEV; j++)
-                       for (int k = 0; k < PCI_MAX_FUNC; k++) {
-                               uint32_t address;
-                               uint32_t bus = i;
-                               uint32_t dev = j;
-                               uint32_t func = k;
-                               uint32_t reg = 0; 
-                               uint32_t result  = 0;
-       
-                               uint16_t dev_id = pci_dev_map[i][j][k].dev_id;
-                               uint16_t ven_id = pci_dev_map[i][j][k].ven_id;
-
-                               // Vender DNE
-                               if (ven_id == INVALID_VENDOR_ID) 
-                                       continue;
-
-                               // Ignore non RealTek 8168 Devices
-                               if (ven_id != REALTEK_VENDOR_ID || dev_id != REALTEK_DEV_ID)
-                                       continue;
-                               cprintf(" found on BUS %x DEV %x\n", i, j);
-
-                               // Find the IRQ
-                               rl8168_irq = pci_irq_map[i][j][k];
-                               rl8168_debug("-->IRQ: %u\n", rl8168_irq);
-
-                               // Loop over the BARs
-                               for (int k = 0; k <= 5; k++) {
-                                       reg = 4 + k;
-                                       address = MK_CONFIG_ADDR(bus, dev, func, reg << 2);     
-                               outl(PCI_CONFIG_ADDR, address);
-                               result = inl(PCI_CONFIG_DATA);
-                                       
-                                       if (result == 0) // (0 denotes no valid data)
-                                               continue;
-
-                                       // Read the bottom bit of the BAR. 
-                                       if (result & PCI_BAR_IO_MASK) {
-                                               result = result & PCI_IO_MASK;
-                                               rl8168_debug("-->BAR%u: %s --> %x\n", k, "IO", result);
-                                       } else {
-                                               result = result & PCI_MEM_MASK;
-                                               rl8168_debug("-->BAR%u: %s --> %x\n", k, "MEM", result);
-                                       }
-                       
-                                       // TODO Switch to memory mapped instead of IO?
-                                       if (k == 0) // BAR0 denotes the IO Addr for the device
-                                               rl8168_io_base_addr = result;                                           
-                               }
-               
-               rl8168_debug("-->hwrev: %x\n", inl(rl8168_io_base_addr + RL_HWREV_REG) & RL_HWREV_MASK);
-               
-               return 0;
-       }
-       cprintf(" not found. No device configured.\n");
-       
-       return -1;
-}
-
-void rl8168_read_mac() {
-       
-       for (int i = 0; i < 6; i++)
-          device_mac[i] = inb(rl8168_io_base_addr + RL_MAC_OFFSET + i); 
-       
-       rl8168_debug("-->DEVICE MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & device_mac[0], 0xFF & device_mac[1],      
-                                                                   0xFF & device_mac[2], 0xFF & device_mac[3], 
-                                                                0xFF & device_mac[4], 0xFF & device_mac[5]);
-       return;
-}
-
-void rl8168_setup_descriptors() {
-       
-       rl8168_debug("-->Setting up tx/rx descriptors.\n");
-                       
-       // Allocate room for the buffers. 
-       // Buffers need to be on 256 byte boundries.
-       // Note: We use get_cont_pages to force page alignment, and thus 256 byte aligned
-
-        uint32_t num_rx_pages = ROUNDUP(NUM_RX_DESCRIPTORS * sizeof(struct Descriptor), PGSIZE) / PGSIZE;
-        uint32_t num_tx_pages = ROUNDUP(NUM_TX_DESCRIPTORS * sizeof(struct Descriptor), PGSIZE) / PGSIZE;
-       
-       rx_des_kva = get_cont_pages(LOG2_UP(num_rx_pages), 0);
-       tx_des_kva = get_cont_pages(LOG2_UP(num_tx_pages), 0);
-
-       if (rx_des_kva == NULL) panic("Can't allocate page for RX Ring");
-       if (tx_des_kva == NULL) panic("Can't allocate page for TX Ring");
-       
-       rx_des_pa = PADDR(rx_des_kva);
-       tx_des_pa = PADDR(tx_des_kva);
-       
-    for (int i = 0; i < NUM_RX_DESCRIPTORS; i++) 
-               rl8168_set_rx_descriptor(i, TRUE); // Allocate memory for the descriptor
-               
-       for (int i = 0; i < NUM_TX_DESCRIPTORS; i++) 
-               rl8168_set_tx_descriptor(i);
-               
-       return;
-}
-
-
-void rl8168_set_rx_descriptor(uint32_t des_num, uint8_t reset_buffer) {
-       
-       // Set the OWN bit on all descriptors. Also set the buffer size.
-       rx_des_kva[des_num].command = (DES_OWN_MASK | (RL_RX_MAX_BUFFER_SIZE & DES_RX_SIZE_MASK));
-       
-       if (des_num == (NUM_RX_DESCRIPTORS - 1)) 
-               rx_des_kva[des_num].command = rx_des_kva[des_num].command | DES_EOR_MASK;
-       
-       if (reset_buffer) {
-               // Must be aligned on 8 byte boundries. Taken care of by kmalloc.
-               char *rx_buffer = kmalloc(RL_RX_MAX_BUFFER_SIZE, 0);
-       
-               if (rx_buffer == NULL) panic ("Can't allocate page for RX Buffer");
-
-               rx_des_kva[des_num].low_buf = PADDR(rx_buffer);
-               //.high_buf used if we do 64bit.
-       }
-       
-       return;
-}
-
-void rl8168_set_tx_descriptor(uint32_t des_num) {
-       
-       // Clear the command bits.
-       tx_des_kva[des_num].command = 0;
-       
-       // Set EOR bit on last descriptor
-       if (des_num == (NUM_TX_DESCRIPTORS - 1))
-               tx_des_kva[des_num].command = DES_EOR_MASK;     
-               
-       char *tx_buffer = kmalloc(RL_TX_MAX_BUFFER_SIZE, 0);
-
-       if (tx_buffer == NULL) panic ("Can't allocate page for TX Buffer");
-
-       tx_des_kva[des_num].low_buf = PADDR(tx_buffer);
-       //.high_buf used if we do 64bit.
-               
-       return;
-}
-
-void rl8168_configure() {
-       
-       // TODO: Weigh resetting the nic. Not really needed. Remove?
-       // TODO Check ordering of what we set.
-       // TODO Remove C+ register setting?
-       
-       rl8168_debug("-->Configuring Device.\n");
-       rl8168_reset();
-
-       // Magic to handle the C+ register. Completely undocumented, ripped from the BSE RE driver.
-       outl(rl8168_io_base_addr + RL_CP_CTRL_REG, RL_CP_MAGIC_MASK);
-
-       // Unlock EPPROM CTRL REG
-       outb(rl8168_io_base_addr + RL_EP_CTRL_REG, RL_EP_CTRL_UL_MASK);         
-       
-       // Set max RX Packet Size
-    outw(rl8168_io_base_addr + RL_RX_MXPKT_REG, RL_RX_MAX_SIZE);       
-               
-       // Set max TX Packet Size
-    outb(rl8168_io_base_addr + RL_TX_MXPKT_REG, RL_TX_MAX_SIZE);                       
-
-       // Set TX Des Ring Start Addr
-    outl(rl8168_io_base_addr + RL_TX_DES_REG, (unsigned long)tx_des_pa); 
-       
-       // Set RX Des Ring Start Addr
-    outl(rl8168_io_base_addr + RL_RX_DES_REG, (unsigned long)rx_des_pa);       
-
-       // Configure TX
-       outl(rl8168_io_base_addr + RL_TX_CFG_REG, RL_TX_CFG_MASK); 
-       
-       // Configure RX
-       outl(rl8168_io_base_addr + RL_TX_CFG_REG, RL_RX_CFG_MASK);                      
-
-       // Enable RX and TX in the CTRL Reg
-       outb(rl8168_io_base_addr + RL_CTRL_REG, RL_CTRL_RXTX_MASK);                     
-
-       // Lock the EPPROM Ctrl REG
-    outl(rl8168_io_base_addr + RL_EP_CTRL_REG, RL_EP_CTRL_L_MASK);             
-       
-       return;
-}
-
-void rl8168_reset() {
-       
-       rl8168_debug("-->Resetting device..... ");
-       outb(rl8168_io_base_addr + RL_CTRL_REG, RL_CTRL_RESET_MASK);
-       
-       // Wait for NIC to answer "done resetting" before continuing on
-       while (inb(rl8168_io_base_addr + RL_CTRL_REG) & RL_CTRL_RESET_MASK);
-       rl8168_debug(" done.\n");
-       
-       return;
-}
-
-void rl8168_setup_interrupts() {
-       
-       extern handler_t interrupt_handlers[];
-       
-       rl8168_debug("-->Setting interrupts.\n");
-       
-       // Enable NIC interrupts
-       outw(rl8168_io_base_addr + RL_IM_REG, RL_INTERRUPT_MASK);
-       
-       //Clear the current interrupts.
-       outw(rl8168_io_base_addr + RL_IS_REG, RL_INTRRUPT_CLEAR);
-       
-       // Kernel based interrupt stuff
-#ifdef __IVY__
-       register_interrupt_handler(interrupt_handlers, KERNEL_IRQ_OFFSET + rl8168_irq, rl8168_interrupt_handler, (void *)0);
-#else
-       register_interrupt_handler(interrupt_handlers, KERNEL_IRQ_OFFSET + rl8168_irq, rl8168_interrupt_handler, 0);
-#endif
-       ioapic_route_irq(rl8168_irq, NE2K_IRQ_CPU);     
-       
-       return;
-}
-
-// We need to evaluate this routine in terms of concurrency.
-// We also need to figure out whats up with different core interrupts
-void rl8168_interrupt_handler(trapframe_t *tf, void* data) {
-
-       rl8168_interrupt_debug("\nNic interrupt on core %u!\n", lapic_get_id());
-                               
-       // Read the offending interrupt(s)
-       uint16_t interrupt_status = inw(rl8168_io_base_addr + RL_IS_REG);
-
-       // Clear interrupts immediately so we can get the flag raised again.
-       outw(rl8168_io_base_addr + RL_IS_REG, interrupt_status);
-       
-       // Loop to deal with TOCTOU 
-       while (interrupt_status != 0x0000) {
-               // We can have multiple interrupts fire at once. I've personally seen this.
-               // This means we need to handle this as a series of independent if's
-               if (interrupt_status & RL_INT_ROK) {
-                       rl8168_interrupt_debug("-->RX OK\n");
-                       rl8168_handle_rx_packet();
-               }       
-       
-               if (interrupt_status & RL_INT_RERR) {
-                       rl8168_interrupt_debug("-->RX ERR\n");                  
-               }
-       
-               if (interrupt_status & RL_INT_TOK) {
-                       rl8168_interrupt_debug("-->TX OK\n");
-               }
-       
-               if (interrupt_status & RL_INT_TERR) {
-                       rl8168_interrupt_debug("-->TX ERR\n");                  
-               }
-       
-               if (interrupt_status & RL_INT_RDU) {
-                       rl8168_interrupt_debug("-->RX Descriptor Unavailable\n");                       
-               }
-       
-               if (interrupt_status & RL_INT_LINKCHG) {
-                       rl8168_interrupt_debug("-->Link Status Changed\n");                     
-               }
-       
-               if (interrupt_status & RL_INT_FOVW) {
-                       rl8168_interrupt_debug("-->RX Fifo Overflow\n");                        
-               }
-       
-               if (interrupt_status & RL_INT_TDU) {
-                       rl8168_interrupt_debug("-->TX Descriptor Unavailable\n");                       
-               }
-       
-               if (interrupt_status & RL_INT_SWINT) {
-                       rl8168_interrupt_debug("-->Software Generated Interrupt\n");
-               }
-       
-               if (interrupt_status & RL_INT_TIMEOUT) {
-                       rl8168_interrupt_debug("-->Timer Expired\n");
-               }
-       
-               if (interrupt_status & RL_INT_SERR) {
-                       rl8168_interrupt_debug("-->PCI Bus System Error\n");                    
-               }
-       
-               rl8168_interrupt_debug("\n");
-               
-               // Clear interrupts     
-               interrupt_status = inw(rl8168_io_base_addr + RL_IS_REG);
-               outw(rl8168_io_base_addr + RL_IS_REG, interrupt_status);
-       }
-       
-       // In the event that we got really unlucky and more data arrived after we set 
-       //  set the bit last, try one more check
-       rl8168_handle_rx_packet();
-
-       return;
-}
-
-// TODO: Does a packet too large get dropped or just set the error bits in the descriptor? Find out.
-// TODO: Should we move on to look for the next descriptor? is it safe? TOCTOU
-void rl8168_handle_rx_packet() {
-       
-       uint32_t current_command = rx_des_kva[rx_des_cur].command;
-       uint16_t packet_size;
-       
-       if (current_command & DES_OWN_MASK) {
-               rl8168_frame_debug("-->Nothing to process. Returning.");
-               return;
-       }
-               
-       rl8168_frame_debug("-->RX Des: %u\n", rx_des_cur);
-       
-       // Make sure we are processing from the start of a packet segment
-       if (!(current_command & DES_FS_MASK)) {
-               rl8168_frame_debug("-->ERR: Current RX descriptor not marked with FS mask. Panic!");
-               panic("RX Descriptor Ring FS out of sync");
-       }
-       
-       // NOTE: We are currently configured that the max packet size is large enough to fit inside 1 descriptor buffer,
-       // So we should never be in a situation where a packet spans multiple descriptors.
-       // When we change this, this should operate in a loop until the LS mask is found
-       // Loop would begin here.
-       
-       uint32_t rx_des_loop_cur = rx_des_cur;
-       uint32_t frame_size = 0;
-       uint32_t fragment_size = 0;
-       uint32_t num_frags = 0;
-       
-       char *rx_buffer = kmalloc(MAX_FRAME_SIZE, 0);
-       
-       if (rx_buffer == NULL) panic ("Can't allocate page for incoming packet.");
-       
-       do {
-               current_command =  rx_des_kva[rx_des_loop_cur].command;
-               fragment_size = rx_des_kva[rx_des_loop_cur].command & DES_RX_SIZE_MASK;
-               
-               // If we've looped through the entire ring and not found a terminating packet, bad nic state.
-               // Panic or clear all descriptors? This is a nic hardware error. 
-               if (num_frags && (rx_des_loop_cur == rx_des_cur)) {
-                       //for (int i = 0; i < NUM_RX_DESCRIPTORS; i++) 
-                       //      set_rx_descriptor(i, FALSE); // Dont reallocate memory for the descriptor
-                       // rx_des_cur = 0;
-                       // return;
-                       rl8168_frame_debug("-->ERR: No ending segment found in RX buffer.\n");
-                       panic("RX Descriptor Ring out of sync.");
-               }
-               
-               num_frags++;
-               
-               
-               // Make sure we own the current packet. Kernel ownership is denoted by a 0. Nic by a 1.
-               if (current_command & DES_OWN_MASK) {
-                       rl8168_frame_debug("-->ERR: Current RX descriptor not owned by kernel. Panic!");
-                       panic("RX Descriptor Ring OWN out of sync");
-               }
-               
-               // Make sure if we are at the end of the buffer, the des is marked as end
-               if ((rx_des_loop_cur == (NUM_RX_DESCRIPTORS - 1)) && !(current_command & DES_EOR_MASK)) {
-                       rl8168_frame_debug("-->ERR: Last RX descriptor not marked with EOR mask. Panic!\n");
-                       panic("RX Descriptor Ring EOR Missing");
-               }
-               
-               // We set a max frame size and the nic violated that. 
-               // Panic or clear all desriptors?
-               if ((frame_size + fragment_size) > MAX_FRAME_SIZE) {
-                       //for (int i = 0; i < NUM_RX_DESCRIPTORS; i++) 
-                       //      set_rx_descriptor(i, FALSE); // Dont reallocate memory for the descriptor
-                       // rx_des_cur = 0;
-                       // return;
-                       rl8168_frame_debug("-->ERR: Nic sent %u byte packet. Max is %u\n", frame_size, MAX_FRAME_SIZE);
-                       panic("NIC Sent packets larger than configured.");
-               }
-               
-               // Move the fragment data into the buffer
-               memcpy(rx_buffer + frame_size, KADDR(rx_des_kva[rx_des_loop_cur].low_buf), fragment_size);
-               
-               // Reset the descriptor. No reuse buffer.
-               rl8168_set_rx_descriptor(rx_des_loop_cur, FALSE);
-               
-               // Note: We mask out fragment sizes at 0x3FFFF. There can be at most 1024 of them.
-               // This can not overflow the uint32_t we allocated for frame size, so
-               // we dont need to worry about mallocing too little then overflowing when we read.
-               frame_size = frame_size + fragment_size;
-               
-               // Advance to the next descriptor
-               rx_des_loop_cur = (rx_des_loop_cur + 1) % NUM_RX_DESCRIPTORS;
-               
-       } while (!(current_command & DES_LS_MASK));
-       
-
-       spin_lock(&packet_buffer_lock);
-
-       if (packet_buffer_count >= PACKET_BUFFER_SIZE) {
-               printk("WARNING: DROPPING PACKET!\n");
-               spin_unlock(&packet_buffer_lock);
-               kfree(rx_buffer);
-               return;
-       }
-
-       packet_buffer[packet_buffer_tail] = rx_buffer;
-       packet_buffer_sizes[packet_buffer_tail] = frame_size;
-               
-       packet_buffer_tail = (packet_buffer_tail + 1) % PACKET_BUFFER_SIZE;
-       packet_buffer_count = packet_buffer_count + 1;
-
-       spin_unlock(&packet_buffer_lock);
-                               
-       rx_des_cur = rx_des_loop_cur;
-                               
-       // Chew on the frame data. Command bits should be the same for all frags.
-       rl8168_process_frame(rx_buffer, frame_size, current_command);
-       
-       return;
-}
-
-// This is really more of a debug level function. Will probably go away once we get a stack going.
-void rl8168_process_frame(char *frame_buffer, uint32_t frame_size, uint32_t command) {
-               
-       rl8168_frame_debug("-->Command: %x\n", command);
-       rl8168_frame_debug("-->Size: %u\n", frame_size);
-       
-       if (frame_buffer == NULL)
-               return;
-       
-       // This is hacky. Once we know what our stack will look like, change this.
-       // Once remove check for 0 size.
-       if (frame_size < MINIMUM_PACKET_SIZE) {
-               rl8168_frame_debug("-->Packet too small. Discarding.\n");
-               return;
-       }
-       
-       char dest_mac[6];
-       char source_mac[6];
-       char eth_type[2];
-       
-       for (int i = 0; i < 6; i++) {
-               dest_mac[i] = frame_buffer[i];
-       }
-       
-       for (int i = 0; i < 6; i++) {
-               source_mac[i] = frame_buffer[i+6];
-       }
-       
-       eth_type[0] = frame_buffer[12];
-       eth_type[1] = frame_buffer[13];
-       
-       if (command & DES_MAR_MASK) {
-               rl8168_frame_debug("-->Multicast Packet.\n");
-       }
-       
-       if (command & DES_PAM_MASK) {
-               rl8168_frame_debug("-->Physical Address Matched.\n");
-       }
-       
-       if (command & DES_BAR_MASK) {
-               rl8168_frame_debug("-->Broadcast Packet.\n");
-       }
-       
-       // Note: DEST comes before SRC in the ethernet frame, but that 
-       
-       rl8168_frame_debug("-->DEST   MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & dest_mac[0], 0xFF & dest_mac[1],    
-                                                                            0xFF & dest_mac[2], 0xFF & dest_mac[3],    
-                                                                             0xFF & dest_mac[4], 0xFF & dest_mac[5]);
-       
-       rl8168_frame_debug("-->SOURCE MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & source_mac[0], 0xFF & source_mac[1],        
-                                                                            0xFF & source_mac[2], 0xFF & source_mac[3],        
-                                                                             0xFF & source_mac[4], 0xFF & source_mac[5]);
-
-       rl8168_frame_debug("-->ETHR MODE: %02x%02x\n", 0xFF & eth_type[0], 0xFF & eth_type[1]);
-               
-       return;
-}
-
-// Main routine to send a frame. Just sends it and goes.
-// Card supports sending across multiple fragments.
-// Would we want to write a function that takes a larger packet and generates fragments?
-// This seems like the stacks responsibility. Leave this for now. may in future
-// Remove the max size cap and generate multiple packets.
-int rl8168_send_frame(const char *data, size_t len) {
-
-       if (data == NULL)
-               return -1;
-       if (len == 0)
-               return 0;
-
-       if (tx_des_kva[tx_des_cur].command & DES_OWN_MASK) {
-               rl8168_frame_debug("-->TX Ring Buffer Full!\n");
-               return -1;
-       }
-       
-       if (len > MAX_FRAME_SIZE) {
-               rl8168_frame_debug("-->Frame Too Large!\n");
-               return -1;
-       }
-       
-       memcpy(KADDR(tx_des_kva[tx_des_cur].low_buf), data, len);
-
-       tx_des_kva[tx_des_cur].command = tx_des_kva[tx_des_cur].command | len | DES_OWN_MASK | DES_FS_MASK | DES_LS_MASK;
-
-       // For this revision of the NIC, the checksum bits get set in the vlan field not the command field.
-       // THIS IS A HACK: Need to reach inside the frame we are sending and detect if its of type ip/udp/tcp and set right flag
-       // For now, for the syscall hack, force ip checksum on. (we dont care about udp checksum).
-       // Add an argument to function to specify packet type?
-       //tx_des_kva[tx_des_cur].vlan = DES_TX_IP_CHK_MASK;
-       tx_des_kva[tx_des_cur].vlan = 0;
-
-
-       tx_des_cur = (tx_des_cur + 1) % NUM_TX_DESCRIPTORS;
-       
-       //rl8168_frame_debug("-->Sent packet.\n");
-       
-       outb(rl8168_io_base_addr + RL_TX_CTRL_REG, RL_TX_SEND_MASK);
-       
-       return len;
-}
-
-// This function is a complete hack for syscalls until we get a stack.
-// the day I delete this monstrosity of code I will be a happy man --Paul
-char *CT(PACKET_HEADER_SIZE + len) rl8168_packet_wrap(const char* data, size_t len) {
-       
-       #define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
-                           (((uint16_t)(A) & 0x00ff) << 8))
-       #define htonl(A) ((((uint32_t)(A) & 0xff000000) >> 24) | \
-                           (((uint32_t)(A) & 0x00ff0000) >> 8)  | \
-                           (((uint32_t)(A) & 0x0000ff00) << 8)  | \
-                           (((uint32_t)(A) & 0x000000ff) << 24))
-
-       #define ntohs  htons
-       #define ntohl  htohl
-
-       if ((len == 0) || (data == NULL))
-               return NULL;
-
-       // Hard coded to paul's laptop's mac
-       //Format for Makelocal file: -DUSER_MAC_ADDRESS="{0x00, 0x23, 0x32, 0xd5, 0xae, 0x82}"
-       char dest_mac_address[6] = USER_MAC_ADDRESS;
-       
-       
-       uint32_t source_ip = 0xC0A8000A; // 192.168.0.10
-       uint32_t dest_ip   = 0xC0A8000B; // 192.168.0.11
-       
-       if (len > MAX_PACKET_DATA) {
-               rl8168_frame_debug("Bad packet size for packet wrapping");
-               return NULL;
-       }
-       
-       struct eth_packet* wrap_buffer = kmalloc(MAX_PACKET_SIZE, 0);
-       
-       if (wrap_buffer == NULL) {
-               rl8168_frame_debug("Can't allocate page for packet wrapping");
-               return NULL;
-       }
-       
-
-       struct ETH_Header *eth_header = &wrap_buffer->eth_head.eth_head;
-       struct IP_Header *ip_header = &wrap_buffer->eth_head.ip_head;
-       struct UDP_Header *udp_header = &wrap_buffer->eth_head.udp_head;
-       
-       // Setup eth data
-       for (int i = 0; i < 6; i++) 
-               eth_header->dest_mac[i] = dest_mac_address[i];
-               
-       for (int i = 0; i < 6; i++) 
-               eth_header->source_mac[i] = device_mac[i];
-               
-       eth_header->eth_type = htons(0x0800);
-       
-       // Setup IP data
-       ip_header->ip_opts0 = htonl((4<<28) | (5 << 24) | (len + 28));
-       ip_header->ip_opts1 = 0;
-       ip_header->ip_opts2 = 0x00110a;
-       ip_header->source_ip = htonl(source_ip);
-       ip_header->dest_ip = htonl(dest_ip);
-       
-       // Setup UDP Data
-       udp_header->source_port = htons(44443);
-       udp_header->dest_port = htons(44444);
-       udp_header->length = htons(8 + len);
-       udp_header->checksum = 0;
-       
-       memcpy (&wrap_buffer->data[0], data, len);
-       
-       return (char *CT(PACKET_HEADER_SIZE + len))wrap_buffer; 
-}
diff --git a/kern/arch/i386/rl8168.h b/kern/arch/i386/rl8168.h
deleted file mode 100644 (file)
index f5222a6..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-#ifndef ROS_INC_REALTEK_H
-#define ROS_INC_REALTEK_H
-
-#include <ros/common.h>
-#include <trap.h>
-#include <pmap.h>
-#include <arch/nic_common.h>
-
-#define rl8168_debug(...) // cprintf(__VA_ARGS__)  
-#define rl8168_interrupt_debug(...) //cprintf(__VA_ARGS__)  
-#define rl8168_frame_debug(...)  //cprintf(__VA_ARGS__)  
-
-#define NE2K_IRQ_CPU           5
-
-#define REALTEK_VENDOR_ID   0x10ec
-#define REALTEK_DEV_ID      0x8168
-
-// Realtek Offsets
-#define RL_HWREV_REG           0x40
-#define RL_MAC_OFFSET          0x00
-#define RL_CTRL_REG         0x37
-#define RL_IM_REG                      0x3c
-#define RL_IS_REG                      0x3E
-#define RL_EP_CTRL_REG         0x50
-#define RL_RX_CFG_REG          0x44
-#define RL_TX_CFG_REG          0x40
-#define RL_RX_MXPKT_REG     0xDA
-#define RL_TX_MXPKT_REG     0xEC
-#define RL_RX_DES_REG       0xE4
-#define RL_TX_DES_REG       0x20
-#define RL_TX_CTRL_REG         0x38    
-#define RL_CP_CTRL_REG         0xE0            
-
-// Realtek masks
-#define RL_HWREV_MASK          0x7C800000
-#define RL_CTRL_RXTX_MASK      0x0C
-#define RL_CTRL_RESET_MASK  0x10
-
-#define RL_EP_CTRL_UL_MASK     0xC0
-#define RL_EP_CTRL_L_MASK      0x00
-#define RL_TX_SEND_MASK                0x40
-#define RL_CP_MAGIC_MASK       0x002B // Magic bits pulled from the BSD driver.
-                                                                  // Are listed as needed for TX/RX checksumming
-
-// NOTE: THESE SHOULD BE BROKEN DOWN INTO A SERIES OF BITS TO REPERSENT THE VARIOUS OPTIONS
-// AND THEN THE MASK SHOULD BE DEFINED TO BE AN OR OF THOSE BITS. THIS IS A QUICK HACK JOB.
-// See interrupts below for how this should be done
-#define RL_RX_CFG_MASK         0x0000E70F  // RXFTH: unlimited, MXDMA: unlimited, AAP: set (promisc. mode set)
-#define RL_TX_CFG_MASK         0x3000700  // IFG: normal, MXDMA: unlimited.  crc appended
-
-// Realtek interrupt bits
-#define RL_INT_SERR                    0x8000
-#define RL_INT_TIMEOUT         0x4000
-#define RL_INT_SWINT           0x0100
-#define RL_INT_TDU                     0x0080
-#define RL_INT_FOVW                    0x0040
-#define RL_INT_LINKCHG         0x0020
-#define RL_INT_RDU                     0x0010
-#define RL_INT_TERR                    0x0008
-#define RL_INT_TOK                     0x0004
-#define RL_INT_RERR                    0x0002
-#define RL_INT_ROK                     0x0001
-
-#define RL_INTERRUPT_MASK      RL_INT_LINKCHG | RL_INT_TOK | RL_INT_ROK | RL_INT_SWINT
-#define RL_INTRRUPT_CLEAR      0xFFFF
-
-// Realtek descriptor command bits
-#define DES_OWN_MASK           0x80000000
-#define DES_EOR_MASK           0x40000000
-#define DES_RX_SIZE_MASK       0x3FFF
-#define DES_FS_MASK                    0x20000000
-#define DES_LS_MASK                    0x10000000
-#define DES_MAR_MASK           0x08000000
-#define DES_PAM_MASK           0x04000000
-#define DES_BAR_MASK           0x02000000
-
-// TFor some reaosn the bits are in an undocumented position for our NIC
-// They should be part of the command field, at the commented addrs below. instead
-// they are part of the vlan field as stated below.
-//#define DES_TX_IP_CHK_MASK  0x40000
-//#define DES_TX_UDP_CHK_MASK 0x20000
-//#define DES_TX_TCP_CHK_MASK 0x10000
-#define DES_TX_IP_CHK_MASK  0x20000000
-#define DES_TX_UDP_CHK_MASK 0x80000000
-#define DES_TX_TCP_CHK_MASK 0x40000000
-
-// Offset used for indexing IRQs
-#define KERNEL_IRQ_OFFSET      32
-
-// Realtek Descriptor Related Sizing
-#define NUM_TX_DESCRIPTORS     1024
-#define NUM_RX_DESCRIPTORS     1024
-
-// !!!!!!!!! need to verify the 128byte nature of this field. Spec says it could be 32 for some chips.
-
-#define RL_TX_MAX_BUFFER_SIZE  ROUNDUP(MAX_FRAME_SIZE, 128)
-#define RL_RX_MAX_BUFFER_SIZE  ROUNDUP(MAX_FRAME_SIZE, 8)    // Might be able to be 4 less. Does it strip out the crc flag?
-
-#define RL_TX_MAX_SIZE         RL_TX_MAX_BUFFER_SIZE / 128
-#define RL_RX_MAX_SIZE         RL_RX_MAX_BUFFER_SIZE
-
-#define RL_DES_ALIGN   256
-#define RL_BUF_ALIGN   8
-
-// ^----- Good line ------^
-
-// v----- Evil line ------v
-
-char *CT(PACKET_HEADER_SIZE + len)
-rl8168_packet_wrap(const char *CT(len) data, size_t len);
-
-// ^----- Evil line ------^
-
-// v----- Good line ------v
-
-
-void rl8168_init(void);
-void rl8168_reset(void);
-void rl8168_interrupt_handler(trapframe_t *tf, void* data);
-int rl8168_scan_pci(void);
-void rl8168_read_mac(void);
-void rl8168_setup_interrupts(void);
-void rl8168_setup_descriptors(void);
-void rl8168_configure(void);
-void rl8168_handle_rx_packet(void);
-void rl8168_set_rx_descriptor(uint32_t des_num, uint8_t reset_buffer);
-void rl8168_set_tx_descriptor(uint32_t des_num);
-void rl8168_process_frame(char *CT(frame_size) frame_buffer,
-                          uint32_t frame_size, uint32_t command);
-int rl8168_send_frame(const char *CT(len) data, size_t len);
-
-#endif /* !ROS_INC_REALTEK_H */
diff --git a/kern/arch/i386/ros/hart.h b/kern/arch/i386/ros/hart.h
deleted file mode 100644 (file)
index 9eebfa7..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _ROS_ARCH_HART_H
-#define _ROS_ARCH_HART_H
-
-#ifndef ROS_KERNEL
-
-#include <ros/syscall.h>
-
-#define HART_CL_SIZE 64
-
-// this is how we get our thread id on entry.
-#define __hart_self_on_entry \
-({ \
-       register int temp asm ("eax"); \
-       temp; \
-})
-
-// The actual hart_self() function is a global symbol that invokes this routine.
-static inline int
-__hart_self()
-{
-       // TODO: use some kind of thread-local storage to speed this up!
-       return (int)ros_syscall(SYS_getvcoreid,0,0,0,0,0);
-}
-
-static inline void
-__hart_set_stack_pointer(void* sp)
-{
-       asm volatile ("mov %0,%%esp" : : "r"(sp) : "memory","esp");
-}
-
-static inline void
-__hart_relax()
-{
-       asm volatile ("pause" : : : "memory");
-}
-
-static inline int
-__hart_swap(int* addr, int val)
-{
-       asm volatile ("xchg %0, (%2)" : "=r"(val) : "0"(val),"r"(addr) : "memory");
-       return val;
-}
-
-#endif
-
-#endif
diff --git a/kern/arch/i386/ros/mmu.h b/kern/arch/i386/ros/mmu.h
deleted file mode 100644 (file)
index d076fe5..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _ROS_ARCH_MMU_H
-#define _ROS_ARCH_MMU_H
-
-// All physical memory mapped at this address
-#define KERNBASE        0xC0000000
-
-// Use this if needed in annotations
-#define IVY_KERNBASE (0xC000U << 16)
-
-#define PTSHIFT 22
-#define PTSIZE (1 << PTSHIFT)
-
-#define PGSHIFT 12
-#define PGSIZE (1 << PGSHIFT)
-
-#define JPGSIZE PTSIZE
-
-#endif
diff --git a/kern/arch/i386/ros/syscall.h b/kern/arch/i386/ros/syscall.h
deleted file mode 100644 (file)
index 46fd488..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef _ROS_ARCH_SYSCALL_H
-#define _ROS_ARCH_SYSCALL_H
-
-#define T_SYSCALL      0x80
-
-#ifndef ROS_KERNEL
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <ros/common.h>
-
-// TODO: fix sysenter to take all 5 params
-static inline intreg_t syscall_sysenter(uint16_t num, intreg_t a1,
-                                 intreg_t a2, intreg_t a3,
-                                 intreg_t a4, intreg_t a5)
-{
-       // TODO: Maybe think about this a little more.
-       // We just added code to push and pop 'ebx' because 
-       // when compiling glibc we were getting register allocation 
-       // errors.  Not happy with this, but it works.
-       intreg_t ret;
-       asm volatile ("  pushl %%ebp;        "
-                     "  pushl %%esi;        "
-                     "  pushl %%ebx;        "
-                     "  movl %%esp, %%ebp;  "
-                     "  movl %4, %%ebx;     "
-                     "  leal 1f, %%esi;     "
-                     "  sysenter;           "
-                     "1:                    "
-                     "  popl %%ebx;         "
-                     "  popl %%esi;         "
-                     "  popl %%ebp;         "
-                     : "=a" (ret)
-                     : "a" (num),
-                       "d" (a1),
-                       "c" (a2),
-                       "r" (a3),
-                       "D" (a4)
-                     : "cc", "memory");
-       return ret;
-}
-
-static inline intreg_t syscall_trap(uint16_t num, intreg_t a1,
-                             intreg_t a2, intreg_t a3,
-                             intreg_t a4, intreg_t a5)
-{
-       uint32_t ret;
-
-       // Generic system call: pass system call number in AX,
-       // up to five parameters in DX, CX, BX, DI, SI.
-       // Interrupt kernel with T_SYSCALL.
-       //
-       // The "volatile" tells the assembler not to optimize
-       // this instruction away just because we don't use the
-       // return value.
-       //
-       // The last clause tells the assembler that this can
-       // potentially change the condition codes and arbitrary
-       // memory locations.
-
-       asm volatile("int %1"
-                    : "=a" (ret)
-                    : "i" (T_SYSCALL),
-                      "a" (num),
-                      "d" (a1),
-                      "c" (a2),
-                      "b" (a3),
-                      "D" (a4),
-                      "S" (a5)
-                    : "cc", "memory");
-       return ret;
-}
-
-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
-               return syscall_trap(_num, _a0, _a1, _a2, _a3, _a4);
-       #endif
-}
-
-#endif
-
-#endif
-
diff --git a/kern/arch/i386/smp.c b/kern/arch/i386/smp.c
deleted file mode 100644 (file)
index ae50b13..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2009 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- */
-
-#ifdef __SHARC__
-//#pragma nosharc
-#endif
-
-#include <arch/arch.h>
-#include <arch/bitmask.h>
-#include <smp.h>
-
-#include <atomic.h>
-#include <ros/error.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include <pmap.h>
-#include <env.h>
-#include <trap.h>
-
-/* Lookup table for core_id and per_cpu_inf, indexed by real __core_id() */
-int hw_coreid_lookup[MAX_NUM_CPUS] = {[0 ... (MAX_NUM_CPUS - 1)] -1};
-int os_coreid_lookup[MAX_NUM_CPUS] = {[0 ... (MAX_NUM_CPUS - 1)] -1};
-
-/*************************** 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 (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)
-{
-       int8_t state = 0;
-       uint32_t wrapper_num;
-       handler_wrapper_t* wrapper;
-       extern atomic_t outstanding_calls;
-
-       // prevents us from ever having more than NUM_HANDLER_WRAPPERS callers in
-       // the process of competing for vectors.  not decremented until both after
-       // the while(1) loop and after it's been waited on.
-       atomic_inc(&outstanding_calls);
-       if (atomic_read(&outstanding_calls) > NUM_HANDLER_WRAPPERS) {
-               atomic_dec(&outstanding_calls);
-               return -EBUSY;
-       }
-
-       // assumes our cores are numbered in order
-       if ((type == 4) && (dest >= num_cpus))
-               panic("Destination CPU %d does not exist!", dest);
-
-       // build the mask based on the type and destination
-       INIT_CHECKLIST_MASK(cpu_mask, MAX_NUM_CPUS);
-       // set checklist mask's size dynamically to the num cpus actually present
-       cpu_mask.size = num_cpus;
-       switch (type) {
-               case 1: // self
-                       SET_BITMASK_BIT(cpu_mask.bits, core_id());
-                       break;
-               case 2: // all
-                       FILL_BITMASK(cpu_mask.bits, num_cpus);
-                       break;
-               case 3: // all but self
-                       FILL_BITMASK(cpu_mask.bits, num_cpus);
-                       CLR_BITMASK_BIT(cpu_mask.bits, core_id());
-                       break;
-               case 4: // physical mode
-                       // note this only supports sending to one specific physical id
-                       // (only sets one bit, so if multiple cores have the same phys id
-                       // the first one through will set this).
-                       SET_BITMASK_BIT(cpu_mask.bits, dest);
-                       break;
-               case 5: // logical mode
-                       // TODO
-                       warn("Logical mode bitmask handler protection not implemented!");
-                       break;
-               default:
-                       panic("Invalid type for cross-core function call!");
-       }
-
-       // Find an available vector/wrapper.  Starts with this core's id (mod the
-       // number of wrappers).  Walk through on conflict.
-       // Commit returns an error if it wanted to give up for some reason,
-       // like taking too long to acquire the lock or clear the mask, at which
-       // point, we try the next one.
-       // When we are done, wrapper points to the one we finally got.
-       // this wrapper_num trick doesn't work as well if you send a bunch in a row
-       // and wait, since you always check your main one (which is currently busy).
-       wrapper_num = core_id() % NUM_HANDLER_WRAPPERS;
-       while(1) {
-               wrapper = &handler_wrappers[wrapper_num];
-               if (!commit_checklist_wait(wrapper->cpu_list, &cpu_mask))
-                       break;
-               wrapper_num = (wrapper_num + 1) % NUM_HANDLER_WRAPPERS;
-               /*
-               uint32_t count = 0;
-               // instead of deadlock, smp_call can fail with this.  makes it harder
-               // to use (have to check your return value).  consider putting a delay
-               // here too (like if wrapper_num == initial_wrapper_num)
-               if (count++ > NUM_HANDLER_WRAPPERS * 1000) // note 1000 isn't enough...
-                       return -EBUSY;
-               */
-       }
-
-       // Wanting to wait is expressed by having a non-NULL handler_wrapper_t**
-       // passed in.  Pass out our reference to wrapper, to wait later.
-       //&