Changes ARCH i686 -> x86 (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 7 Jun 2013 21:40:38 +0000 (14:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 7 Jun 2013 21:45:45 +0000 (14:45 -0700)
Remove the installation XCC content, and rebuild your cross compiler.

133 files changed:
GETTING_STARTED
config-default
kern/arch/i686/Kbuild [deleted file]
kern/arch/i686/Kconfig [deleted file]
kern/arch/i686/Makefile [deleted file]
kern/arch/i686/apic.c [deleted file]
kern/arch/i686/apic.h [deleted file]
kern/arch/i686/arch.h [deleted file]
kern/arch/i686/atomic.h [deleted file]
kern/arch/i686/bitmask.h [deleted file]
kern/arch/i686/boot/Makefrag [deleted file]
kern/arch/i686/boot/boot.S [deleted file]
kern/arch/i686/boot/main.c [deleted file]
kern/arch/i686/boot/sign.pl [deleted file]
kern/arch/i686/colored_caches.c [deleted file]
kern/arch/i686/colored_page_alloc.h [deleted file]
kern/arch/i686/configs/defconfig [deleted symlink]
kern/arch/i686/console.c [deleted file]
kern/arch/i686/console.h [deleted file]
kern/arch/i686/cpuinfo.c [deleted file]
kern/arch/i686/endian.h [deleted file]
kern/arch/i686/entry.S [deleted file]
kern/arch/i686/env.c [deleted file]
kern/arch/i686/frontend.c [deleted file]
kern/arch/i686/frontend.h [deleted file]
kern/arch/i686/init.c [deleted file]
kern/arch/i686/init.h [deleted file]
kern/arch/i686/ioapic.c [deleted file]
kern/arch/i686/ioapic.h [deleted file]
kern/arch/i686/kbdreg.h [deleted file]
kern/arch/i686/kclock.c [deleted file]
kern/arch/i686/kdebug.c [deleted file]
kern/arch/i686/kdebug.h [deleted file]
kern/arch/i686/kernel.ld [deleted file]
kern/arch/i686/mmu.h [deleted file]
kern/arch/i686/mptables.c [deleted file]
kern/arch/i686/mptables.h [deleted file]
kern/arch/i686/page_alloc.c [deleted file]
kern/arch/i686/pci.c [deleted file]
kern/arch/i686/pci.h [deleted file]
kern/arch/i686/pci_defs.h [deleted file]
kern/arch/i686/perfmon.c [deleted file]
kern/arch/i686/perfmon.h [deleted file]
kern/arch/i686/pmap.c [deleted file]
kern/arch/i686/process.c [deleted file]
kern/arch/i686/rdtsc_test.c [deleted file]
kern/arch/i686/ros/arch.h [deleted file]
kern/arch/i686/ros/bits/syscall.h [deleted file]
kern/arch/i686/ros/membar.h [deleted file]
kern/arch/i686/ros/mmu.h [deleted file]
kern/arch/i686/ros/syscall.h [deleted file]
kern/arch/i686/ros/trapframe.h [deleted file]
kern/arch/i686/smp.c [deleted file]
kern/arch/i686/smp.h [deleted file]
kern/arch/i686/smp_boot.c [deleted file]
kern/arch/i686/smp_entry.S [deleted file]
kern/arch/i686/time.h [deleted file]
kern/arch/i686/trap.c [deleted file]
kern/arch/i686/trap.h [deleted file]
kern/arch/i686/trapentry.S [deleted file]
kern/arch/i686/types.h [deleted file]
kern/arch/i686/x86.h [deleted file]
kern/arch/x86/Kbuild [new file with mode: 0644]
kern/arch/x86/Kconfig [new file with mode: 0644]
kern/arch/x86/Makefile [new file with mode: 0644]
kern/arch/x86/apic.c [new file with mode: 0644]
kern/arch/x86/apic.h [new file with mode: 0644]
kern/arch/x86/arch.h [new file with mode: 0644]
kern/arch/x86/atomic.h [new file with mode: 0644]
kern/arch/x86/bitmask.h [new file with mode: 0644]
kern/arch/x86/boot/Makefrag [new file with mode: 0644]
kern/arch/x86/boot/boot.S [new file with mode: 0644]
kern/arch/x86/boot/main.c [new file with mode: 0644]
kern/arch/x86/boot/sign.pl [new file with mode: 0644]
kern/arch/x86/colored_caches.c [new file with mode: 0644]
kern/arch/x86/colored_page_alloc.h [new file with mode: 0644]
kern/arch/x86/configs/defconfig [new symlink]
kern/arch/x86/console.c [new file with mode: 0644]
kern/arch/x86/console.h [new file with mode: 0644]
kern/arch/x86/cpuinfo.c [new file with mode: 0644]
kern/arch/x86/endian.h [new file with mode: 0644]
kern/arch/x86/entry.S [new file with mode: 0644]
kern/arch/x86/env.c [new file with mode: 0644]
kern/arch/x86/frontend.c [new file with mode: 0644]
kern/arch/x86/frontend.h [new file with mode: 0644]
kern/arch/x86/init.c [new file with mode: 0644]
kern/arch/x86/init.h [new file with mode: 0644]
kern/arch/x86/ioapic.c [new file with mode: 0644]
kern/arch/x86/ioapic.h [new file with mode: 0644]
kern/arch/x86/kbdreg.h [new file with mode: 0644]
kern/arch/x86/kclock.c [new file with mode: 0644]
kern/arch/x86/kdebug.c [new file with mode: 0644]
kern/arch/x86/kdebug.h [new file with mode: 0644]
kern/arch/x86/kernel.ld [new file with mode: 0644]
kern/arch/x86/mmu.h [new file with mode: 0644]
kern/arch/x86/mptables.c [new file with mode: 0644]
kern/arch/x86/mptables.h [new file with mode: 0644]
kern/arch/x86/page_alloc.c [new file with mode: 0644]
kern/arch/x86/pci.c [new file with mode: 0644]
kern/arch/x86/pci.h [new file with mode: 0644]
kern/arch/x86/pci_defs.h [new file with mode: 0644]
kern/arch/x86/perfmon.c [new file with mode: 0644]
kern/arch/x86/perfmon.h [new file with mode: 0644]
kern/arch/x86/pmap.c [new file with mode: 0644]
kern/arch/x86/process.c [new file with mode: 0644]
kern/arch/x86/rdtsc_test.c [new file with mode: 0644]
kern/arch/x86/ros/arch.h [new file with mode: 0644]
kern/arch/x86/ros/bits/syscall.h [new file with mode: 0644]
kern/arch/x86/ros/membar.h [new file with mode: 0644]
kern/arch/x86/ros/mmu.h [new file with mode: 0644]
kern/arch/x86/ros/syscall.h [new file with mode: 0644]
kern/arch/x86/ros/trapframe.h [new file with mode: 0644]
kern/arch/x86/smp.c [new file with mode: 0644]
kern/arch/x86/smp.h [new file with mode: 0644]
kern/arch/x86/smp_boot.c [new file with mode: 0644]
kern/arch/x86/smp_entry.S [new file with mode: 0644]
kern/arch/x86/time.h [new file with mode: 0644]
kern/arch/x86/trap.c [new file with mode: 0644]
kern/arch/x86/trap.h [new file with mode: 0644]
kern/arch/x86/trapentry.S [new file with mode: 0644]
kern/arch/x86/types.h [new file with mode: 0644]
kern/arch/x86/x86.h [new file with mode: 0644]
tools/compilers/gcc-glibc/Makefile
user/parlib/i686/vcore.c [deleted file]
user/parlib/include/i686/arch.h [deleted file]
user/parlib/include/i686/atomic.h [deleted file]
user/parlib/include/i686/bitmask.h [deleted file]
user/parlib/include/i686/vcore.h [deleted file]
user/parlib/include/x86/arch.h [new file with mode: 0644]
user/parlib/include/x86/atomic.h [new file with mode: 0644]
user/parlib/include/x86/bitmask.h [new file with mode: 0644]
user/parlib/include/x86/vcore.h [new file with mode: 0644]
user/parlib/x86/vcore.c [new file with mode: 0644]

index 27ba550..b10effb 100644 (file)
@@ -34,11 +34,11 @@ The first step is to configure the kernel.  config, menuconfig, and some of the
 other KBuild targets work.  Defconfig gives you a default configuration.  For
 example, to config for 32 bit x86:
 
-$ make ARCH=i686 defconfig
+$ make ARCH=x86 defconfig
 
 Alternatively, you can run menuconfig to customize what settings you want:
 
-$ make ARCH=i686 menuconfig
+$ make ARCH=x86 menuconfig
 
 There are a lot of settings in here, which you should browse through to decide
 what you want to enable/disable.
index eb66e05..6fd0b75 100644 (file)
@@ -1,8 +1,6 @@
 # default config.  While this is x86 specific, when config'd for RISCV, the x86
 # specific items will be ignored.
 #
-# Akaros/i686 Kernel Configuration
-#
 CONFIG_X86=y
 
 #
diff --git a/kern/arch/i686/Kbuild b/kern/arch/i686/Kbuild
deleted file mode 100644 (file)
index e0713b7..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-obj-y                                          += apic.o
-obj-y                                          += colored_caches.o
-obj-y                                          += console.o
-obj-y                                          += cpuinfo.o
-obj-y                                          += entry.o
-obj-y                                          += env.o
-obj-y                                          += frontend.o
-obj-y                                          += init.o
-obj-y                                          += ioapic.o
-obj-y                                          += kclock.o
-obj-y                                          += kdebug.o
-obj-y                                          += mptables.o
-obj-y                                          += page_alloc.o
-obj-y                                          += pci.o
-obj-y                                          += perfmon.o
-obj-y                                          += pmap.o
-obj-y                                          += process.o
-obj-y                                          += rdtsc_test.o
-obj-y                                          += smp.o
-obj-y                                          += smp_boot.o
-obj-y                                          += smp_entry.o
-obj-y                                          += trap.o
-obj-y                                          += trapentry.o
diff --git a/kern/arch/i686/Kconfig b/kern/arch/i686/Kconfig
deleted file mode 100644 (file)
index b18407b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-config X86
-       def_bool y
-
-menu "x86 Hacks"
-
-config PCI_VERBOSE
-       bool "Verbose PCI Output"
-       default n
-       help
-               Will print out extra information related to PCI.
-
-config NOMTRRS
-       bool "Disable MTRRs"
-       default n
-       help
-               Old debug option from when we were having issues with MTRRs.  If your
-               machine won't boot, try turning this on.
-
-config ENABLE_MPTABLES
-       bool "Enable MP Tables"
-       default n
-       help
-               Turns on basic MP tables support.  If you want to route IRQs, you'll
-               need this, until we get around to parsing ACPI tables.
-
-config KB_CORE0_ONLY
-       bool "Keyboard from core0 only"
-       default n
-       help
-               Say 'n' unless you are using a buggy x86 machine that can't handle
-               polling the keyboard PIO from cores other than core 0.
-
-endmenu
diff --git a/kern/arch/i686/Makefile b/kern/arch/i686/Makefile
deleted file mode 100644 (file)
index 3df576d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-CROSS_COMPILE := i686-ros-
diff --git a/kern/arch/i686/apic.c b/kern/arch/i686/apic.c
deleted file mode 100644 (file)
index 06ec86b..0000000
+++ /dev/null
@@ -1,313 +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 <time.h>
-#include <assert.h>
-#include <stdio.h>
-#include <bitmask.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
- * Check osdev for a more thorough explanation/implementation.
- * http://bochs.sourceforge.net/techspec/PORTS.LST  */
-void pic_remap() 
-{
-       /* start initialization (ICW1) */
-       outb(PIC1_CMD, 0x11);
-       outb(PIC2_CMD, 0x11);
-       /* set new offsets (ICW2) */
-       outb(PIC1_DATA, PIC1_OFFSET);
-       outb(PIC2_DATA, PIC2_OFFSET);
-       /* set up cascading (ICW3) */
-       outb(PIC1_DATA, 0x04);
-       outb(PIC2_DATA, 0x02);
-       /* other stuff (put in 8086/88 mode, or whatever) (ICW4) */
-       outb(PIC1_DATA, 0x01);
-       outb(PIC2_DATA, 0x01);
-       /* Init done, further data R/W access the interrupt mask */
-       /* 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));
-}
-
-/* Aka, the IMR.  Simply reading the data port are OCW1s. */
-uint16_t pic_get_mask(void)
-{
-       return (inb(PIC2_DATA) << 8) | inb(PIC1_DATA);
-}
-
-static uint16_t __pic_get_irq_reg(int ocw3)
-{
-       /* OCW3 to PIC CMD to get the register values.  PIC2 is chained, and
-        * represents IRQs 8-15.  PIC1 is IRQs 0-7, with 2 being the chain */
-       outb(PIC1_CMD, ocw3);
-       outb(PIC2_CMD, ocw3);
-       return (inb(PIC2_CMD) << 8) | inb(PIC1_CMD);
-}
-
-/* Returns the combined value of the cascaded PICs irq request register */
-uint16_t pic_get_irr(void)
-{
-       return __pic_get_irq_reg(PIC_READ_IRR);
-}
-
-/* Returns the combined value of the cascaded PICs irq service register */
-uint16_t pic_get_isr(void)
-{
-       return __pic_get_irq_reg(PIC_READ_ISR);
-}
-
-/* Debugging helper.  Note the ISR/IRR are 32 bits at a time, spaced every 16
- * bytes in the LAPIC address space. */
-void lapic_print_isr(void)
-{
-       printk("LAPIC ISR on core %d\n--------------\n", core_id());
-       for (int i = 7; i >= 0; i--)
-               printk("%3d-%3d: %p\n", (i + 1) * 32 - 1, i * 32,
-                      *(uint32_t*)(LAPIC_ISR + i * 0x10));
-       printk("LAPIC IRR on core %d\n--------------\n", core_id());
-       for (int i = 7; i >= 0; i--)
-               printk("%3d-%3d: %p\n", (i + 1) * 32 - 1, i * 32,
-                      *(uint32_t*)(LAPIC_IRR + i * 0x10));
-}
-
-/* Returns TRUE if the bit 'vector' is set in the LAPIC ISR or IRR (whatever you
- * pass in.  These registers consist of 8, 32 byte registers spaced every 16
- * bytes from the base in the LAPIC. */
-static bool __lapic_get_isrr_bit(uint32_t base, uint8_t vector)
-{
-       int which_reg = vector >> 5;    /* 32 bits per reg */
-       uint32_t *lapic_reg = (uint32_t*)(base + which_reg * 0x10);     /* offset 16 */
-       return (*lapic_reg & (1 << (vector % 32)) ? 1 : 0);
-}
-
-bool lapic_get_isr_bit(uint8_t vector)
-{
-       return __lapic_get_isrr_bit(LAPIC_ISR, vector);
-}
-
-bool lapic_get_irr_bit(uint8_t vector)
-{
-       return __lapic_get_isrr_bit(LAPIC_IRR, vector);
-}
-
-/* This works for any interrupt that goes through the LAPIC, but not things like
- * ExtInts.  To prevent abuse, we'll use it just for IPIs for now (which only
- * come via the APIC).
- *
- * Note that if you call this from an interrupt handler for 'vector' before you
- * EOI, the ISR will show your bit as set.  It is the EOI that clears the bit
- * from the ISR. */
-bool ipi_is_pending(uint8_t vector)
-{
-       return lapic_get_isr_bit(vector) || lapic_get_isr_bit(vector);
-}
-
-/*
- * 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)
-{
-       /* If we overflowed a uint32, send in the max timer possible.  The lapic can
-        * only handle a 32 bit.  We could muck with changing the divisor, but even
-        * then, we might not be able to match 4000 sec (based on the bus speed).
-        * The kernel alarm code can handle spurious timer interrupts, so we just
-        * set the timer for as close as we can get to the desired time. */
-       uint64_t ticks64 = (usec * system_timing.bus_freq) / LAPIC_TIMER_DIVISOR_VAL
-                           / 1000000;
-       uint32_t ticks32 = ((ticks64 >> 32) ? 0xffffffff : ticks64);
-       assert(ticks32 > 0);
-       __lapic_set_timer(ticks32, LAPIC_TIMER_DEFAULT_VECTOR, periodic,
-                         LAPIC_TIMER_DIVISOR_BITS);
-}
-
-void set_core_timer(uint32_t usec, bool periodic)
-{
-       if (usec)
-               lapic_set_timer(usec, periodic);
-       else
-               lapic_disable_timer();
-}
-
-uint32_t lapic_get_default_id(void)
-{
-       uint32_t ebx;
-       cpuid(0x1, 0x0, 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_DIVISOR_BITS);
-       // 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 = (timercount[0] - timercount[1])
-                                * LAPIC_TIMER_DIVISOR_VAL;
-       /* The time base for the timer is derived from the processor's bus clock,
-        * divided by the value specified in the divide configuration register.
-        * Note we mult and div by the divisor, saving the actual freq (even though
-        * we don't use it yet). */
-       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/time.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 + usec2tsc(usec);
-        //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/i686/apic.h b/kern/arch/i686/apic.h
deleted file mode 100644 (file)
index 47dec11..0000000
+++ /dev/null
@@ -1,299 +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 (8259A)
- * When looking at the specs, A0 is our CMD line, and A1 is the DATA line.  This
- * means that blindly writing to PIC1_DATA is an OCW1 (interrupt masks).  When
- * writing to CMD (A0), the chip can determine betweeb OCW2 and OCW3 by the
- * setting of a few specific bits (OCW2 has bit 3 unset, OCW3 has it set). */
-#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 PIC1_SPURIOUS                          (7 + PIC1_OFFSET)
-#define PIC2_SPURIOUS                          (7 + PIC2_OFFSET)
-#define PIC_EOI                                                0x20    /* OCW2 EOI */
-/* These set the next CMD read to return specific values.  Note that the chip
- * remembers what setting we had before (IRR or ISR), if you do other reads of
- * CMD. (not tested, written in the spec sheet) */
-#define PIC_READ_IRR                           0x0a    /* OCW3 irq ready next CMD read */
-#define PIC_READ_ISR                           0x0b    /* OCW3 irq service next CMD read */
-
-// Local APIC
-/* PBASE is the physical address.  It is mapped in at the VADDR LAPIC_BASE */
-#define LAPIC_PBASE                                    0xfee00000 /* default *physical* address */
-#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            /* Aka 235, IRQ203 */
-/* Quick note on the divisor.  The LAPIC timer ticks once per divisor-bus ticks
- * (system bus or APIC bus, depending on the model).  Ex: A divisor of 128 means
- * 128 bus ticks results in 1 timer tick.  The divisor increases the time range
- * and decreases the granularity of the timer.  Numbers are appx, based on 4
- * billion ticks, vs 2^32 ticks.
- * Ex:   1GHz bus, div 001:    4sec max,    1ns granularity
- * Ex:   1GHz bus, div 128:  512sec max,  128ns granularity
- * Ex: 100MHz bus, div 001:   40sec max,   10ns granularity
- * Ex: 100MHz bus, div 128: 5120sec max, 1280ns granularity */
-#define LAPIC_TIMER_DIVISOR_VAL                32      /* seems reasonable */
-#define LAPIC_TIMER_DIVISOR_BITS       0x8     /* Div = 32 */
-
-// IPI Interrupt Command Register
-#define LAPIC_IPI_ICR_LOWER                    (LAPIC_BASE + 0x300)
-#define LAPIC_IPI_ICR_UPPER                    (LAPIC_BASE + 0x310)
-/* Interrupts being serviced (in-service) and pending (interrupt request reg).
- * Note these registers are not normal bitmaps, but instead are 8 separate
- * 32-bit registers, spaced/aligned on 16 byte boundaries in the LAPIC address
- * space. */
-#define LAPIC_ISR                                      (LAPIC_BASE + 0x100)
-#define LAPIC_IRR                                      (LAPIC_BASE + 0x200)
-
-// 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;
-       uint64_t timing_overhead;
-       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);
-uint16_t pic_get_mask(void);
-uint16_t pic_get_irr(void);
-uint16_t pic_get_isr(void);
-bool lapic_get_isr_bit(uint8_t vector);
-bool lapic_get_irr_bit(uint8_t vector);
-void lapic_print_isr(void);
-bool ipi_is_pending(uint8_t vector);
-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);
-static inline void __send_nmi(uint8_t hw_coreid);
-
-#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)
-{
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4500);
-       lapic_wait_to_send();
-}
-
-static inline void send_startup_ipi(uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4600 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void send_self_ipi(uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00044000 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void send_broadcast_ipi(uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00084000 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void send_all_others_ipi(uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x000c4000 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void __send_ipi(uint8_t hw_coreid, uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_coreid << 24);
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00004000 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void send_group_ipi(uint8_t hw_groupid, uint8_t vector)
-{
-       write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_groupid << 24);
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00004800 | vector);
-       lapic_wait_to_send();
-}
-
-static inline void __send_nmi(uint8_t hw_coreid)
-{
-       if (hw_coreid == 255)
-               return;
-       write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_coreid << 24);
-       write_mmreg32(LAPIC_IPI_ICR_LOWER, 0x00004400);
-       lapic_wait_to_send();
-}
-
-/* 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/i686/arch.h b/kern/arch/i686/arch.h
deleted file mode 100644 (file)
index d854a1f..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-#ifndef ROS_INC_ARCH_H
-#define ROS_INC_ARCH_H
-
-#include <ros/arch/arch.h>
-#include <ros/common.h>
-#include <arch/x86.h>
-#include <arch/apic.h>
-
-/* Arch Constants */
-#define ARCH_CL_SIZE                            64
-/* Top of the kernel virtual mapping area (KERNBASE) */
-/* For sanity reasons, I don't plan to map the top page */
-#define KERN_VMAP_TOP                          0xfffff000
-
-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 void icache_flush_page(void* va, void* kva) __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(uint32_t 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));
-
-/* in trap.c */
-void send_ipi(uint32_t os_coreid, uint8_t vector);
-/* in cpuinfo.c */
-void print_cpuinfo(void);
-void show_mapping(uintptr_t start, size_t size);
-
-/* 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 void
-icache_flush_page(void* va, void* kva)
-{
-       // x86 handles self-modifying code (mostly) without SW support
-}
-
-static __inline uint64_t
-read_tsc(void)
-{
-       uint64_t tsc;
-       __asm __volatile("rdtsc" : "=A" (tsc));
-       return tsc;
-}
-
-/* non-core-id reporting style (it is in ecx) */
-static __inline uint64_t
-read_tscp(void)
-{
-       uint64_t tsc;
-       __asm __volatile("rdtscp" : "=A" (tsc) : : "ecx");
-       return tsc;
-}
-
-/* Check out k/a/i686/rdtsc_test.c for more info */
-static __inline uint64_t 
-read_tsc_serialized(void)
-{
-       asm volatile("lfence"); /* mfence on amd */
-       return read_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();
-}
-
-/* This doesn't atomically enable interrupts and then halt, like we want, so
- * x86 needs to use a custom helper in the irq handler in trap.c. */
-static __inline void
-cpu_halt(void)
-{
-       asm volatile("sti; 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(uint32_t 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/i686/atomic.h b/kern/arch/i686/atomic.h
deleted file mode 100644 (file)
index 839cb3e..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Copyright (c) 2009-2011 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- *
- * x86 atomics and locking functions. */
-
-#ifndef ROS_KERN_ARCH_ATOMIC_H
-#define ROS_KERN_ARCH_ATOMIC_H
-
-#include <ros/common.h>
-#include <ros/arch/membar.h>
-#include <arch/x86.h>
-#include <arch/arch.h>
-
-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);
-
-/* Inlined functions declared above */
-static inline void atomic_init(atomic_t *number, long val)
-{
-       asm volatile("movl %1,%0" : "=m"(*number) : "r"(val));
-}
-
-static inline long atomic_read(atomic_t *number)
-{
-       long val;
-       asm volatile("movl %1,%0" : "=r"(val) : "m"(*number));
-       return val;
-}
-
-static inline void atomic_set(atomic_t *number, long val)
-{
-       asm volatile("movl %1,%0" : "=m"(*number) : "r"(val));
-}
-
-static inline void atomic_add(atomic_t *number, long val)
-{
-       asm volatile("lock addl %1,%0" : "=m"(*number) : "r"(val) : "cc");
-}
-
-// 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)
-{
-       // for instance, this doesn't work:
-       //asm volatile("lock decl (%0)" : "=r"(number) : : "cc");
-       asm volatile("lock decl %0" : "=m"(*number) : : "cc");
-}
-
-/* Adds val to number, returning number's original value */
-static inline long atomic_fetch_and_add(atomic_t *number, long val)
-{
-       asm volatile("lock xadd %0,%1" : "=r"(val), "=m"(*number)
-                                      : "0"(val), "m"(*number)
-                                      : "cc" );
-       return val;
-}
-
-static inline void atomic_and(atomic_t *number, long mask)
-{
-       asm volatile("lock andl %1,%0" : "=m"(*number) : "q"(mask) : "cc");
-}
-
-static inline void atomic_or(atomic_t *number, long mask)
-{
-       asm volatile("lock orl %1,%0" : "=m"(*number) : "q"(mask) : "cc");
-}
-
-static inline long atomic_swap(atomic_t *addr, long val)
-{
-       // this would work, but its code is bigger, and it's not like the others
-       //asm volatile("xchgl %0,(%2)" : "=r"(val) : "0"(val), "r"(addr) : "memory");
-       asm volatile("xchgl %0,%1" : "=r"(val), "=m"(*addr) : "0"(val), "m"(*addr));
-       return val;
-}
-
-/* reusing exp_val for the bool return.  1 (TRUE) for success (like test).  Need
- * to zero eax, since it will get set if the cmpxchgl failed. */
-static inline bool atomic_cas(atomic_t *addr, long exp_val, long new_val)
-{
-       asm volatile("lock cmpxchgl %4,%1; movl $0,%%eax; sete %%al"
-                    : "=a"(exp_val), "=m"(*addr)
-                    : "m"(*addr), "a"(exp_val), "r"(new_val)
-                    : "cc", "memory");
-       return exp_val;
-}
-
-static inline bool atomic_cas_ptr(void **addr, void *exp_val, void *new_val)
-{
-       return atomic_cas((atomic_t*)addr, (long)exp_val, (long)new_val);
-}
-
-static inline bool atomic_cas_u32(uint32_t *addr, uint32_t exp_val,
-                                  uint32_t new_val)
-{
-       return atomic_cas((atomic_t*)addr, (long)exp_val, (long)new_val);
-}
-
-/* Adds val to number, so long as number was not zero.  Returns TRUE if the
- * operation succeeded (added, not zero), returns FALSE if number is zero. */
-static inline bool atomic_add_not_zero(atomic_t *number, long val)
-{
-       long old_num, new_num;
-       do {
-               old_num = atomic_read(number);
-               if (!old_num)
-                       return FALSE;
-               new_num = old_num + val;
-       } while (!atomic_cas(number, old_num, new_num));
-       return TRUE;
-}
-
-/* Subtraces val from number, returning True if the new value is 0. */
-static inline bool atomic_sub_and_test(atomic_t *number, long val)
-{
-       bool b;
-       asm volatile("lock sub %2,%1; setz %0" : "=q"(b), "=m"(*number)
-                                              : "r"(val), "m"(*number)
-                                              : "cc" );
-       return b;
-}
-
-/* Be sure to use "q" for byte operations (compared to longs), since this
- * constrains the asm to use e{a,b,c,d}x instead of esi and edi.  32 bit x86
- * cannot access the lower parts of esi or edi (will get warnings like "no such
- * register %sil or %dil." */
-static inline void atomic_andb(volatile uint8_t RACY*number, uint8_t mask)
-{
-       asm volatile("lock andb %1,%0" : "=m"(*number) : "q"(mask) : "cc");
-}
-
-static inline void atomic_orb(volatile uint8_t RACY*number, uint8_t mask)
-{
-       asm volatile("lock orb %1,%0" : "=m"(*number) : "q"(mask) : "cc");
-}
-
-static inline bool spin_locked(spinlock_t *lock)
-{
-       // the lock status is the lowest byte of the lock
-       return lock->rlock & 0xff;
-}
-
-static inline void __spin_lock_raw(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");
-       cmb();  /* need cmb(), the CPU mb() was handled by the xchg */
-}
-
-static inline void __spin_lock(spinlock_t *lock)
-{
-       __spin_lock_raw(&lock->rlock);
-}
-
-static inline void __spin_unlock(spinlock_t *lock)
-{
-       /* Need to prevent the compiler from reordering older stores. */
-       wmb();
-       rwmb(); /* x86 makes both of these a cmb() */
-       lock->rlock = 0;
-}
-
-static inline void __spinlock_init(spinlock_t *lock)
-{
-       lock->rlock = 0;
-}
-
-#endif /* ROS_KERN_ARCH_ATOMIC_H */
diff --git a/kern/arch/i686/bitmask.h b/kern/arch/i686/bitmask.h
deleted file mode 100644 (file)
index abb8a94..0000000
+++ /dev/null
@@ -1,113 +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"); \
-}
-
-#endif /* ROS_ARCH_BITMASK_H */
diff --git a/kern/arch/i686/boot/Makefrag b/kern/arch/i686/boot/Makefrag
deleted file mode 100644 (file)
index 3ee21b1..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/i686/boot/boot.S b/kern/arch/i686/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/i686/boot/main.c b/kern/arch/i686/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/i686/boot/sign.pl b/kern/arch/i686/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/i686/colored_caches.c b/kern/arch/i686/colored_caches.c
deleted file mode 100644 (file)
index 844ebaa..0000000
+++ /dev/null
@@ -1,56 +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 <error.h>
-#include <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;
-#ifdef CONFIG_BOXBORO
-       /* level (ignoring L1I), size, ways, CL size) */
-       init_cache_properties(&l1,   32,  8, 64);       /* 1 color */
-       init_cache_properties(&l2,  256,  8, 64);       /* 16 colors */
-       init_cache_properties(&l3, 24576, 24, 64);      /* 256 colors */
-#else /* Core i7 */
-       init_cache_properties(&l1,   32,  8, 64);       /* 1 color */
-       init_cache_properties(&l2,  256,  8, 64);       /* 16 colors */
-       init_cache_properties(&l3, 8192, 16, 64);       /* 128 colors */
-#endif /* CONFIG_E1000_ON_BOXBORO */
-       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/i686/colored_page_alloc.h b/kern/arch/i686/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/i686/configs/defconfig b/kern/arch/i686/configs/defconfig
deleted file mode 120000 (symlink)
index b98ff45..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../../../../config-default
\ No newline at end of file
diff --git a/kern/arch/i686/console.c b/kern/arch/i686/console.c
deleted file mode 100644 (file)
index 5ce619c..0000000
+++ /dev/null
@@ -1,687 +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 <sys/queue.h>
-
-#include <ros/memlayout.h>
-
-/***** Serial I/O code *****/
-
-#define COM1                   0x3F8   /* irq 4 */
-#define COM2                   0x2F8   /* irq 3 */
-#define COM3                   0x3E8   /* irq 4 */
-#define COM4                   0x2E8   /* irq 3 */
-
-#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_MCR_GLB_IRQ 0x08    /* global irq controlled via MCR */
-#define COM_LSR                        5               // In:  Line Status Register
-#define COM_LSR_DATA   0x01    //   Data available
-#define COM_LSR_READY  0x20    //   Ready to send
-#define COM_SCRATCH            7               /* Scratch register */
-
-/* List of all initialized console devices */
-struct cons_dev_slist cdev_list = SLIST_HEAD_INITIALIZER(cdev_list);
-/* need to statically allocate these, since cons_init is called so damn early */
-struct cons_dev com1, com2, com3, com4, kb;
-
-static int __serial_get_char(int com, uint8_t *data)
-{
-       if (!(inb(com + COM_LSR) & COM_LSR_DATA))
-               return -1;
-       *data = inb(com + COM_RX);
-       return 0;
-}
-
-static int serial_get_char(struct cons_dev *cdev, uint8_t *data)
-{
-       return __serial_get_char(cdev->val, data);
-}
-
-static void __serial_put_char(int com, uint8_t c)
-{
-       while (!(inb(com + COM_LSR) & COM_LSR_READY))
-               cpu_relax();
-       outb(com, c);
-}
-
-/* Writes c (or some variant of) to the serial cdev */
-static void serial_put_char(struct cons_dev *cdev, uint8_t c)
-{
-       assert(cdev->type == CONS_SER_DEV);
-       /* We do some funky editing of a few chars, to suit what minicom seems to
-        * expect (at least for brho). */
-       switch (c & 0xff) {
-               case '\b':
-               case 0x7f:
-               #ifdef CONFIG_PRINTK_NO_BACKSPACE
-                       __serial_put_char(cdev->val, (uint8_t)('^'));
-                       __serial_put_char(cdev->val, (uint8_t)('H'));
-               #else
-                       __serial_put_char(cdev->val, '\b');
-                       __serial_put_char(cdev->val, (uint8_t)(' '));
-                       __serial_put_char(cdev->val, '\b');
-               #endif /* CONFIG_PRINTK_NO_BACKSPACE */
-                       break;
-               case '\n':
-               case '\r':
-                       __serial_put_char(cdev->val, (uint8_t)('\n'));
-                       __serial_put_char(cdev->val, (uint8_t)('\r'));
-                       break;
-               default:
-                       __serial_put_char(cdev->val, (uint8_t)(c & 0xff));
-                       break;
-       }
-}
-
-/* Writes c to every initialized serial port */
-static void serial_spam_char(int c)
-{
-       struct cons_dev *i;
-       SLIST_FOREACH(i, &cdev_list, next) {
-               if (i->type == CONS_SER_DEV)
-                       serial_put_char(i, c);
-       }
-}
-
-/* http://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming \
- * #Software_Identification_of_the_UART
- *
- * We return 0 for unknown (probably not there), and the char * o/w */
-static char *__serial_detect_type(int com)
-{
-       uint8_t val;
-       char *model = 0;
-       /* First, check that the port actually exists.  I haven't seen any
-        * documentation of the LSR 0xff check, but it seems to work on qemu and
-        * hardware (brho's nehalem).  Perhaps 0xff is the default state for
-        * 'unmapped' ports. */
-       /* Serial port doesn't exist if COM_LSR returns 0xff */
-       if (inb(com + COM_LSR) == 0xff)
-               return model;
-       /* Try to set FIFO, then based on the bits enabled, we can tell what model
-        * it is */
-       outb(com + COM_FCR, 0xe7);
-       val = inb(com + COM_IIR);
-       if (val & (1 << 6)) {
-               if (val & (1 << 7)) {
-                       if (val & (1 << 5))
-                               model = "UART 16750";
-                       else
-                               model = "UART 16550A";
-               } else {
-                       model = "UART 16550";
-               }
-       } else {
-               /* no FIFO at all.  the 8250 had a buggy scratch register. */
-               outb(com + COM_SCRATCH, 0x2a);
-               val = inb(com + COM_SCRATCH);
-               if (val == 0x2a)
-                       model = "UART 16450";
-               else
-                       model = "UART 8250";
-       }
-       return model;
-}
-
-/* Helper: attempts to initialize the serial device cdev with COM com.  If it
- * succeeds, the cdev will be on the cdev_list. */ 
-static void serial_com_init(struct cons_dev *cdev, int com)
-{
-       cdev->model = __serial_detect_type(com);
-       /* Bail if detection failed */
-       if (!cdev->model)
-               return;
-       /* Set up the struct */
-       cdev->type = CONS_SER_DEV;
-       cdev->val = com;
-       switch (com) {
-               case (COM1):
-               case (COM3):
-                       cdev->irq = 4;
-                       break;
-               case (COM2):
-               case (COM4):
-                       cdev->irq = 3;
-                       break;
-               default:
-                       /* not that printing is the safest thing right now... */
-                       panic("Unknown COM %d", com);
-       }
-       cdev->getc = serial_get_char;
-       /* Turn off the FIFO (not sure this is needed) */
-       outb(com + COM_FCR, 0);
-       /* Set speed; requires DLAB latch */
-       outb(com + COM_LCR, COM_LCR_DLAB);
-       /* Setting speed to 115200 (setting the divider to 1) */
-       outb(com + COM_DLL, 1);
-       outb(com + COM_DLM, 0);
-       /* 8 data bits, 1 stop bit, parity off; turn off DLAB latch */
-       outb(com + COM_LCR, COM_LCR_WLEN8 & ~COM_LCR_DLAB);
-       /* This should turn on hardware flow control and make sure the global irq
-        * bit is on.  This bit is definitely used some hardware's 16550As, though
-        * not for qemu.  Also, on both qemu and hardware, this whole line is a
-        * noop, since the COM_MCR is already 0x0b, so we're just making sure the
-        * three bits are still turned on (and leaving other bits unchanged) */
-       outb(com + COM_MCR, inb(com + COM_MCR) | COM_MCR_RTS | COM_MCR_DTR |
-                                                COM_MCR_GLB_IRQ);
-       /* Enable rx interrupts */
-       outb(com + COM_IER, COM_IER_RDI);
-       /* Clear any preexisting overrun indications and interrupts */
-       inb(com + COM_IIR);
-       inb(com + COM_RX);
-       /* Put us on the list of initialized cdevs (now that it is init'd) */
-       SLIST_INSERT_HEAD(&cdev_list, cdev, next);
-}
-
-static void serial_init(void)
-{
-       /* attempt to init all four COMs */
-       serial_com_init(&com1, COM1);
-       serial_com_init(&com2, COM2);
-       serial_com_init(&com3, COM3);
-       serial_com_init(&com4, COM4);
-}
-
-/***** 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 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)
-
-#define MAX_SCROLL_LENGTH      20
-#define SCROLLING_CRT_SIZE     (MAX_SCROLL_LENGTH * CRT_SIZE)
-
-static spinlock_t SRACY lock = SPINLOCK_INITIALIZER_IRQSAVE;
-
-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':
-       case 0x7f:
-       #ifdef CONFIG_PRINTK_NO_BACKSPACE
-               cga_putc('^');
-               cga_putc('H');
-       #else
-               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];
-               }
-       #endif /* CONFIG_PRINTK_NO_BACKSPACE */
-               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;
-
-/* TODO: i'm concerned about the (lack of) locking when scrolling the screen. */
-static int
-kbd_proc_data(void)
-{
-       int c;
-       uint8_t data;
-
-#ifdef CONFIG_KB_CORE0_ONLY
-       /* Ghetto hack to avoid crashing brho's buggy nehalem. */
-       uint32_t eax, ebx, ecx, edx, family, model, stepping;
-       cpuid(0x1, 0x0, &eax, &ebx, &ecx, &edx);
-       family = ((eax & 0x0FF00000) >> 20) + ((eax & 0x00000F00) >> 8);
-       model = ((eax & 0x000F0000) >> 12) + ((eax & 0x000000F0) >> 4);
-       stepping = eax & 0x0000000F;
-       if (family == 6 && model == 26 && stepping == 4)
-               if (core_id())
-                       return -1;
-#endif /* CONFIG_KB_CORE0_ONLY */
-
-       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;
-}
-
-static int kb_get_char(struct cons_dev *cdev, uint8_t *data)
-{
-       int kb_d;
-       /* kbd_proc_data returns 0 if we should keep asking.  It return -1 when
-        * there is no data, and anything else is a char */
-       while ((kb_d = kbd_proc_data()) == 0)
-               cpu_relax();
-       if (kb_d == -1)
-               return -1;
-       *data = (uint8_t)kb_d;
-       return 0;
-}
-
-void kbd_init(void)
-{
-       /* init and post the kb cons_dev */
-       kb.type = CONS_KB_DEV;
-       kb.val = 0;
-       kb.irq = 1;             /* default PC keyboard IRQ */
-       kb.model = "PC Keyboard";
-       kb.getc = kb_get_char;
-       SLIST_INSERT_HEAD(&cdev_list, &kb, next);
-}
-
-/***** General device-independent console code *****/
-
-/* Initialize the console devices */
-void cons_init(void)
-{
-       cga_init();
-       kbd_init();
-       serial_init();
-}
-
-/* Returns 0 on success, with the char in *data */
-int cons_get_char(struct cons_dev *cdev, uint8_t *data)
-{
-       return cdev->getc(cdev, data);
-}
-
-/* Returns any available character, or 0 for none (legacy helper) */
-int cons_get_any_char(void)
-{
-       uint8_t c;
-       struct cons_dev *i;
-       /* First to succeed gets returned */
-       SLIST_FOREACH(i, &cdev_list, next) {
-               if (!cons_get_char(i, &c))
-                       return c;
-       }
-       return 0;
-}
-
-/* output a character to all console outputs (monitor and all serials) */
-void cons_putc(int c)
-{
-       spin_lock_irqsave(&lock);
-       #ifndef CONFIG_SERIAL_IO
-               serial_spam_char(c);
-       #endif
-       //lpt_putc(c);  /* very slow on the nehalem */
-       cga_putc(c);
-       spin_unlock_irqsave(&lock);
-}
-
-// `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_get_any_char()) == 0)
-               /* do nothing */;
-       return c;
-}
-
-int
-iscons(int fdnum)
-{
-       // used by readline
-       return 1;
-}
-
-/* TODO: remove us (and serial IO) */
-void serial_send_byte(uint8_t b)
-{
-}
-
-int serial_read_byte(void)
-{
-       return -1;
-}
diff --git a/kern/arch/i686/console.h b/kern/arch/i686/console.h
deleted file mode 100644 (file)
index b1e4290..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (c) 2012 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- *
- * x86 Console (keyboard/serial/monitor) interfaces */
-
-#ifndef ROS_KERN_ARCH_CONSOLE_H
-#define ROS_KERN_ARCH_CONSOLE_H
-
-#include <ros/common.h>
-#include <sys/queue.h>
-
-/* Types of console devices */
-#define CONS_KB_DEV            1
-#define CONS_SER_DEV   2
-
-struct cons_dev;
-/* Interrupt-driven console input devices */
-struct cons_dev {
-       SLIST_ENTRY(cons_dev)           next;
-       int                                                     type;           /* e.g., CONS_KB_DEV */
-       int                                                     val;            /* e.g., COM1 */
-       int                                                     irq;            /* desired irq */
-       char                                            *model;         /* descriptive string */
-       int (*getc)(struct cons_dev *, uint8_t *);
-};
-SLIST_HEAD(cons_dev_slist, cons_dev);
-extern struct cons_dev_slist cdev_list;
-
-void cons_init(void);
-/* Returns 0 on success, with the char in *data */
-int cons_get_char(struct cons_dev *cdev, uint8_t *data);
-/* Returns any available character, or 0 for none (legacy helper) */
-int cons_get_any_char(void);
-/* Writes c to the monitor and to all CONS_SER_DEV console devices */
-void cons_putc(int c);
-
-/* TODO: remove us (and serial IO) */
-void serial_send_byte(uint8_t b);
-int serial_read_byte();
-
-#endif /* ROS_KERN_ARCH_CONSOLE_H */
diff --git a/kern/arch/i686/cpuinfo.c b/kern/arch/i686/cpuinfo.c
deleted file mode 100644 (file)
index 9233299..0000000
+++ /dev/null
@@ -1,196 +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>
-
-/* Check Intel's SDM 2a for Table 3-17 for the cpuid leaves */
-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, 0x0, &eax, 0, 0, 0);
-       cprintf("Largest Extended Function Number Supported: 0x%08x\n", eax);
-       cpuid(1, 0x0, &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");
-       }
-       /* FP and SSE Checks */
-       if (edx & 0x00000001)
-               printk("FPU Detected\n");
-       else
-               panic("FPU Not Detected!!\n");
-       printk("SSE support: ");
-       if (edx & (1 << 25))
-               printk("sse ");
-       else
-               panic("SSE Support Not Detected!!\n");
-       if (edx & (1 << 26))
-               printk("sse2 ");
-       if (ecx & (1 << 0))
-               printk("sse3 ");
-       if (ecx & (1 << 9))
-               printk("ssse3 ");
-       if (ecx & (1 << 19))
-               printk("sse4.1 ");
-       if (ecx & (1 << 20))
-               printk("sse4.2 ");
-       if (edx & (1 << 23))
-               printk("mmx ");
-       if ((edx & (1 << 25)) && (!(edx & (1 << 24))))
-               panic("SSE support, but no FXSAVE!");
-       printk("\n");
-       cpuid(0x80000008, 0x0, &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, 0x0, &eax, &ebx, &ecx, &edx);
-       if (edx & 0x00000100)
-               printk("Invariant TSC present\n");
-       else
-               printk("Invariant TSC not present\n");
-       cpuid(0x07, 0x0, &eax, &ebx, &ecx, &edx);
-       if (ebx & 0x00000001)
-               printk("FS/GS Base RD/W supported\n");
-       else
-               printk("FS/GS Base RD/W not supported\n");
-       cpuid(0x80000001, 0x0, &eax, &ebx, &ecx, &edx);
-       if (edx & (1 << 27))
-               printk("RDTSCP supported\n");
-       else
-               printk("RDTSCP not supported: don't trust detailed measurements\n");
-       printk("FS/GS MSRs %ssupported\n", edx & (1 << 29) ? "" : "not ");
-       msr_val = read_msr(IA32_MISC_ENABLE);
-       /* we want this to be not set for cpuid.6h to work. */
-       if (msr_val & (1 << 22))
-               write_msr(IA32_MISC_ENABLE, msr_val & ~(1 << 22));
-       cpuid(0x00000006, 0x0, &eax, 0, 0, 0);
-       if (eax & (1 << 2))
-               printk("Always running APIC detected\n");
-       else
-               printk("Always running APIC *not* detected\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;
-
-       printk("   Virtual    Physical  Ps Dr Ac CD WT U W P\n");
-       printk("--------------------------------------------\n");
-       for(i = 0; i < size; i += PGSIZE, start += PGSIZE) {
-               pte = pgdir_walk(pgdir, (void*)start, 0);
-               printk("%p  ", start);
-               if (pte) {
-                       pde = &pgdir[PDX(start)];
-                       /* for a jumbo, pde = pte and PTE_PS (better be) = 1 */
-                       printk("%p  %1d  %1d  %1d  %1d  %1d  %1d %1d %1d\n",
-                              PTE_ADDR(*pte), (*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, (*pte & PTE_P));
-               } else {
-                       printk("%p\n", 0);
-               }
-       }
-}
-
-/* Like backtrace, this is probably not the best place for this. */
-void spinlock_debug(spinlock_t *lock)
-{
-#ifdef CONFIG_SPINLOCK_DEBUG
-       eipdebuginfo_t debuginfo;
-       char buf[256];
-       uint32_t eip = (uint32_t)lock->call_site;
-
-       if (!eip) {
-               printk("Lock %p: never locked\n", lock);
-               return;
-       }
-       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/i686/endian.h b/kern/arch/i686/endian.h
deleted file mode 100644 (file)
index a42a3ce..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (c) 2010 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- *
- * Endian #def and byte_swapping functions */
-
-#ifndef ROS_KERN_ARCH_ENDIAN_H
-#define ROS_KERN_ARCH_ENDIAN_H
-
-#include <ros/common.h>
-#include <arch/types.h>
-
-static inline uint16_t byte_swap16(uint16_t x)
-{
-       return (uint16_t)(x << 8 | x >> 8);
-}
-
-static inline uint32_t byte_swap32(uint32_t x)
-{
-       /* the + denotes both output and input */
-       asm volatile("bswap %0" : "+r"(x));
-       return x;
-}
-
-static inline uint64_t byte_swap64(uint64_t x)
-{
-       return (uint64_t)(((uint64_t)byte_swap32(x & 0xffffffff) << 32) |
-                         (byte_swap32(x >> 32)));
-}
-
-#endif /* ROS_KERN_ARCH_ENDIAN_H */
diff --git a/kern/arch/i686/entry.S b/kern/arch/i686/entry.S
deleted file mode 100644 (file)
index 7852761..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Copyright (c) 2009-13 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details. */
-
-#include <arch/mmu.h>
-#include <arch/trap.h>
-#include <ros/memlayout.h>
-
-# Shift Right Logical 
-#define SRL(val, shamt)                (((val) >> (shamt)) & ~(-1 << (32 - (shamt))))
-
-.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))
-
-# The kernel bootstrap (this code) is linked and loaded at physical address
-# 0x00100000 (1MB), which is the start of extended memory.  (See kernel.ld)
-
-# Flagging boottext to be text.  Check out:
-# http://sourceware.org/binutils/docs/as/Section.html
-.section .boottext, "awx"
-
-.code32
-.align 4
-multiboot_header:
-.long MULTIBOOT_HEADER_MAGIC
-.long MULTIBOOT_HEADER_FLAGS
-.long CHECKSUM
-
-.globl         _start
-_start:
-       movw    $0x1234,0x472                   # warm boot
-       # Reload all segment registers (including CS!) with flag segment selectors
-       # from our boot GDT.
-       lgdt    mygdtdesc
-       movl    $DATA_SEL, %eax
-       movw    %ax,%ds
-       movw    %ax,%es
-       movw    %ax,%ss
-       ljmp    $CODE_SEL,$newcs                # reload CS by jumping
-newcs:
-       # build page table.  need a mapping for current code at 0x00100000 and a
-       # basic kernbase mapping.  we're using the 32 bit second PT (aka, pg_dir),
-       # which covers 4MB per entry
-       movl    $boot_pdt, %edx
-       # identity map the first jumbo PTE from 0x0 -> 0x0
-       movl    $(PTE_P | PTE_W | PTE_PS), (%edx)
-       # map KERNBASE -> 0 for 200 MB
-       movl    $50, %ecx
-       # init loop, eax at paddr 0, and edx is advanced by KERNBASE mapping slots
-       # (with 4 bytes per PTE).
-       addl    $((KERNBASE >> PTSHIFT) << 2), %edx
-       movl    $(PTE_P | PTE_W | PTE_PS), %eax
-loop:
-       movl    %eax, (%edx)
-       addl    $PTSIZE, %eax
-       addl    $4, %edx
-       decl    %ecx
-       jnz             loop
-       # load cr3 and turn on paging.  note we assume PSE support.  if we didn't
-       # have it, then our jumbo page mappings are going to fail.
-       movl    $boot_pdt, %eax
-       movl    %eax, %cr3
-       movl    %cr4, %eax
-       orl             $(CR4_PSE | CR4_PGE), %eax
-       movl    %eax, %cr4
-       movl    %cr0, %eax
-       orl             $(CR0_PE | CR0_PG | CR0_AM | CR0_WP | CR0_NE | CR0_MP), %eax  
-       andl    $(~(CR0_TS | CR0_EM | CR0_CD | CR0_NW)), %eax  
-       movl    %eax, %cr0
-       # paging is on, and our code is still running at 0x00100000 do some
-       # miscellaneous OS setup.  the coreid stuff is so we can call core_id()
-       # before smp_boot.  this is the only arch-dependent code called before then.
-       movl    $0x0, os_coreid_lookup
-       movl    $0x0, hw_coreid_lookup
-       # Clear the frame pointer register (EBP)
-       # so that once we get into debugging C code,
-       # stack backtraces will be terminated properly.
-       movl    $0x0,%ebp
-       movl    $(bootstacktop),%esp
-       # Save multiboot info
-       push    %ebx
-       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
-
-.section .bootdata, "aw"
-       .p2align        2               # force 4 byte alignment
-mygdt:
-       SEG_NULL                        # null seg
-       SEG(STA_X|STA_R, 0, 0xffffffff) # code seg
-       SEG(STA_W, 0, 0xffffffff)       # data seg
-mygdtdesc:
-       .word   0x17            # sizeof(mygdt) - 1
-       .long   mygdt           # address mygdt
-# boot page directory.  going to use jumbo page entries
-       .align PGSIZE
-boot_pdt:
-       .space  PGSIZE
-
-
-# From here down is linked for KERNBASE
-
-###################################################################    
-# 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:
-
diff --git a/kern/arch/i686/env.c b/kern/arch/i686/env.c
deleted file mode 100644 (file)
index d1da684..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <trap.h>
-#include <env.h>
-#include <assert.h>
-#include <pmap.h>
-#include <smp.h>
-
-/* 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((uintptr_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 (!PAGE_UNMAPPED(pt[pteno]))
-                               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/i686/frontend.c b/kern/arch/i686/frontend.c
deleted file mode 100644 (file)
index bd4ef0f..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#include <multiboot.h>
-#include <arch/frontend.h>
-#include <net/nic_common.h>
-#include <kmalloc.h>
-
-#define debug(...) printk(__VA_ARGS__)
-
-int handle_appserver_packet(const char* p, size_t size)
-{
-       // Subtract off the crc because we just don't care...
-       size-=4;
-
-       appserver_packet_t* packet = (appserver_packet_t*)p;
-
-       if(size < sizeof(packet->header))
-               goto fail;
-
-       uint8_t cmd = packet->header.cmd;
-       if(cmd != APPSERVER_CMD_LOAD && cmd != APPSERVER_CMD_STORE)
-               goto fail;
-
-       uintptr_t paddr = ntohl(packet->header.addr);
-       size_t copy_size = ntohl(packet->header.payload_size);
-       if(paddr % 4 || paddr >= maxaddrpa)
-               goto fail;
-       if(copy_size % 4 || copy_size > APPSERVER_MAX_PAYLOAD_SIZE)
-               goto fail;
-
-       size_t paysize = copy_size;
-       size_t response_paysize = 0;
-       if(cmd == APPSERVER_CMD_LOAD)
-       {
-               response_paysize = copy_size;
-               paysize = 0;
-       }
-       if(size != sizeof(packet->header) + paysize &&
-          !(size == MIN_FRAME_SIZE && sizeof(packet->header) + paysize <= MIN_FRAME_SIZE))
-               goto fail;
-
-       // construct response packet
-       size_t response_size = sizeof(packet->header)+response_paysize;
-       appserver_packet_t* response_packet = kmalloc(response_size,0);
-
-       memcpy(response_packet->header.dst_mac,packet->header.src_mac,6);
-       memcpy(response_packet->header.src_mac,packet->header.dst_mac,6);
-       response_packet->header.ethertype = packet->header.ethertype;
-       response_packet->header.cmd = APPSERVER_CMD_ACK;
-       response_packet->header.seqno = packet->header.seqno;
-       response_packet->header.payload_size = htonl(response_paysize);
-       response_packet->header.addr = packet->header.addr;
-       
-       // determine src/dest for copy
-       const uint32_t* copy_src = (const uint32_t*)packet->payload;
-       uint32_t* copy_dst = (uint32_t*)KADDR(paddr);
-       if(cmd == APPSERVER_CMD_LOAD)
-       {
-               copy_src = copy_dst;
-               copy_dst = (uint32_t*)response_packet->payload;
-       }
-
-       // manual word-by-word copy for word-atomicity
-       for(int i = 0; i < copy_size/sizeof(uint32_t); i++)
-               copy_dst[i] = copy_src[i];
-
-       // fire the response
-       if(send_frame((char*)response_packet,response_size) != response_size)
-               panic("couldn't send appserver packet!");
-       kfree(response_packet);
-
-       return 0;
-       
-fail:
-       panic("bad appserver packet!");
-}
diff --git a/kern/arch/i686/frontend.h b/kern/arch/i686/frontend.h
deleted file mode 100644 (file)
index 8f5814b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2010 The Regents of the University of California
- * See LICENSE for details.
- */
-
-#ifndef ROS_ARCH_FRONTEND_H
-#define ROS_ARCH_FRONTEND_H
-
-#define APPSERVER_MAX_PAYLOAD_SIZE 1024
-
-#define APPSERVER_CMD_LOAD  0
-#define APPSERVER_CMD_STORE 1
-#define APPSERVER_CMD_ACK   2
-
-int handle_appserver_packet(const char *buf, size_t len);
-
-typedef struct
-{
-       uint8_t dst_mac[6];
-       uint8_t src_mac[6];
-       uint16_t ethertype;
-       uint8_t cmd;
-       uint8_t seqno;
-       uint32_t payload_size;
-       uint32_t addr;
-} appserver_packet_header_t;
-
-typedef struct
-{
-       appserver_packet_header_t header;
-       uint8_t payload[APPSERVER_MAX_PAYLOAD_SIZE];
-} appserver_packet_t;
-
-#endif
diff --git a/kern/arch/i686/init.c b/kern/arch/i686/init.c
deleted file mode 100644 (file)
index fec4093..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
-#include <smp.h>
-
-#include <arch/mptables.h>
-#include <arch/pci.h>
-#include <arch/ioapic.h>
-#include <arch/console.h>
-#include <arch/perfmon.h>
-#include <arch/init.h>
-#include <console.h>
-
-struct ancillary_state x86_default_fpu;
-
-/* irq handler for the console (kb, serial, etc) */
-static void irq_console(struct hw_trapframe *hw_tf, void *data)
-{
-       uint8_t c;
-       struct cons_dev *cdev = (struct cons_dev*)data;
-       assert(cdev);
-       if (cons_get_char(cdev, &c))
-               return;
-       /* Do our work in an RKM, instead of interrupt context.  Note the RKM will
-        * cast 'c' to a char. */
-       if (c == 'G')
-               send_kernel_message(core_id(), __run_mon, 0, 0, 0, KMSG_ROUTINE);
-       else
-               send_kernel_message(core_id(), __cons_add_char, (long)&cons_buf,
-                                   (long)c, 0, KMSG_ROUTINE);
-}
-
-static void cons_irq_init(void)
-{
-       struct cons_dev *i;
-       /* Register interrupt handlers for all console devices */
-       SLIST_FOREACH(i, &cdev_list, next) {
-               register_interrupt_handler(interrupt_handlers, i->irq + PIC1_OFFSET,
-                                          irq_console, i);
-               /* Route any console IRQs to core 0 */
-       #ifdef CONFIG_ENABLE_MPTABLES
-               ioapic_route_irq(i->irq, 0);
-       #else
-               pic_unmask_irq(i->irq);
-               unmask_lapic_lvt(LAPIC_LVT_LINT0);
-       #endif /* CONFIG_ENABLE_MPTABLES */
-               printd("Registered handler for IRQ %d (ISR %d)\n", i->irq,
-                      i->irq + PIC1_OFFSET);
-       }
-}
-
-void arch_init()
-{
-       /* need to reinit before saving, in case boot agents used the FPU or it is
-        * o/w dirty.  had this happen on c89, which had a full FP stack after
-        * booting. */
-       asm volatile ("fninit");
-       save_fp_state(&x86_default_fpu); /* used in arch/trap.h for fpu init */
-       pci_init();
-#ifdef CONFIG_ENABLE_MPTABLES
-       mptables_parse();
-       ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
-       // TODO: move these back to regular init.  requires fixing the 
-       // CONFIG_NETWORKING inits to not need multiple cores running.
-#endif
-       // this returns when all other cores are done and ready to receive IPIs
-       #ifdef CONFIG_SINGLE_CORE
-               smp_percpu_init();
-       #else
-               smp_boot();
-       #endif
-       proc_init();
-
-       /* EXPERIMENTAL NETWORK FUNCTIONALITY
-        * To enable, define CONFIG_NETWORKING in your Makelocal
-        * If enabled, will load the rl8168 driver (if device exists)
-        * and will a boot into userland matrix, so remote syscalls can be performed.
-        * If in simulation, will do some debugging information with the ne2k device
-        *
-        * 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 CONFIG_NETWORKING
-       #ifdef CONFIG_SINGLE_CORE
-               warn("You currently can't have networking if you boot into single core mode!!\n");
-       #else
-               /* TODO: use something like linux's device_init() to call these. */
-               #ifdef CONFIG_RL8168
-               extern void rl8168_init(void);          
-               rl8168_init();          
-               #endif
-               #ifdef CONFIG_NE2K
-               extern void ne2k_init(void);            
-               ne2k_init();
-               #endif
-               #ifdef CONFIG_E1000
-               extern void e1000_init(void);           
-               e1000_init();
-               #endif
-       #endif // CONFIG_SINGLE_CORE
-       #endif // CONFIG_NETWORKING
-
-       perfmon_init();
-       cons_irq_init();
-       check_timing_stability();
-}
diff --git a/kern/arch/i686/init.h b/kern/arch/i686/init.h
deleted file mode 100644 (file)
index 57ad0bc..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* See COPYRIGHT for copyright information. */
-
-#ifndef ROS_ARCH_INIT_H
-#define ROS_ARCH_INIT_H
-
-void arch_init();
-bool check_timing_stability(void);     /* in rdtsc_test.c */
-
-#endif // !ROS_ARCH_INIT_H
-
diff --git a/kern/arch/i686/ioapic.c b/kern/arch/i686/ioapic.c
deleted file mode 100644 (file)
index d07142e..0000000
+++ /dev/null
@@ -1,214 +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_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]->irqpin;  // Paul's line, not the irqline
-               
-               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.
-               /* might be issues with the 'line' for INTA being 0x01 now */
-               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;
-               /* TODO: this stuff probably doesn't work right anymore */
-               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/i686/ioapic.h b/kern/arch/i686/ioapic.h
deleted file mode 100644 (file)
index 39d0226..0000000
+++ /dev/null
@@ -1,58 +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>
-
-/* Physical address of the IOAPIC, can be changed.  Currently, it's mapped at
- * the VADDR IOAPIC_BASE */
-#define IOAPIC_PBASE                           0xfec00000 /* default *physical* address */
-
-/* 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/i686/kbdreg.h b/kern/arch/i686/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/i686/kclock.c b/kern/arch/i686/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/i686/kdebug.c b/kern/arch/i686/kdebug.c
deleted file mode 100644 (file)
index 94af666..0000000
+++ /dev/null
@@ -1,366 +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;
-
-
-/* We used to check for a null terminating byte for the entire strings section
- * (due to JOS, I think), but that's not what the spec says: only that all
- * strings are null terminated.  There might be random stuff tacked on at the
- * end.  I had some stabs that seemed valid (lookups worked), that did not have
- * the entire table be null terminated.  Still, something else might be jacked
- * up.  If it turns out that's the case, put the checks in here. */
-static bool stab_table_valid(const char *stabstr, const char *stabstr_end)
-{
-       if (stabstr_end <= stabstr)
-               return FALSE;
-       return TRUE;
-}
-
-// 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 {
-               /* TODO: short circuiting this, til our user space apps pack stab data
-                * the kernel knows about */
-               return -1;
-               // 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.
-       }
-
-       if (!stab_table_valid(stabstr, stabstr_end))
-               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;
-}
-
-/* Returns a function pointer for a function name matching the given string. */
-void *debug_get_fn_addr(char *fn_name)
-{
-       const struct stab *SNT stab_end = __STAB_END__;
-       const struct stab *BND(__this,stab_end) stabs = __STAB_BEGIN__;
-       const char *SNT stabstr_end = __STABSTR_END__;
-       const char *NT BND(__this,stabstr_end) stabstr = __STABSTR_BEGIN__;
-
-       static int first_fn_idx = 0;
-       int i = first_fn_idx;
-       int len;
-       const char *stab_fn_name = 0;
-       void *retval = 0;
-
-       if (!stab_table_valid(stabstr, stabstr_end))
-               return 0;
-
-       for (/* i set */; &stabs[i] < stab_end; i++) {
-               if (stabs[i].n_type != N_FUN)
-                       continue;
-               first_fn_idx = first_fn_idx ? first_fn_idx : i;
-               /* broken stab, just keep going */
-               if (!(stabs[i].n_strx < stabstr_end - stabstr))
-                       continue;
-               stab_fn_name = stabstr + stabs[i].n_strx;
-               len = strfind(stab_fn_name, ':') - stab_fn_name;
-               if (!len)
-                       continue;
-               /* we have a match. */
-               if (!strncmp(stab_fn_name, fn_name, len)) {
-                       printd("FN name: %s, Addr: %p\n", stab_fn_name, stabs[i].n_value);
-                       retval = (void*)stabs[i].n_value;
-                       break;
-               }
-       }
-       return retval;
-}
-
-void backtrace(void)
-{ 
-       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);
-       printk("Stack Backtrace on Core %d:\n", core_id());
-       // on each iteration, ebp holds the stack frame and eip an addr in that func
-       while (1) {
-               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");
-               if (!ebp)
-                       break;
-               eip = *(ebp + 1) - 1;
-               ebp = (uint32_t*)(*ebp);
-               #ifdef CONFIG_RESET_STACKS
-               if (!strncmp("__smp_idle", debuginfo.eip_fn_name, 10))
-                       break;
-               #endif /* CONFIG_RESET_STACKS */
-       }
-}
-
-/* Assumes 32-bit header */
-void print_fpu_state(struct ancillary_state *fpu)
-{
-       printk("fcw:        0x%04x\n", fpu->fp_head_n64.fcw);
-       printk("fsw:        0x%04x\n", fpu->fp_head_n64.fsw);
-       printk("ftw:          0x%02x\n", fpu->fp_head_n64.ftw);
-       printk("fop:        0x%04x\n", fpu->fp_head_n64.fop);
-       printk("fpu_ip: 0x%08x\n", fpu->fp_head_n64.fpu_ip);
-       printk("cs:         0x%04x\n", fpu->fp_head_n64.cs);
-       printk("fpu_dp: 0x%08x\n", fpu->fp_head_n64.fpu_dp);
-       printk("ds:         0x%04x\n", fpu->fp_head_n64.ds);
-       printk("mxcsr:  0x%08x\n", fpu->fp_head_n64.mxcsr);
-       printk("mxcsrm: 0x%08x\n", fpu->fp_head_n64.mxcsr_mask);
-
-       for (int i = 0; i < sizeof(struct ancillary_state); i++) {
-               if (i % 20 == 0)
-                       printk("\n");
-               printk("%02x ", *((uint8_t*)fpu + i));
-       }
-       printk("\n");
-}
diff --git a/kern/arch/i686/kdebug.h b/kern/arch/i686/kdebug.h
deleted file mode 100644 (file)
index 291d8c4..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (c) 2011 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- *
- * x86-specific Kernel debugging headers and static inlines */
-
-#ifndef ROS_KERN_ARCH_KDEBUG_H
-#define ROS_KERN_ARCH_KDEBUG_H
-
-#include <ros/common.h>
-#include <arch/x86.h>
-
-#include <stdio.h>
-
-/* Returns a PC/EIP in the function that called us, preferably near the call
- * site.  Returns 0 when we can't jump back any farther. */
-static inline uintptr_t get_caller_pc(void)
-{
-       uint32_t *ebp = (uint32_t*)read_ebp();
-       if (!ebp)
-               return 0;
-       /* 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) */
-       return *(ebp + 1) - 1;
-}
-
-#endif /* ROS_KERN_ARCH_KDEBUG_H */
diff --git a/kern/arch/i686/kernel.ld b/kern/arch/i686/kernel.ld
deleted file mode 100644 (file)
index 87e4a11..0000000
+++ /dev/null
@@ -1,73 +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)
-KERNBASE = 0xc0000000;
-
-SECTIONS
-{
-       /* Entry Linked and loaded at 0x00100000 (includes multiboot) */
-       . = 0x00100000;
-
-       .bootstrap : {
-               *(.boottext .bootdata)
-       }
-
-       /* Link the main kernel for the space after entry + KERNBASE.  We'll still
-        * load it adjacent in physical memory */
-       . += KERNBASE;
-
-       .text : AT(ADDR(.text) - KERNBASE) {
-               *(.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)
-               *(COMMON)
-       }
-
-       PROVIDE(end = .);
-
-       /DISCARD/ : {
-               *(.eh_frame .note.GNU-stack)
-       }
-}
diff --git a/kern/arch/i686/mmu.h b/kern/arch/i686/mmu.h
deleted file mode 100644 (file)
index ad91d34..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef ROS_ARCH_MMU_H
-#define ROS_ARCH_MMU_H
-
-/* til we remove this file, unless we have some kernel-only stuff later */
-#include <ros/arch/mmu.h>
-
-#endif /* ROS_ARCH_MMU_H */
diff --git a/kern/arch/i686/mptables.c b/kern/arch/i686/mptables.c
deleted file mode 100644 (file)
index 9cd58ec..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 %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/i686/mptables.h b/kern/arch/i686/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/i686/page_alloc.c b/kern/arch/i686/page_alloc.c
deleted file mode 100644 (file)
index 6039636..0000000
+++ /dev/null
@@ -1,96 +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.
- * 
- * Barret Rhoden <brho@cs.berkeley.edu>
- * 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 = SPINLOCK_INITIALIZER_IRQSAVE;
-
-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));
-
-       page_setref(&pages[0], 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
-       page_setref(&pages[1], 1);
-       for (i = 2; i < LA2PPN(IOPHYSMEM); i++) {
-               /* this ought to be unnecessary */
-               page_setref(&pages[i], 0);
-               LIST_INSERT_HEAD(
-                  &(colored_page_free_list[get_page_color(page2ppn(&pages[i]), 
-                                                              llc_cache)]),
-                  &pages[i],
-                  pg_link
-               );
-       }
-       for (i = LA2PPN(IOPHYSMEM); i < LA2PPN(EXTPHYSMEM); i++)
-               page_setref(&pages[i], 1);
-       for (i = LA2PPN(EXTPHYSMEM); i < LA2PPN(physaddr_after_kernel); i++)
-               page_setref(&pages[i], 1);
-       for (i = LA2PPN(physaddr_after_kernel); i < LA2PPN(maxaddrpa); i++) {
-               page_setref(&pages[i], 0);
-               LIST_INSERT_HEAD(
-                  &(colored_page_free_list[get_page_color(page2ppn(&pages[i]), 
-                                                              llc_cache)]),
-                  &pages[i],
-                  pg_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++)
-               page_setref(&pages[i], 1);
-       printk("Page alloc init successful\n");
-}
-
diff --git a/kern/arch/i686/pci.c b/kern/arch/i686/pci.c
deleted file mode 100644 (file)
index 36e6425..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Copyright (c) 2009, 2010 The Regents of the University of California
- * See LICENSE for details.
- *
- * Barret Rhoden <brho@cs.berkeley.edu>
- * Original by Paul Pearce <pearce@eecs.berkeley.edu> */
-
-#include <arch/x86.h>
-#include <arch/pci.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include <kmalloc.h>
-#include <arch/pci_defs.h>
-
-/* Which pci devices hang off of which irqs */
-/* TODO: make this an array of SLISTs (pain from ioapic.c, etc...) */
-struct pci_device *irq_pci_map[NUM_IRQS] = {0};
-
-/* List of all discovered devices */
-struct pcidev_stailq pci_devices = STAILQ_HEAD_INITIALIZER(pci_devices);
-
-/* Scans the PCI bus.  Won't actually work for anything other than bus 0, til we
- * sort out how to handle bridge devices. */
-void pci_init(void) {
-       uint32_t result = 0;
-       uint16_t dev_id, ven_id;
-       struct pci_device *pcidev;
-       for (int i = 0; i < PCI_MAX_BUS - 1; i++)       /* phantoms at 0xff */
-               for (int j = 0; j < PCI_MAX_DEV; j++)
-                       for (int k = 0; k < PCI_MAX_FUNC; k++) {
-                               result = pci_read32(i, j, k, PCI_DEV_VEND_REG);
-                               dev_id = result >> PCI_DEVICE_OFFSET;
-                               ven_id = result & PCI_VENDOR_MASK;
-                               /* Skip invalid IDs (not a device) */
-                               if (ven_id == INVALID_VENDOR_ID) 
-                                       continue;
-                               pcidev = kmalloc(sizeof(struct pci_device), 0);
-                               pcidev->bus = i;
-                               pcidev->dev = j;
-                               pcidev->func = k;
-                               pcidev->dev_id = dev_id;
-                               pcidev->ven_id = ven_id;
-                               /* Get the Class/subclass */
-                               result = pcidev_read32(pcidev, PCI_CLASS_REG);
-                               pcidev->class = result >> 24;
-                               pcidev->subclass = (result >> 16) & 0xff;
-                               pcidev->progif = (result >> 8) & 0xff;
-                               /* All device types (0, 1, 2) have the IRQ in the same place */
-                               result = pcidev_read32(pcidev, PCI_IRQ_STD);
-                               /* This is the PIC IRQ the device is wired to */
-                               pcidev->irqline = result & PCI_IRQLINE_MASK;
-                               /* This is the interrupt pin the device uses (INTA# - INTD#) */
-                               pcidev->irqpin = (result & PCI_IRQPIN_MASK) >> PCI_IRQPIN_SHFT;
-                               #ifdef CONFIG_PCI_VERBOSE
-                               pcidev_print_info(pcidev, 4);
-                               #else
-                               pcidev_print_info(pcidev, 0);
-                               #endif /* CONFIG_PCI_VERBOSE */
-                               if (pcidev->irqpin != PCI_NOINT) {
-                                       /* TODO: use a list (check for collisions for now) (massive
-                                        * collisions on a desktop with bridge IRQs. */
-                                       //assert(!irq_pci_map[pcidev->irqline]);
-                                       irq_pci_map[pcidev->irqline] = pcidev;
-                               }
-                               /* 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).
-                               #if 0
-                               #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
-                               #endif
-                               
-                               STAILQ_INSERT_TAIL(&pci_devices, pcidev, all_dev);
-                       }
-}
-
-/* Helper to read 32 bits from the config space of B:D:F.  'Offset' is how far
- * into the config space we offset before reading, aka: where we are reading. */
-uint32_t pci_read32(unsigned short bus, unsigned short dev, unsigned short func,
-                    unsigned short offset)
-{
-       /* Send type 1 requests for everything beyond bus 0.  Note this does nothing
-        * until we configure the PCI bridges (which we don't do yet). */
-       if (bus !=  0)
-               offset |= 0x1;
-       outl(PCI_CONFIG_ADDR, MK_CONFIG_ADDR(bus, dev, func, offset));
-       return inl(PCI_CONFIG_DATA);
-}
-
-/* Same, but writes (doing 32bit at a time).  Never actually tested (not sure if
- * PCI lets you write back). */
-void pci_write32(unsigned short bus, unsigned short dev, unsigned short func,
-                    unsigned short offset, uint32_t value)
-{
-       outl(PCI_CONFIG_ADDR, MK_CONFIG_ADDR(bus, dev, func, offset));
-       outl(PCI_CONFIG_DATA, value);
-}
-
-/* Helper to read from a specific device's config space. */
-uint32_t pcidev_read32(struct pci_device *pcidev, unsigned short offset)
-{
-       return pci_read32(pcidev->bus, pcidev->dev, pcidev->func, offset);
-}
-
-/* Helper to write to a specific device */
-void pcidev_write32(struct pci_device *pcidev, unsigned short offset,
-                    uint32_t value)
-{
-       pci_write32(pcidev->bus, pcidev->dev, pcidev->func, offset, value);
-}
-
-/* Gets any old raw bar. */
-uint32_t pci_getbar(struct pci_device *pcidev, unsigned int bar)
-{
-       uint32_t value, type;
-       if (bar > 5)
-               panic("Nonexistant bar requested!");
-       value = pcidev_read32(pcidev, PCI_HEADER_REG);
-       type = (value >> 16) & 0xff;
-       /* Only types 0 and 1 have BARS */
-       if ((type != 0x00) && (type != 0x01))
-               return 0;
-       /* Only type 0 has BAR2 - BAR5 */
-       if ((bar > 1) && (type != 0x00))
-               return 0;
-       return pcidev_read32(pcidev, PCI_BAR0_STD + bar * PCI_BAR_OFF);
-}
-
-/* Determines if a given bar is IO (o/w, it's mem) */
-bool pci_is_iobar(uint32_t bar)
-{
-       return bar & PCI_BAR_IO;
-}
-
-/* Helper to get the address from a membar.  Check the type beforehand */
-uint32_t pci_getmembar32(uint32_t bar)
-{
-       uint8_t type = bar & PCI_MEMBAR_TYPE;
-       if (type != PCI_MEMBAR_32BIT) {
-               warn("Unhandled PCI membar type: %02p\n", type >> 1);
-               return 0;
-       }
-       return bar & 0xfffffff0;
-}
-
-/* Helper to get the address from an IObar.  Check the type beforehand */
-uint32_t pci_getiobar32(uint32_t bar)
-{
-       return bar & 0xfffffffc;
-}
-
-/* Helper to get the class description strings.  Adapted from
- * http://www.pcidatabase.com/reports.php?type=c-header */
-static void pcidev_get_cldesc(struct pci_device *pcidev, char **class,
-                              char **subclass, char **progif)
-{
-       int     i ;
-       *class = *subclass = *progif = "";
-
-       for (i = 0; i < PCI_CLASSCODETABLE_LEN; i++) {
-               if (PciClassCodeTable[i].BaseClass == pcidev->class) {
-                       if (!(**class))
-                               *class = PciClassCodeTable[i].BaseDesc;
-                       if (PciClassCodeTable[i].SubClass == pcidev->subclass) {
-                               if (!(**subclass))
-                                       *subclass = PciClassCodeTable[i].SubDesc;
-                               if (PciClassCodeTable[i].ProgIf == pcidev->progif) {
-                                       *progif = PciClassCodeTable[i].ProgDesc;
-                                       break ;
-                               }
-                       }
-               }
-       }
-}
-
-/* Helper to get the vendor and device description strings */
-static void pcidev_get_devdesc(struct pci_device *pcidev, char **vend_short,
-                               char **vend_full, char **chip, char **chip_desc)
-{
-       int     i ;
-       *vend_short = *vend_full = *chip = *chip_desc = "";
-
-       for (i = 0; i < PCI_VENTABLE_LEN; i++) {
-               if (PciVenTable[i].VenId == pcidev->ven_id) {
-                       *vend_short = PciVenTable[i].VenShort;
-                       *vend_full = PciVenTable[i].VenFull;
-                       break ;
-               }
-       }
-       for (i = 0; i < PCI_DEVTABLE_LEN; i++) {
-               if ((PciDevTable[i].VenId == pcidev->ven_id) &&
-                  (PciDevTable[i].DevId == pcidev->dev_id)) {
-                       *chip = PciDevTable[i].Chip;
-                       *chip_desc = PciDevTable[i].ChipDesc;
-                       break ;
-               }
-       }
-}
-
-/* Prints info (like lspci) for a device */
-void pcidev_print_info(struct pci_device *pcidev, int verbosity)
-{
-       char *ven_sht, *ven_fl, *chip, *chip_txt, *class, *subcl, *progif;
-       pcidev_get_cldesc(pcidev, &class, &subcl, &progif);
-       pcidev_get_devdesc(pcidev, &ven_sht, &ven_fl, &chip, &chip_txt);
-
-       printk("%02x:%02x.%x %s: %s %s %s\n",
-              pcidev->bus,
-              pcidev->dev,
-              pcidev->func,
-              subcl,
-              ven_sht,
-              chip,
-              chip_txt);
-       if (verbosity > 1)
-               printk("        IRQ: %02d IRQ pin: %02p\n",
-                      pcidev->irqline,
-                      pcidev->irqpin);
-       if (verbosity > 2)
-               printk("        Vendor Id: %04p Device Id: %04p\n",
-                      pcidev->ven_id,
-                      pcidev->dev_id);
-       if (verbosity > 3)
-               printk("        %s %s %s\n",
-                      class,
-                      progif,
-                      ven_fl);
-}
diff --git a/kern/arch/i686/pci.h b/kern/arch/i686/pci.h
deleted file mode 100644 (file)
index 289a780..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Copyright (c) 2009, 2010 The Regents of the University of California
- * See LICENSE for details.
- *
- * Barret Rhoden <brho@cs.berkeley.edu>
- * Original by Paul Pearce <pearce@eecs.berkeley.edu> */
-
-#ifndef ROS_ARCH_PCI_H
-#define ROS_ARCH_PCI_H
-
-#include <ros/common.h>
-#include <sys/queue.h>
-
-#define pci_debug(...)  printk(__VA_ARGS__)  
-
-// Macro for creating the address fed to the PCI config register 
-// TODO: get rid of this, in favor of the helpers
-#define MK_CONFIG_ADDR(BUS, DEV, FUNC, REG) (unsigned long)(((BUS) << 16)   |  \
-                                                            ((DEV) << 11)   |  \
-                                                            ((FUNC) << 8)   |  \
-                                                            ((REG) & 0xfc)  |  \
-                                                            (0x80000000))
-
-#define PCI_CONFIG_ADDR     0xCF8
-#define PCI_CONFIG_DATA     0xCFC
-#define INVALID_VENDOR_ID   0xFFFF
-
-/* TODO: gut this (when the IOAPIC is fixed) */
-#define INVALID_BUS                    0xFFFF
-
-#define PCI_IO_MASK                    0xfff8
-#define PCI_MEM_MASK           0xfffffff0
-#define PCI_IRQLINE_MASK       0x000000ff
-#define PCI_IRQPIN_MASK                0x0000ff00
-#define PCI_IRQPIN_SHFT                8
-#define PCI_VENDOR_MASK                0xffff
-#define PCI_DEVICE_OFFSET      0x10
-
-#define PCI_NOINT                      0x00
-#define PCI_INTA                       0x01
-#define PCI_INTB                       0x02
-#define PCI_INTC                       0x03
-#define PCI_INTD                       0x04
-
-/* PCI Register Config Space */
-#define PCI_DEV_VEND_REG       0x00
-#define PCI_STAT_CMD_REG       0x04
-#define PCI_CLASS_REG          0x08
-#define PCI_HEADER_REG         0x0c
-/* Config space for header type 0x00  (Standard) */
-#define PCI_BAR0_STD           0x10
-#define PCI_BAR1_STD           0x14
-#define PCI_BAR2_STD           0x18
-#define PCI_BAR3_STD           0x1c
-#define PCI_BAR4_STD           0x20
-#define PCI_BAR5_STD           0x24
-#define PCI_BAR_OFF                    0x04
-#define PCI_CARDBUS_STD                0x28
-#define PCI_SUBSYSTEM_STD      0x2C
-#define PCI_EXPROM_STD         0x30
-#define PCI_CAPAB_STD          0x34
-#define PCI_IRQ_STD                    0x3c
-/* Config space for header type 0x01 (PCI-PCI bridge) */
-#define PCI_BAR0_BR                    0x10
-#define PCI_BAR1_BR                    0x14
-#define PCI_BUSINFO_BR         0x18
-#define PCI_IOINFO_BR          0x1c
-#define PCI_MEM_BR                     0x20
-#define PCI_MEM_PRFC_BR                0x24
-#define PCI_PRFC_BASE_BR       0x28
-#define PCI_PRFC_LIM_BR                0x2C
-#define PCI_IO_LIM_BR          0x30
-#define PCI_CAPAB_BR           0x34
-#define PCI_IRQ_BDG_BR         0x3c
-/* Config space for header type 0x02 (PCI-Cardbus bridge) */
-#define PCI_SOC_BASE_CB                0x10
-#define PCI_SEC_STAT_CB                0x14
-#define PCI_BUS_INFO_CB                0x18
-#define PCI_MEM_BASE0_CB       0x1c
-#define PCI_MEM_LIMIT0_CB      0x20
-#define PCI_MEM_BASE1_CB       0x24
-#define PCI_MEM_LIMIT1_CB      0x28
-#define PCI_IO_BASE0_CB                0x2c
-#define PCI_IO_LIMIT0_CB       0x30
-#define PCI_IO_BASE1_CB                0x34
-#define PCI_IO_LIMIT1_CB       0x38
-#define PCI_IRQ_CB                     0x3c
-#define PCI_SUBSYS_CB          0x40
-#define PCI_16BIT_CB           0x44
-
-/* Legacy Paul-mapping */
-#define PCI_IRQ_REG                    PCI_IRQ_STD
-
-/* Command Register Flags */
-#define PCI_CMD_IO_SPC         (1 << 0)
-#define PCI_CMD_MEM_SPC                (1 << 1)
-#define PCI_CMD_BUS_MAS                (1 << 2)
-#define PCI_CMD_SPC_CYC                (1 << 3)
-#define PCI_CMD_WR_EN          (1 << 4)
-#define PCI_CMD_VGA                    (1 << 5)
-#define PCI_CMD_PAR_ERR                (1 << 6)
-/* #define PCI_CMD_XXX         (1 << 7) Reserved */
-#define PCI_CMD_SERR           (1 << 8)
-#define PCI_CMD_FAST_EN                (1 << 9)
-#define PCI_CMD_IRQ_DIS                (1 << 10)
-
-/* Status Register Flags (Bits 9 and 10 are one field) */
-/* Bits 0, 1, and 2 are reserved */
-#define PCI_ST_IRQ_STAT                (1 << 3)
-#define PCI_ST_CAP_LIST                (1 << 4)
-#define PCI_ST_66MHZ           (1 << 5)
-/* #define PCI_CMD_XXX         (1 << 6)  Reserved */
-#define PCI_ST_FAST_CAP                (1 << 7)
-#define PCI_ST_MASPAR_ERR      (1 << 8)
-#define PCI_ST_DEVSEL_TIM      (3 << 9)        /* 2 bits */
-#define PCI_ST_SIG_TAR_ABRT    (1 << 11)
-#define PCI_ST_REC_TAR_ABRT    (1 << 12)
-#define PCI_ST_REC_MAS_ABRT    (1 << 13)
-#define PCI_ST_SIG_SYS_ERR     (1 << 14)
-#define PCI_ST_PAR_ERR         (1 << 15)
-
-/* BARS: Base Address Registers */
-#define PCI_BAR_IO_MASK                0x1
-#define PCI_BAR_IO PCI_BAR_IO_MASK
-#define PCI_MEMBAR_TYPE        (3 << 1)
-#define PCI_MEMBAR_32BIT       0x0
-#define PCI_MEMBAR_RESV        0x2                     /* type 0x1 shifted to MEMBAR_TYPE */
-#define PCI_MEMBAR_64BIT       0x4                     /* type 0x2 shifted to MEMBAR_TYPE */
-
-#define PCI_MAX_BUS                    256
-#define PCI_MAX_DEV                    32
-#define PCI_MAX_FUNC           8
-
-// Offset used for indexing IRQs. Why isnt this defined elsewhere?
-#define NUM_IRQS                       256
-#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
-
-/* Struct for some meager contents of a PCI device */
-struct pci_device {
-       STAILQ_ENTRY(pci_device)        all_dev;        /* list of all devices */
-       SLIST_ENTRY(pci_device)         irq_dev;        /* list of all devs off an irq */
-       uint8_t                                         bus;
-       uint8_t                                         dev;
-       uint8_t                                         func;
-       uint16_t                                        dev_id;
-       uint16_t                                        ven_id;
-       uint8_t                                         irqline;
-       uint8_t                                         irqpin;
-       uint8_t                                         class;
-       uint8_t                                         subclass;
-       uint8_t                                         progif;
-};
-
-/* List of all discovered devices */
-STAILQ_HEAD(pcidev_stailq, pci_device);
-SLIST_HEAD(pcidev_slist, pci_device);
-extern struct pcidev_stailq pci_devices;
-/* Mapping of irq -> PCI device (TODO: make this PCI-agnostic) */
-extern struct pci_device *irq_pci_map[NUM_IRQS];
-
-void pci_init(void);
-void pcidev_print_info(struct pci_device *pcidev, int verbosity);
-
-/* Read and write helpers (Eventually, we should have these be statics, since no
- * device should touch PCI config space). */
-uint32_t pci_read32(unsigned short bus, unsigned short dev, unsigned short func,
-                    unsigned short offset);
-void pci_write32(unsigned short bus, unsigned short dev, unsigned short func,
-                    unsigned short offset, uint32_t value);
-uint32_t pcidev_read32(struct pci_device *pcidev, unsigned short offset);
-void pcidev_write32(struct pci_device *pcidev, unsigned short offset,
-                    uint32_t value);
-uint32_t pci_getbar(struct pci_device *pcidev, unsigned int bar);
-bool pci_is_iobar(uint32_t bar);
-uint32_t pci_getmembar32(uint32_t bar);
-uint32_t pci_getiobar32(uint32_t bar);
-
-#endif /* ROS_ARCH_PCI_H */
diff --git a/kern/arch/i686/pci_defs.h b/kern/arch/i686/pci_defs.h
deleted file mode 100644 (file)
index 512cf35..0000000
+++ /dev/null
@@ -1,8164 +0,0 @@
-#ifndef ROS_ARCH_PCI_DEFS_H
-#define ROS_ARCH_PCI_DEFS_H
-
-/* Pulled from: http://www.pcidatabase.com/pci_c_header.php.  Modified to make
- * it compile.  There are typos and whatnot.  If you notice some entry is wrong
- * or isn't descriptive enough, then change it.  Also consider trying to get the
- * entry updated at pcidatabase.com.
- * Note that some class descriptions aren't as complete as OSdev.org
- * http://wiki.osdev.org/PCI.  I added two IOAPIC entries. */
-
-#if 0
-
-PCIHDR.H: PCI Vendors, Devices, and Class Type information
-
-Created automatically from the web using the following URL:
-http://pcidatabase.com/
-Software to create and maintain the PCICODE List written by:
-Jim Boemler (jboemler@halcyon.com)
-
-  This header created on Mon Nov 22 12:28:25 PST 2010
-
-Too many people have contributed to this list to acknowledge them all, but
-a few have provided the majority of the input and deserve special mention:
-   Frederic Potter, who maintains a list for Linux.
-   Chris Aston at Madge Networks.
-   Thomas Dippon of Hewlett-Packard GmbH.
-   Jurgen ("Josh") Thelen
-   William H. Avery III at Altitech
-   Sergei Shtylyov of Brain-dead Software in Russia
-#endif
-
-//  NOTE that the 0xFFFF of 0xFF entries at the end of some tables below are
-//  not properly list terminators, but are actually the printable definitions
-//  of values that are legitimately found on the PCI bus.  The size
-//  definitions should be used for loop control when the table is searched.
-
-typedef struct _PCI_VENTABLE
-{
-       unsigned short  VenId ;
-       char *  VenShort ;
-       char *  VenFull ;
-}  PCI_VENTABLE, *PPCI_VENTABLE ;
-
-PCI_VENTABLE   PciVenTable [] =
-{
-       { 0x0033, "", "Paradyne Corp." } ,
-       { 0x003D, "well", "master" } ,
-       { 0x0070, "Hauppauge1", "Hauppauge Computer Works Inc." } ,
-       { 0x0100, "ncipher", "Ncipher Corp. Ltd" } ,
-       { 0x0123, "", "General Dynamics" } ,
-       { 0x0315, "", "SK - Electronics Co., Ltd." } ,
-       { 0x046D, " ", "Logitech Inc." } ,
-       { 0x04B3, " ", "IBM" } ,
-       { 0x04D9, " ", "Filco" } ,
-       { 0x051D, " ", "APC" } ,
-       { 0x058f, "Alcor", "Alcor Micro Corp." } ,
-       { 0x0590, " ", "Omron Corp" } ,
-       { 0x05ac, " ", "Apple, Inc." } ,
-       { 0x064e, " Suyin", "SUYIN Corporation" } ,
-       { 0x067B, "Prolific", "Prolific Technology Inc." } ,
-       { 0x0A5C, " ", "Broadcom Corporation" } ,
-       { 0x0A89, "BREA", "BREA Technologies Inc." } ,
-       { 0x0c45, "Microdia", "Microdia Ltd." } ,
-       { 0x0E11, "Compaq", "Compaq Computer Corp." } ,
-       { 0x1000, "LSI", "LSI Logic" } ,
-       { 0x1001, "KOLTER", "Kolter Electronic - Germany" } ,
-       { 0x1002, "ATI / AMD", "ATI Technologies Inc. / Advanced Micro Devices, Inc." } ,
-       { 0x1003, "ULSI", "ULSI" } ,
-       { 0x1004, "VLSI", "VLSI Technology" } ,
-       { 0x1006, "Reply", "Reply Group" } ,
-       { 0x1007, "NetFrame", "Netframe Systems Inc." } ,
-       { 0x1008, "Epson", "Epson" } ,
-       { 0x100A, "Phoenix", "Phoenix Technologies Ltd." } ,
-       { 0x100B, "NSC", "National Semiconductors" } ,
-       { 0x100C, "Tseng", "Tseng Labs" } ,
-       { 0x100D, "AST", "AST Research" } ,
-       { 0x100E, "Weitek", "Weitek" } ,
-       { 0x1010, "VLogic", "Video Logic Ltd." } ,
-       { 0x1011, "DEC", "Digital Equipment Corporation" } ,
-       { 0x1012, "Micronics", "Micronics Computers Inc." } ,
-       { 0x1013, "Cirrus", "Cirrus Logic" } ,
-       { 0x1014, "IBM", "International Business Machines Corp." } ,
-       { 0x1016, "Fujitsu ICL", "Fujitsu ICL Computers" } ,
-       { 0x1017, "Spea", "Spea Software AG" } ,
-       { 0x1018, "Unisys", "Unisys Systems" } ,
-       { 0x1019, "ECS", "Elitegroup Computer System" } ,
-       { 0x101A, "NCR", "NCR Corporation" } ,
-       { 0x101B, "Vitesse", "Vitesse Semiconductor" } ,
-       { 0x101E, "AMI", "American Megatrends Inc." } ,
-       { 0x101F, "PictureTel", "PictureTel Corp." } ,
-       { 0x1020, "Hitachi", "Hitachi Computer Electronics" } ,
-       { 0x1021, "OKI", "Oki Electric Industry" } ,
-       { 0x1022, "AMD", "Advanced Micro Devices" } ,
-       { 0x1023, "machdo", "TRIDENT MICRO" } ,
-       { 0x1025, "Acer", "Acer Incorporated" } ,
-       { 0x1028, "Dell", "Dell Computer Corporation" } ,
-       { 0x102A, "LSI", "LSI Logic Headland Division" } ,
-       { 0x102B, "Matrox", "Matrox Electronic Systems Ltd." } ,
-       { 0x102C, "C&T", "Asiliant (Chips And Technologies)" } ,
-       { 0x102D, "Wyse", "Wyse Technologies" } ,
-       { 0x102E, "Olivetti", "Olivetti Advanced Technology" } ,
-       { 0x102F, "U305-S7446", "Toshiba America" } ,
-       { 0x1030, "TMC", "TMC Research" } ,
-       { 0x1031, "miro", "miro Computer Products AG" } ,
-       { 0x1033, "NEC", "NEC Electronics" } ,
-       { 0x1034, "Burndy", "Burndy Corporation" } ,
-       { 0x1036, "FDomain", "Future Domain" } ,
-       { 0x1037, "Hitachi", "Hitachi Micro Systems Inc" } ,
-       { 0x1038, "AMP", "AMP Incorporated" } ,
-       { 0x1039, "sis", "SIS SMBus Controller" } ,
-       { 0x103A, "Seiko", "Seiko Epson Corporation" } ,
-       { 0x103B, "Tatung", "Tatung Corp. Of America" } ,
-       { 0x103C, "HP", "Hewlett-Packard Company" } ,
-       { 0x103E, "Solliday", "Solliday Engineering" } ,
-       { 0x103F, "Logic Mod.", "Logic Modeling" } ,
-       { 0x1041, "Computrend", "Computrend" } ,
-       { 0x1043, "Asustek", "Asustek Computer Inc." } ,
-       { 0x1044, "DPT", "Distributed Processing Tech" } ,
-       { 0x1045, "OPTi", "OPTi Inc." } ,
-       { 0x1046, "IPC", "IPC Corporation LTD" } ,
-       { 0x1047, "Genoa", "Genoa Systems Corp." } ,
-       { 0x1048, "ELSA", "ELSA GmbH" } ,
-       { 0x1049, "Fountain", "Fountain Technology" } ,
-       { 0x104A, "STM", "STMicroelectronics" } ,
-       { 0x104B, "", "Mylex / Buslogic" } ,
-       { 0x104C, "TI", "Texas Instruments" } ,
-       { 0x104D, "Sony", "Sony Corporation" } ,
-       { 0x104E, "Oak", "Oak Technology" } ,
-       { 0x104F, "Co-Time", "Co-Time Computer Ltd." } ,
-       { 0x1050, "Winbond", "Winbond Electronics Corp." } ,
-       { 0x1051, "Anigma", "Anigma Corp." } ,
-       { 0x1053, "Young", "Young Micro Systems" } ,
-       { 0x1054, "Hitachi", "Hitachi Ltd" } ,
-       { 0x1055, "SMSC", "Standard Microsystems Corp." } ,
-       { 0x1056, "ICL", "ICL" } ,
-       { 0x1057, "Motorola", "Motorola" } ,
-       { 0x1058, "E&TR", "Electronics & Telecommunication Res" } ,
-       { 0x1059, "Kontron", "Kontron Canada" } ,
-       { 0x105A, "Promise", "Promise Technology" } ,
-       { 0x105B, "Foxconn", "Foxconn International Inc." } ,
-       { 0x105C, "Wipro", "Wipro Infotech Limited" } ,
-       { 0x105D, "Number-Nine", "Number Nine Visual Technology" } ,
-       { 0x105E, "Vtech", "Vtech Engineering Canada Ltd." } ,
-       { 0x105F, "Infotronic", "Infotronic America Inc." } ,
-       { 0x1060, "UMC", "United Microelectronics" } ,
-       { 0x1061, "8x8", "8x8 Inc." } ,
-       { 0x1062, "Maspar", "Maspar Computer Corp." } ,
-       { 0x1063, "OOA", "Ocean Office Automation" } ,
-       { 0x1064, "Alcatel", "Alcatel Cit" } ,
-       { 0x1065, "TM", "Texas Microsystems" } ,
-       { 0x1066, "Picopower", "Picopower Technology" } ,
-       { 0x1067, "Mitsubishi", "Mitsubishi Electronics" } ,
-       { 0x1068, "Div. Tech.", "Diversified Technology" } ,
-       { 0x106A, "Aten", "Aten Research Inc." } ,
-       { 0x106B, "Apple", "Apple Inc." } ,
-       { 0x106C, "Hyundai", "Hyundai Electronics America" } ,
-       { 0x106D, "Sequent", "Sequent Computer Systems" } ,
-       { 0x106E, "DFI", "DFI Inc." } ,
-       { 0x106F, "CityGate", "City Gate Development LTD" } ,
-       { 0x1070, "Daewoo", "Daewoo Telecom Ltd." } ,
-       { 0x1071, "Mitac", "Mitac" } ,
-       { 0x1072, "GIT", "GIT Co. Ltd." } ,
-       { 0x1073, "Yamaha", "Yamaha Corporation" } ,
-       { 0x1074, "Nexgen", "Nexgen Microsystems" } ,
-       { 0x1075, "AIR", "Advanced Integration Research" } ,
-       { 0x1077, "QLogic", "QLogic Corporation" } ,
-       { 0x1078, "Cyrix", "Cyrix Corporation" } ,
-       { 0x1079, "I-Bus", "I-Bus" } ,
-       { 0x107A, "Networth", "Networth controls" } ,
-       { 0x107B, "Gateway", "Gateway 2000" } ,
-       { 0x107C, "Goldstar", "Goldstar Co. Ltd." } ,
-       { 0x107D, "Leadtek", "Leadtek Research" } ,
-       { 0x107E, "Interphase", "Testernec" } ,
-       { 0x107F, "DTC", "Data Technology Corporation" } ,
-       { 0x1080, "Cypress", "Cypress Semiconductor" } ,
-       { 0x1081, "Radius Inc.", "Radius Inc." } ,
-       { 0x1082, "EFA", "EFA Corporation Of America" } ,
-       { 0x1083, "Forex", "Forex Computer Corporation" } ,
-       { 0x1084, "Parador", "Parador" } ,
-       { 0x1085, "Tulip", "Tulip Computers Int'l BV" } ,
-       { 0x1086, "J. Bond", "J. Bond Computer Systems" } ,
-       { 0x1087, "Cache", "Cache Computer" } ,
-       { 0x1088, "MS Son.", "Microcomputer Systems (M) Son" } ,
-       { 0x1089, "DG", "Data General Corporation" } ,
-       { 0x108A, "Bit3", "SBS  Operations" } ,
-       { 0x108C, "Oakleigh", "Oakleigh Systems Inc." } ,
-       { 0x108D, "Olicom", "Olicom" } ,
-       { 0x108E, "Sun", "Sun Microsystems" } ,
-       { 0x108F, "Systemsoft", "Systemsoft Corporation" } ,
-       { 0x1090, "Encore", "Encore Computer Corporation" } ,
-       { 0x1091, "Intergraph", "Intergraph Corporation" } ,
-       { 0x1092, "Diamond", "Diamond Computer Systems" } ,
-       { 0x1093, "Nat. Inst.", "National Instruments" } ,
-       { 0x1094, "Apostolos", "Apostolos" } ,
-       { 0x1095, "Silicon Image", "Silicon Image, Inc." } ,
-       { 0x1096, "Alacron", "Alacron" } ,
-       { 0x1097, "Appian", "Appian Graphics" } ,
-       { 0x1098, "Quantum", "Quantum Designs Ltd." } ,
-       { 0x1099, "Samsung", "Samsung Electronics Co. Ltd." } ,
-       { 0x109A, "Packard-Bell", "Packard Bell" } ,
-       { 0x109B, "Gemlight", "Gemlight Computer Ltd." } ,
-       { 0x109C, "Megachips", "Megachips Corporation" } ,
-       { 0x109D, "Zida", "Zida Technologies Ltd." } ,
-       { 0x109E, "Brooktree", "Brooktree Corporation" } ,
-       { 0x109F, "Trigem", "Trigem Computer Inc." } ,
-       { 0x10A0, "Meidensha", "Meidensha Corporation" } ,
-       { 0x10A1, "Juko", "Juko Electronics Inc. Ltd." } ,
-       { 0x10A2, "Quantum", "Quantum Corporation" } ,
-       { 0x10A3, "Everex", "Everex Systems Inc." } ,
-       { 0x10A4, "Globe", "Globe Manufacturing Sales" } ,
-       { 0x10A5, "Racal", "Racal Interlan" } ,
-       { 0x10A8, "Sierra", "Sierra Semiconductor" } ,
-       { 0x10A9, "SG", "Silicon Graphics" } ,
-       { 0x10AB, "Digicom", "Digicom" } ,
-       { 0x10AC, "Honeywell", "Honeywell IASD" } ,
-       { 0x10AD, "Winbond", "Winbond Systems Labs" } ,
-       { 0x10AE, "Cornerstone", "Cornerstone Technology" } ,
-       { 0x10AF, "MCS", "Micro Computer Systems Inc." } ,
-       { 0x10B0, "CardExpert", "CardExpert Technology" } ,
-       { 0x10B1, "Cabletron", "Cabletron Systems Inc." } ,
-       { 0x10B2, "Raytheon", "Raytheon Company" } ,
-       { 0x10B3, "Databook", "Databook Inc." } ,
-       { 0x10B4, "STB", "STB Systems" } ,
-       { 0x10B5, "PLX", "PLX Technology Inc." } ,
-       { 0x10B6, "Madge", "Madge Networks" } ,
-       { 0x10B7, "3Com", "3Com Corporation" } ,
-       { 0x10B8, "SMC", "Standard Microsystems Corporation" } ,
-       { 0x10B9, "Ali", "Ali Corporation" } ,
-       { 0x10BA, "Mitsubishi", "Mitsubishi Electronics Corp." } ,
-       { 0x10BB, "Dapha", "Dapha Electronics Corporation" } ,
-       { 0x10BC, "ALR", "Advanced Logic Research Inc." } ,
-       { 0x10BD, "Surecom", "Surecom Technology" } ,
-       { 0x10BE, "Tseng", "Tsenglabs International Corp." } ,
-       { 0x10BF, "MOST", "MOST Corp." } ,
-       { 0x10C0, "Boca", "Boca Research Inc." } ,
-       { 0x10C1, "ICM", "ICM Corp. Ltd." } ,
-       { 0x10C2, "Auspex", "Auspex Systems Inc." } ,
-       { 0x10C3, "Samsung", "Samsung Semiconductors" } ,
-       { 0x10C4, "wim", "Award Software Int'l Inc." } ,
-       { 0x10C5, "Xerox", "Xerox Corporation" } ,
-       { 0x10C6, "Rambus", "Rambus Inc." } ,
-       { 0x10C8, "Neomagic", "Neomagic Corporation" } ,
-       { 0x10C9, "Dataexpert", "Dataexpert Corporation" } ,
-       { 0x10CA, "Fujitsu", "Fujitsu Siemens" } ,
-       { 0x10CB, "Omron", "Omron Corporation" } ,
-       { 0x10CD, "AdvanSys", "Advanced System Products" } ,
-       { 0x10CF, "Fujitsu", "Fujitsu Ltd." } ,
-       { 0x10D1, "Future+", "Future+ Systems" } ,
-       { 0x10D2, "Molex", "Molex Incorporated" } ,
-       { 0x10D3, "Jabil", "Jabil Circuit Inc." } ,
-       { 0x10D4, "Hualon", "Hualon Microelectronics" } ,
-       { 0x10D5, "Autologic", "Autologic Inc." } ,
-       { 0x10D6, "Wilson .co .ltd", "Wilson .co .ltd" } ,
-       { 0x10D7, "BCM", "BCM Advanced Research" } ,
-       { 0x10D8, "APL", "Advanced Peripherals Labs" } ,
-       { 0x10D9, "Macronix", "Macronix International Co. Ltd." } ,
-       { 0x10DB, "Rohm", "Rohm Research" } ,
-       { 0x10DC, "CERN", "CERN-European Lab. for Particle Physics" } ,
-       { 0x10DD, "E&S", "Evans & Sutherland" } ,
-       { 0x10DE, "NVIDIA", "NVIDIA Corporation" } ,
-       { 0x10DF, "Emulex", "Emulex Corporation" } ,
-       { 0x10E1, "Tekram", "Tekram Technology Corp. Ltd." } ,
-       { 0x10E2, "Aptix", "Aptix Corporation" } ,
-       { 0x10E3, "Tundra", "Tundra Semiconductor Corp." } ,
-       { 0x10E4, "Tandem", "Tandem Computers" } ,
-       { 0x10E5, "MIC", "Micro Industries Corporation" } ,
-       { 0x10E6, "Gainbery", "Gainbery Computer Products Inc." } ,
-       { 0x10E7, "Vadem", "Vadem" } ,
-       { 0x10E8, "AMCC", "Applied Micro Circuits Corp." } ,
-       { 0x10E9, "Alps", "Alps Electronic Corp. Ltd." } ,
-       { 0x10EA, "Tvia", "Tvia, Inc." } ,
-       { 0x10EB, "Artist", "Artist Graphics" } ,
-       { 0x10EC, "Realtek", "Realtek" } ,
-       { 0x10ED, "Ascii", "Ascii Corporation" } ,
-       { 0x10EE, "Xilinx", "Xilinx Corporation" } ,
-       { 0x10EF, "Racore", "Racore Computer Products" } ,
-       { 0x10F0, "Real-Time Graphics & Video", "Curtiss-Wright Controls Embedded Computing" } ,
-       { 0x10F1, "Tyan", "Tyan Computer" } ,
-       { 0x10F2, "Achme", "Achme Computer Inc. - GONE !!!!" } ,
-       { 0x10F3, "Alaris", "Alaris Inc." } ,
-       { 0x10F4, "S-Mos", "S-Mos Systems" } ,
-       { 0x10F5, "NKK", "NKK Corporation" } ,
-       { 0x10F6, "CES", "Creative Electronic Systems SA" } ,
-       { 0x10F7, "Matsushita", "Matsushita Electric Industrial Corp." } ,
-       { 0x10F8, "Altos", "Altos India Ltd." } ,
-       { 0x10F9, "PC-Direct", "PC Direct" } ,
-       { 0x10FA, "Truevision", "Truevision" } ,
-       { 0x10FB, "Thesys", "Thesys Microelectronic's" } ,
-       { 0x10FC, "I-O", "I-O Data Device Inc." } ,
-       { 0x10FD, "Soyo", "Soyo Technology Corp. Ltd." } ,
-       { 0x10FE, "Fast", "Fast Electronic GmbH" } ,
-       { 0x10FF, "Ncube", "Ncube" } ,
-       { 0x1100, "Jazz", "Jazz Multimedia" } ,
-       { 0x1101, "Initio", "Initio Corporation" } ,
-       { 0x1102, "Creative Labs", "Creative Technology LTD." } ,
-       { 0x1103, "Highpoint", "Triones Technologies Inc. (HighPoint)" } ,
-       { 0x1104, "Rasterops", "Rasterops" } ,
-       { 0x1105, "Sigma", "Sigma Designs Inc." } ,
-       { 0x1106, "VIA", "VIA Technologies, Inc." } ,
-       { 0x1107, "Stratus", "Stratus Computer" } ,
-       { 0x1108, "Proteon", "Proteon Inc." } ,
-       { 0x1109, "Cogent", "Adaptec/Cogent Data Technologies" } ,
-       { 0x110A, "Siemens", "Siemens Nixdorf AG" } ,
-       { 0x110B, "Chromatic", "Chromatic Research Inc" } ,
-       { 0x110C, "Mini-Max", "Mini-Max Technology Inc." } ,
-       { 0x110D, "ZNYX", "ZNYX Corporation" } ,
-       { 0x110E, "CPU Tech.", "CPU Technology" } ,
-       { 0x110F, "Ross", "Ross Technology" } ,
-       { 0x1112, "Osicom", "Osicom Technologies Inc." } ,
-       { 0x1113, "Accton", "Accton Technology Corporation" } ,
-       { 0x1114, "Atmel", "Atmel Corp." } ,
-       { 0x1116, "Data Translation", "Data Translation, Inc." } ,
-       { 0x1117, "Datacube", "Datacube Inc." } ,
-       { 0x1118, "Berg", "Berg Electronics" } ,
-       { 0x1119, "Vortex", "ICP vortex Computersysteme GmbH" } ,
-       { 0x111A, "Eff. Net.", "Efficent Networks" } ,
-       { 0x111C, "Tricord", "Tricord Systems Inc." } ,
-       { 0x111D, "IDT", "Integrated Device Technology Inc." } ,
-       { 0x111F, "PDI", "Precision Digital Images" } ,
-       { 0x1120, "EMC", "EMC Corp." } ,
-       { 0x1121, "Zilog", "Zilog" } ,
-       { 0x1123, "EDI", "Excellent Design Inc." } ,
-       { 0x1124, "Leutron", "Leutron Vision AG" } ,
-       { 0x1125, "Eurocore", "Eurocore/Vigra" } ,
-       { 0x1127, "FORE RUNNER LE", "FORE Systems" } ,
-       { 0x1129, "Firmworks", "Firmworks" } ,
-       { 0x112A, "Hermes", "Hermes Electronics Co. Ltd." } ,
-       { 0x112C, "Zenith", "Zenith Data Systems" } ,
-       { 0x112D, "Ravicad", "Ravicad" } ,
-       { 0x112E, "Infomedia", "Infomedia" } ,
-       { 0x1130, "Computervision", "Computervision" } ,
-       { 0x1131, "LifeView", "Animation Technologies Inc" } ,
-       { 0x1132, "Mitel", "Mitel Corp." } ,
-       { 0x1133, "EIC", "Eicon Networks Corporation" } ,
-       { 0x1134, "MCS", "Mercury Computer Systems Inc." } ,
-       { 0x1135, "Fuji", "Fuji Xerox Co Ltd" } ,
-       { 0x1136, "Momentum", "Momentum Data Systems" } ,
-       { 0x1137, "Cisco", "Cisco Systems Inc" } ,
-       { 0x1138, "Ziatech", "Ziatech Corporation" } ,
-       { 0x1139, "Dyn. Pict.", "Dynamic Pictures Inc" } ,
-       { 0x113A, "FWB", "FWB  Inc" } ,
-       { 0x113B, "NCD", "Network Computing Devices" } ,
-       { 0x113C, "Cyclone", "Cyclone Microsystems Inc." } ,
-       { 0x113D, "Leading Edge", "Leading Edge Products Inc" } ,
-       { 0x113E, "Sanyo", "Sanyo Electric Co" } ,
-       { 0x113F, "Equinox", "Equinox Systems" } ,
-       { 0x1140, "Intervoice", "Intervoice Inc" } ,
-       { 0x1141, "Crest", "Crest Microsystem Inc" } ,
-       { 0x1142, "Alliance", "Alliance Semiconductor" } ,
-       { 0x1143, "Netpower", "Netpower Inc" } ,
-       { 0x1144, "Cinn. Mil.", "Cincinnati Milacron" } ,
-       { 0x1145, "Workbit", "Workbit Corp" } ,
-       { 0x1146, "Force", "Force Computers" } ,
-       { 0x1147, "Interface", "Interface Corp" } ,
-       { 0x1148, "Marvell", "Marvell Semiconductor Germany GmbH" } ,
-       { 0x1149, "Win System", "Win System Corporation" } ,
-       { 0x114A, "VMIC", "VMIC" } ,
-       { 0x114B, "Canopus", "Canopus corporation" } ,
-       { 0x114C, "Annabooks", "Annabooks" } ,
-       { 0x114D, "IC Corp.", "IC Corporation" } ,
-       { 0x114E, "Nikon", "Nikon Systems Inc" } ,
-       { 0x114F, "Digi", "Digi International" } ,
-       { 0x1150, "TMC", "Thinking Machines Corporation" } ,
-       { 0x1151, "JAE", "JAE Electronics Inc." } ,
-       { 0x1153, "Land Win", "Land Win Electronic Corp" } ,
-       { 0x1154, "Melco", "Melco Inc" } ,
-       { 0x1155, "Pine", "Pine Technology Ltd" } ,
-       { 0x1156, "Periscope", "Periscope Engineering" } ,
-       { 0x1157, "Avsys", "Avsys Corporation" } ,
-       { 0x1158, "Voarx", "Voarx R&D Inc" } ,
-       { 0x1159, "Mutech", "Mutech" } ,
-       { 0x115A, "Harlequin", "Harlequin Ltd" } ,
-       { 0x115B, "Parallax", "Parallax Graphics" } ,
-       { 0x115C, "Photron", "Photron Ltd." } ,
-       { 0x115D, "Xircom", "Xircom" } ,
-       { 0x115E, "Peer", "Peer Protocols Inc" } ,
-       { 0x115F, "Maxtorr", "Maxtor Corporation" } ,
-       { 0x1160, "Megasoft", "Megasoft Inc" } ,
-       { 0x1161, "PFU", "PFU Ltd" } ,
-       { 0x1162, "OA Lab", "OA Laboratory Co Ltd" } ,
-       { 0x1163, "mohamed", "mohamed alsherif" } ,
-       { 0x1164, "APT", "Advanced Peripherals Tech" } ,
-       { 0x1165, "Imagraph", "Imagraph Corporation" } ,
-       { 0x1166, "BRCM/ServerWorks", "Broadcom / ServerWorks" } ,
-       { 0x1167, "Mutoh", "Mutoh Industries Inc" } ,
-       { 0x1168, "Thine", "Thine Electronics Inc" } ,
-       { 0x1169, "CDAC", "Centre f/Dev. of Adv. Computing" } ,
-       { 0x116A, "Luminex", "Luminex Software, Inc" } ,
-       { 0x116B, "Connectware", "Connectware Inc" } ,
-       { 0x116C, "Int Res.", "Intelligent Resources" } ,
-       { 0x116E, "EFI", "Electronics for Imaging" } ,
-       { 0x1170, "Inventec", "Inventec Corporation" } ,
-       { 0x1172, "Altera", "Altera Corporation" } ,
-       { 0x1173, "Adobe", "Adobe Systems" } ,
-       { 0x1174, "Bridgeport", "Bridgeport Machines" } ,
-       { 0x1175, "Mitron", "Mitron Computer Inc." } ,
-       { 0x1176, "SBE", "SBE" } ,
-       { 0x1177, "Silicon Eng.", "Silicon Engineering" } ,
-       { 0x1178, "Alfa", "Alfa Inc" } ,
-       { 0x1179, "Toshiba", "Toshiba corporative" } ,
-       { 0x117A, "A-Trend", "A-Trend Technology" } ,
-       { 0x117B, "LG", "LG (Lucky Goldstar) Electronics Inc." } ,
-       { 0x117C, "Atto", "Atto Technology" } ,
-       { 0x117D, "B&D", "Becton & Dickinson" } ,
-       { 0x117E, "T/R", "T/R Systems" } ,
-       { 0x117F, "ICS", "Integrated Circuit Systems" } ,
-       { 0x1180, "Fic", "Ricoh" } ,
-       { 0x1183, "Fujikura", "Fujikura Ltd" } ,
-       { 0x1184, "Forks", "Forks Inc" } ,
-       { 0x1185, "Dataworld", "Dataworld" } ,
-       { 0x1186, "D-Link", "D-Link System Inc" } ,
-       { 0x1187, "ATL", "Advanced Technology Laboratories" } ,
-       { 0x1188, "Shima", "Shima Seiki Manufacturing Ltd." } ,
-       { 0x1189, "Matsushita", "Matsushita Electronics" } ,
-       { 0x118A, "Hilevel", "Hilevel Technology" } ,
-       { 0x118B, "Hypertec", "Hypertec Pty Ltd" } ,
-       { 0x118C, "Corollary", "Corollary Inc" } ,
-       { 0x118D, "BitFlow", "BitFlow Inc" } ,
-       { 0x118E, "Hermstedt", "Hermstedt AG" } ,
-       { 0x118F, "Green", "Green Logic" } ,
-       { 0x1190, "Tripace", "Tripace" } ,
-       { 0x1191, "Acard", "Acard Technology Corp." } ,
-       { 0x1192, "Densan", "Densan Co. Ltd" } ,
-       { 0x1194, "Toucan", "Toucan Technology" } ,
-       { 0x1195, "Ratoc", "Ratoc System Inc" } ,
-       { 0x1196, "Hytec", "Hytec Electronics Ltd" } ,
-       { 0x1197, "Gage", "Gage Applied Technologies" } ,
-       { 0x1198, "Lambda", "Lambda Systems Inc" } ,
-       { 0x1199, "Attachmate", "Attachmate Corp." } ,
-       { 0x119A, "Mind Share", "Mind/Share Inc." } ,
-       { 0x119B, "Omega", "Omega Micro Inc." } ,
-       { 0x119C, "ITI", "Information Technology Inst." } ,
-       { 0x119D, "Bug", "Bug Sapporo Japan" } ,
-       { 0x119E, "Fujitsu", "Fujitsu Microelectronics Ltd." } ,
-       { 0x119F, "Bull", "Bull Hn Information Systems" } ,
-       { 0x11A1, "Hamamatsu", "Hamamatsu Photonics K.K." } ,
-       { 0x11A2, "Sierra", "Sierra Research and Technology" } ,
-       { 0x11A3, "Deuretzbacher", "Deuretzbacher GmbH & Co. Eng. KG" } ,
-       { 0x11A4, "Barco", "Barco" } ,
-       { 0x11A5, "MicroUnity", "MicroUnity Systems Engineering Inc." } ,
-       { 0x11A6, "Pure Data", "Pure Data" } ,
-       { 0x11A7, "Power Comp.", "Power Computing Corp." } ,
-       { 0x11A8, "Systech", "Systech Corp." } ,
-       { 0x11A9, "InnoSys", "InnoSys Inc." } ,
-       { 0x11AA, "Actel", "Actel" } ,
-       { 0x11AB, "Marvell", "Marvell Semiconductor" } ,
-       { 0x11AC, "Canon", "Canon Information Systems" } ,
-       { 0x11AD, "Lite-On", "Lite-On Technology Corp." } ,
-       { 0x11AE, "Scitex", "Scitex Corporation Ltd" } ,
-       { 0x11AF, "Avid", "Avid Technology, Inc." } ,
-       { 0x11B0, "QuickLogic", "Quicklogic Corp" } ,
-       { 0x11B1, "Apricot", "Apricot Computers" } ,
-       { 0x11B2, "Kodak", "Eastman Kodak" } ,
-       { 0x11B3, "Barr", "Barr Systems Inc." } ,
-       { 0x11B4, "Leitch", "Leitch Technology International" } ,
-       { 0x11B5, "Radstone", "Radstone Technology Ltd." } ,
-       { 0x11B6, "United Video", "United Video Corp" } ,
-       { 0x11B7, "Motorola", "Motorola" } ,
-       { 0x11B8, "Xpoint", "Xpoint Technologies Inc" } ,
-       { 0x11B9, "Pathlight", "Pathlight Technology Inc." } ,
-       { 0x11BA, "Videotron", "Videotron Corp" } ,
-       { 0x11BB, "Pyramid", "Pyramid Technology" } ,
-       { 0x11BC, "Net. Periph.", "Network Peripherals Inc" } ,
-       { 0x11BD, "LOTA GEDEON", "NABOHO/INFORMATICIEN /BURKINA" } ,
-       { 0x11BE, "IMI", "International Microcircuits Inc" } ,
-       { 0x11BF, "Astrodesign", "Astrodesign Inc." } ,
-       { 0x11C1, "Agere", "Agere Systems, Inc." } ,
-       { 0x11C2, "Sand", "Sand Microelectronics" } ,
-       { 0x11C4, "Doc. Tech.", "Document Technologies Ind." } ,
-       { 0x11C5, "Shiva", "Shiva Corporatin" } ,
-       { 0x11C6, "Dainippon", "Dainippon Screen Mfg. Co" } ,
-       { 0x11C7, "D.C.M.", "D.C.M. Data Systems" } ,
-       { 0x11C8, "Dolphin", "Dolphin Interconnect Solutions" } ,
-       { 0x11C9, "MAGMA", "MAGMA" } ,
-       { 0x11CA, "LSI Sys.", "LSI Systems Inc" } ,
-       { 0x11CB, "Specialix", "Specialix International Ltd." } ,
-       { 0x11CC, "M&K", "Michels & Kleberhoff Computer GmbH" } ,
-       { 0x11CD, "HAL", "HAL Computer Systems Inc." } ,
-       { 0x11CE, "PRI", "Primary Rate Inc" } ,
-       { 0x11CF, "PEC", "Pioneer Electronic Corporation" } ,
-       { 0x11D0, "BAE", "BAE SYSTEMS - Manassas" } ,
-       { 0x11D1, "AuraVision", "AuraVision Corporation" } ,
-       { 0x11D2, "Intercom", "Intercom Inc." } ,
-       { 0x11D3, "Trancell", "Trancell Systems Inc" } ,
-       { 0x11D4, "ADI", "Analog Devices, Inc." } ,
-       { 0x11D5, "Tahoma", "Tahoma Technology" } ,
-       { 0x11D6, "Tekelec", "Tekelec Technologies" } ,
-       { 0x11D7, "Trenton", "TRENTON Technology, Inc." } ,
-       { 0x11D8, "ITD", "Image Technologies Development" } ,
-       { 0x11D9, "Tec", "Tec Corporation" } ,
-       { 0x11DA, "Novell", "Novell" } ,
-       { 0x11DB, "Sega", "Sega Enterprises Ltd" } ,
-       { 0x11DC, "Questra", "Questra Corp" } ,
-       { 0x11DD, "Crosfield", "Crosfield Electronics Ltd" } ,
-       { 0x11DE, "Zoran", "Zoran Corporation" } ,
-       { 0x11E1, "Gec Plessey", "Gec Plessey Semi Inc" } ,
-       { 0x11E2, "Samsung", "Samsung Information Systems America" } ,
-       { 0x11E3, "QuickLogic", "Quicklogic Corp" } ,
-       { 0x11E4, "Second Wave", "Second Wave Inc" } ,
-       { 0x11E5, "IIX", "IIX Consulting" } ,
-       { 0x11E6, "Mitsui", "Mitsui-Zosen System Research" } ,
-       { 0x11E8, "DPSI", "Digital Processing Systems Inc" } ,
-       { 0x11E9, "Highwater", "Highwater Designs Ltd" } ,
-       { 0x11EA, "Elsag", "Elsag Bailey" } ,
-       { 0x11EB, "Formation", "Formation, Inc" } ,
-       { 0x11EC, "Coreco", "Coreco Inc" } ,
-       { 0x11ED, "Mediamatics", "Mediamatics" } ,
-       { 0x11EE, "Dome", "Dome Imaging Systems Inc" } ,
-       { 0x11EF, "Nicolet", "Nicolet Technologies BV" } ,
-       { 0x11F0, "Compu-Shack", "Compu-Shack GmbH" } ,
-       { 0x11F2, "Pic-Tel", "Picture Tel Japan KK" } ,
-       { 0x11F3, "Keithley", "Keithley Instruments, Inc" } ,
-       { 0x11F4, "Kinetic", "Kinetic Systems Corporation" } ,
-       { 0x11F5, "Comp Dev", "Computing Devices Intl" } ,
-       { 0x11F6, "Powermatic", "Powermatic Data Systems Ltd" } ,
-       { 0x11F7, "S-A", "Scientific Atlanta" } ,
-       { 0x11F8, "PMC-Sierra", "PMC-Sierra Inc." } ,
-       { 0x11F9, "I-Cube", "I-Cube Inc" } ,
-       { 0x11FA, "Kasan", "Kasan Electronics Co Ltd" } ,
-       { 0x11FB, "Datel", "Datel Inc" } ,
-       { 0x11FD, "High Street", "High Street Consultants" } ,
-       { 0x11FE, "Comtrol", "Comtrol Corp" } ,
-       { 0x11FF, "Scion", "Scion Corp" } ,
-       { 0x1200, "CSS", "CSS Corp" } ,
-       { 0x1201, "Vista", "Vista Controls Corp" } ,
-       { 0x1202, "Network Gen", "Network General Corp" } ,
-       { 0x1203, "Agfa", "Bayer Corporation Agfa Div" } ,
-       { 0x1204, "Lattice", "Lattice Semiconductor Corp" } ,
-       { 0x1205, "Array", "Array Corp" } ,
-       { 0x1206, "Amdahl", "Amdahl Corp" } ,
-       { 0x1208, "Parsytec", "Parsytec GmbH" } ,
-       { 0x1209, "Sci Sys", "Sci Systems Inc" } ,
-       { 0x120A, "Synaptel", "Synaptel" } ,
-       { 0x120B, "Adaptive", "Adaptive Solutions" } ,
-       { 0x120D, "Comp Labs", "Compression Labs Inc." } ,
-       { 0x120E, "Cyclades", "Cyclades Corporation" } ,
-       { 0x120F, "Essential", "Essential Communications" } ,
-       { 0x1210, "Hyperparallel", "Hyperparallel Technologies" } ,
-       { 0x1211, "Braintech", "Braintech Inc" } ,
-       { 0x1213, "AISI", "Applied Intelligent Systems Inc" } ,
-       { 0x1214, "Perf Tech", "Performance Technologies Inc" } ,
-       { 0x1215, "Interware", "Interware Co Ltd" } ,
-       { 0x1216, "Purup Eskofot", "Purup-Eskofot A/S" } ,
-       { 0x1217, "O2Micro", "O2Micro Inc" } ,
-       { 0x1218, "Hybricon", "Hybricon Corp" } ,
-       { 0x1219, "First Virtual", "First Virtual Corp" } ,
-       { 0x121A, "3dfx", "3dfx Interactive Inc" } ,
-       { 0x121B, "ATM", "Advanced Telecommunications Modules" } ,
-       { 0x121C, "Nippon Texa", "Nippon Texa Co Ltd" } ,
-       { 0x121D, "Lippert", "Lippert Automationstechnik GmbH" } ,
-       { 0x121E, "CSPI", "CSPI" } ,
-       { 0x121F, "Arcus", "Arcus Technology Inc" } ,
-       { 0x1220, "Ariel", "Ariel Corporation" } ,
-       { 0x1221, "Contec", "Contec Microelectronics Europe BV" } ,
-       { 0x1222, "Ancor", "Ancor Communications Inc" } ,
-       { 0x1223, "Emerson Network Power", "Emerson Network Power, Embedded Computing" } ,
-       { 0x1224, "Int. Img.", "Interactive Images" } ,
-       { 0x1225, "Power IO", "Power I/O Inc." } ,
-       { 0x1227, "Tech-Source", "Tech-Source" } ,
-       { 0x1228, "Norsk", "Norsk Elektro Optikk A/S" } ,
-       { 0x1229, "Data Kin", "Data Kinesis Inc." } ,
-       { 0x122A, "Int. Telecom", "Integrated Telecom" } ,
-       { 0x122B, "LG Ind.", "LG Industrial Systems Co. Ltd." } ,
-       { 0x122C, "sci-worx", "sci-worx GmbH" } ,
-       { 0x122D, "Aztech", "Aztech System Ltd" } ,
-       { 0x122E, "Absolute Analysis", "Absolute Analysis" } ,
-       { 0x122F, "Andrew", "Andrew Corp." } ,
-       { 0x1230, "Fishcamp", "Fishcamp Engineering" } ,
-       { 0x1231, "WMI", "Woodward McCoach Inc." } ,
-       { 0x1233, "Bus-Tech", "Bus-Tech Inc." } ,
-       { 0x1234, "Technical", "Technical Corp" } ,
-       { 0x1236, "Sigma Designs", "Sigma Designs, Inc" } ,
-       { 0x1237, "Alta Tech", "Alta Technology Corp." } ,
-       { 0x1238, "Adtran", "Adtran" } ,
-       { 0x1239, "3DO", "The 3DO Company" } ,
-       { 0x123A, "Visicom", "Visicom Laboratories Inc." } ,
-       { 0x123B, "Seeq", "Seeq Technology Inc." } ,
-       { 0x123C, "Century Sys", "Century Systems Inc." } ,
-       { 0x123D, "EDT", "Engineering Design Team Inc." } ,
-       { 0x123F, "C-Cube", "C-Cube Microsystems" } ,
-       { 0x1240, "Marathon", "Marathon Technologies Corp." } ,
-       { 0x1241, "DSC", "DSC Communications" } ,
-       { 0x1242, "JNI", "JNI Corporation" } ,
-       { 0x1243, "Delphax", "Delphax" } ,
-       { 0x1244, "AVM", "AVM AUDIOVISUELLES MKTG & Computer GmbH" } ,
-       { 0x1245, "APD", "APD S.A." } ,
-       { 0x1246, "Dipix", "Dipix Technologies Inc" } ,
-       { 0x1247, "Xylon", "Xylon Research Inc." } ,
-       { 0x1248, "Central Data", "Central Data Corp." } ,
-       { 0x1249, "Samsung", "Samsung Electronics Co. Ltd." } ,
-       { 0x124A, "AEG", "AEG Electrocom GmbH" } ,
-       { 0x124C, "Solitron", "Solitron Technologies Inc." } ,
-       { 0x124D, "Stallion", "Stallion Technologies" } ,
-       { 0x124E, "Cylink", "Cylink" } ,
-       { 0x124F, "Infortrend", "Infortrend Technology Inc" } ,
-       { 0x1250, "Hitachi", "Hitachi Microcomputer System Ltd." } ,
-       { 0x1251, "VLSI Sol.", "VLSI Solution OY" } ,
-       { 0x1253, "Guzik", "Guzik Technical Enterprises" } ,
-       { 0x1254, "Linear Systems", "Linear Systems Ltd." } ,
-       { 0x1255, "Optibase", "Optibase Ltd." } ,
-       { 0x1256, "Perceptive", "Perceptive Solutions Inc." } ,
-       { 0x1257, "Vertex", "Vertex Networks Inc." } ,
-       { 0x1258, "Gilbarco", "Gilbarco Inc." } ,
-       { 0x1259, "Allied Tsyn", "Allied Telesyn International" } ,
-       { 0x125A, "ABB Pwr", "ABB Power Systems" } ,
-       { 0x125B, "Asix", "Asix Electronics Corp." } ,
-       { 0x125C, "Aurora", "Aurora Technologies Inc." } ,
-       { 0x125D, "ESS", "ESS Technology" } ,
-       { 0x125E, "Specvideo", "Specialvideo Engineering SRL" } ,
-       { 0x125F, "Concurrent", "Concurrent Technologies Inc." } ,
-       { 0x1260, "Intersil", "Intersil Corporation" } ,
-       { 0x1261, "Matsushita", "Matsushita-Kotobuki Electronics Indu" } ,
-       { 0x1262, "ES Comp.", "ES Computer Co. Ltd." } ,
-       { 0x1263, "Sonic Sol.", "Sonic Solutions" } ,
-       { 0x1264, "Aval Nag.", "Aval Nagasaki Corp." } ,
-       { 0x1265, "Casio", "Casio Computer Co. Ltd." } ,
-       { 0x1266, "Microdyne", "Microdyne Corp." } ,
-       { 0x1267, "SA Telecom", "S.A. Telecommunications" } ,
-       { 0x1268, "Tektronix", "Tektronix" } ,
-       { 0x1269, "SGS Thomson", "Thomson-CSF/TTM" } ,
-       { 0x126A, "Lexmark", "Lexmark International Inc." } ,
-       { 0x126B, "Adax", "Adax Inc." } ,
-       { 0x126C, "Nortel", "Nortel Networks Corp." } ,
-       { 0x126D, "Splash", "Splash Technology Inc." } ,
-       { 0x126E, "Sumitomo", "Sumitomo Metal Industries Ltd." } ,
-       { 0x126F, "Sil Motion", "Silicon Motion" } ,
-       { 0x1270, "Olympus", "Olympus Optical Co. Ltd." } ,
-       { 0x1271, "GW Instr.", "GW Instruments" } ,
-       { 0x1272, "Telematics", "Telematics International" } ,
-       { 0x1273, "Hughes", "Hughes Network Systems" } ,
-       { 0x1274, "Ensoniq", "Ensoniq" } ,
-       { 0x1275, "NetApp", "Network Appliance" } ,
-       { 0x1276, "Sw Net Tech", "Switched Network Technologies Inc." } ,
-       { 0x1277, "Comstream", "Comstream" } ,
-       { 0x1278, "Transtech", "Transtech Parallel Systems" } ,
-       { 0x1279, "Transmeta", "Transmeta Corp." } ,
-       { 0x127B, "Pixera", "Pixera Corp" } ,
-       { 0x127C, "Crosspoint", "Crosspoint Solutions Inc." } ,
-       { 0x127D, "Vela", "Vela Research LP" } ,
-       { 0x127E, "Winnow", "Winnov L.P." } ,
-       { 0x127F, "Fujifilm", "Fujifilm" } ,
-       { 0x1280, "Photoscript", "Photoscript Group Ltd." } ,
-       { 0x1281, "Yokogawa", "Yokogawa Electronic Corp." } ,
-       { 0x1282, "Davicom", "Davicom Semiconductor Inc." } ,
-       { 0x1283, " Zamora", "Waldo" } ,
-       { 0x1285, "Plat Tech", "Platform Technologies Inc." } ,
-       { 0x1286, "MAZeT", "MAZeT GmbH" } ,
-       { 0x1287, "LuxSonor", "LuxSonor Inc." } ,
-       { 0x1288, "Timestep", "Timestep Corp." } ,
-       { 0x1289, "AVC Tech", "AVC Technology Inc." } ,
-       { 0x128A, "Asante", "Asante Technologies Inc." } ,
-       { 0x128B, "Transwitch", "Transwitch Corp." } ,
-       { 0x128C, "Retix", "Retix Corp." } ,
-       { 0x128D, "G2 Net", "G2 Networks Inc." } ,
-       { 0x128F, "Tateno", "Tateno Dennou Inc." } ,
-       { 0x1290, "Sord", "Sord Computer Corp." } ,
-       { 0x1291, "NCS Comp", "NCS Computer Italia" } ,
-       { 0x1292, "Tritech", "Tritech Microelectronics Intl PTE" } ,
-       { 0x1293, "M Reality", "Media Reality Technology" } ,
-       { 0x1294, "Rhetorex", "Rhetorex Inc." } ,
-       { 0x1295, "Imagenation", "Imagenation Corp." } ,
-       { 0x1296, "Kofax", "Kofax Image Products" } ,
-       { 0x1297, "Shuttle Computer", "Shuttle Computer" } ,
-       { 0x1298, "Spellcaster", "Spellcaster Telecommunications Inc." } ,
-       { 0x1299, "Know Tech", "Knowledge Technology Laboratories" } ,
-       { 0x129A, "VMETRO", "VMETRO Inc." } ,
-       { 0x129B, "Img Access", "Image Access" } ,
-       { 0x129D, "CompCore", "CompCore Multimedia Inc." } ,
-       { 0x129E, "Victor Jpn", "Victor Co. of Japan Ltd." } ,
-       { 0x129F, "OEC Med", "OEC Medical Systems Inc." } ,
-       { 0x12A0, "A-B", "Allen Bradley Co." } ,
-       { 0x12A1, "Simpact", "Simpact Inc" } ,
-       { 0x12A2, "NewGen", "NewGen Systems Corp." } ,
-       { 0x12A3, "Lucent", "Lucent Technologies AMR" } ,
-       { 0x12A4, "NTT Elect", "NTT Electronics Technology Co." } ,
-       { 0x12A5, "Vision Dyn", "Vision Dynamics Ltd." } ,
-       { 0x12A6, "Scalable", "Scalable Networks Inc." } ,
-       { 0x12A7, "AMO", "AMO GmbH" } ,
-       { 0x12A8, "News Datacom", "News Datacom" } ,
-       { 0x12A9, "Xiotech", "Xiotech Corp." } ,
-       { 0x12AA, "SDL", "SDL Communications Inc." } ,
-       { 0x12AB, "Yuan Yuan", "Yuan Yuan Enterprise Co. Ltd." } ,
-       { 0x12AC, "MeasureX", "MeasureX Corp." } ,
-       { 0x12AD, "MULTIDATA", "MULTIDATA GmbH" } ,
-       { 0x12AE, "Alteon", "Alteon Networks Inc." } ,
-       { 0x12AF, "TDK USA", "TDK USA Corp." } ,
-       { 0x12B0, "Jorge Sci", "Jorge Scientific Corp." } ,
-       { 0x12B1, "GammaLink", "GammaLink" } ,
-       { 0x12B2, "Gen Signal", "General Signal Networks" } ,
-       { 0x12B3, "Interface", "Interface Corp. Ltd." } ,
-       { 0x12B4, "Future Tel", "Future Tel Inc." } ,
-       { 0x12B5, "Granite", "Granite Systems Inc." } ,
-       { 0x12B7, "Acumen", "Acumen" } ,
-       { 0x12B8, "Korg", "Korg" } ,
-       { 0x12B9, "3Com", "3Com Corporation" } ,
-       { 0x12BA, "Bittware", "Bittware, Inc" } ,
-       { 0x12BB, "Nippon Uni", "Nippon Unisoft Corp." } ,
-       { 0x12BC, "Array Micro", "Array Microsystems" } ,
-       { 0x12BD, "Computerm", "Computerm Corp." } ,
-       { 0x12BF, "Fujifilm", "Fujifilm Microdevices" } ,
-       { 0x12C0, "Infimed", "Infimed" } ,
-       { 0x12C1, "GMM Res", "GMM Research Corp." } ,
-       { 0x12C2, "Mentec", "Mentec Ltd." } ,
-       { 0x12C3, "Holtek", "Holtek Microelectronics Inc." } ,
-       { 0x12C4, "Connect Tech", "Connect Tech Inc." } ,
-       { 0x12C5, "PicturEl", "Picture Elements Inc." } ,
-       { 0x12C6, "Mitani", "Mitani Corp." } ,
-       { 0x12C7, "Dialogic", "Dialogic Corp." } ,
-       { 0x12C8, "G Force", "G Force Co. Ltd." } ,
-       { 0x12C9, "Gigi Ops", "Gigi Operations" } ,
-       { 0x12CA, "ICE", "Integrated Computing Engines, Inc." } ,
-       { 0x12CB, "Antex", "Antex Electronics Corp." } ,
-       { 0x12CC, "Pluto", "Pluto Technologies International" } ,
-       { 0x12CD, "Aims Lab", "Aims Lab" } ,
-       { 0x12CE, "Netspeed", "Netspeed Inc." } ,
-       { 0x12CF, "Prophet", "Prophet Systems Inc." } ,
-       { 0x12D0, "GDE Sys", "GDE Systems Inc." } ,
-       { 0x12D1, "Huawai Inc.", "Huawei Technologies Co., Ltd." } ,
-       { 0x12D3, "Vingmed", "Vingmed Sound A/S" } ,
-       { 0x12D4, "Ulticom", "Ulticom, Inc." } ,
-       { 0x12D5, "Equator", "Equator Technologies" } ,
-       { 0x12D6, "Analogic", "Analogic Corp." } ,
-       { 0x12D7, "Biotronic", "Biotronic SRL" } ,
-       { 0x12D8, "Pericom", "Pericom Semiconductor" } ,
-       { 0x12D9, "Aculab", "Aculab Plc." } ,
-       { 0x12DA, "TrueTime", "TrueTime" } ,
-       { 0x12DB, "Annapolis", "Annapolis Micro Systems Inc." } ,
-       { 0x12DC, "Symicron", "Symicron Computer Communication Ltd." } ,
-       { 0x12DD, "MGI", "Management Graphics Inc." } ,
-       { 0x12DE, "Rainbow", "Rainbow Technologies" } ,
-       { 0x12DF, "SBS Tech", "SBS Technologies Inc." } ,
-       { 0x12E0, "Chase", "Chase Research PLC" } ,
-       { 0x12E1, "Nintendo", "Nintendo Co. Ltd." } ,
-       { 0x12E2, "Datum", "Datum Inc. Bancomm-Timing Division" } ,
-       { 0x12E3, "Imation", "Imation Corp. - Medical Imaging Syst" } ,
-       { 0x12E4, "Brooktrout", "Brooktrout Technology Inc." } ,
-       { 0x12E6, "Cirel", "Cirel Systems" } ,
-       { 0x12E7, "Sebring", "Sebring Systems Inc" } ,
-       { 0x12E8, "CRISC", "CRISC Corp." } ,
-       { 0x12E9, "GE Spacenet", "GE Spacenet" } ,
-       { 0x12EB, "Aureal", "Aureal Semiconductor" } ,
-       { 0x12EC, "3A Intl", "3A International Inc." } ,
-       { 0x12ED, "Optivision", "Optivision Inc." } ,
-       { 0x12EE, "Orange Micro", "Orange Micro, Inc." } ,
-       { 0x12EF, "Vienna", "Vienna Systems" } ,
-       { 0x12F0, "Pentek", "Pentek" } ,
-       { 0x12F1, "Sorenson", "Sorenson Vision Inc." } ,
-       { 0x12F2, "Gammagraphx", "Gammagraphx Inc." } ,
-       { 0x12F4, "Megatel", "Megatel" } ,
-       { 0x12F5, "Forks", "Forks" } ,
-       { 0x12F7, "Cognex", "Cognex" } ,
-       { 0x12F8, "Electronic-Design", "Electronic-Design GmbH" } ,
-       { 0x12F9, "FFT", "FourFold Technologies" } ,
-       { 0x12FB, "SSP", "Spectrum Signal Processing" } ,
-       { 0x12FC, "CEC", "Capital Equipment Corp" } ,
-       { 0x12FE, "esd", "esd Electronic System Design GmbH" } ,
-       { 0x1303, "II", "Innovative Integration" } ,
-       { 0x1304, "", "Juniper Networks Inc." } ,
-       { 0x1307, "ComputerBoards", "ComputerBoards" } ,
-       { 0x1308, "Jato", "Jato Technologies Inc." } ,
-       { 0x130A, "Mitsubishi", "Mitsubishi Electric Microcomputer" } ,
-       { 0x130B, "Colorgraphic", "Colorgraphic Communications Corp" } ,
-       { 0x130F, "", "Advanet Inc." } ,
-       { 0x1310, "", "Gespac" } ,
-       { 0x1312, "Microscan", "Microscan Systems Inc" } ,
-       { 0x1313, "", "Yaskawa Electric Co." } ,
-       { 0x1316, "", "Teradyne Inc." } ,
-       { 0x1317, "ADMtek", "ADMtek Inc" } ,
-       { 0x1318, "Packet Engines", "Packet Engines, Inc." } ,
-       { 0x1319, "Forte Media2", "Forte Media" } ,
-       { 0x131F, "", "SIIG" } ,
-       { 0x1325, "", "Salix Technologies Inc" } ,
-       { 0x1326, "", "Seachange International" } ,
-       { 0x1328, "CIFELLI", "CIFELLI SYSTEMS CORPORATION" } ,
-       { 0x1331, "RadiSys", "RadiSys Corporation" } ,
-       { 0x1332, "VMetro", "VMetro" } ,
-       { 0x1335, "Videomail", "Videomail Inc." } ,
-       { 0x133D, "", "Prisa Networks" } ,
-       { 0x133F, "", "SCM Microsystems" } ,
-       { 0x1342, "", "Promax Systems Inc" } ,
-       { 0x1344, "Micron", "Micron Technology, Inc." } ,
-       { 0x1347, "Spectracom", "Spectracom Corporation" } ,
-       { 0x134A, "DTC", "DTC Technology Corp." } ,
-       { 0x134B, "", "ARK Research Corp." } ,
-       { 0x134C, "", "Chori Joho System Co. Ltd" } ,
-       { 0x134D, "PCTEL", "PCTEL Inc." } ,
-       { 0x135A, "", "Brain Boxes Limited" } ,
-       { 0x135B, "", "Giganet Inc." } ,
-       { 0x135C, "", "Quatech Inc" } ,
-       { 0x135D, "ABB Network Partn", "ABB Network Partner AB" } ,
-       { 0x135E, "Sealevel", "Sealevel Systems Inc." } ,
-       { 0x135F, "", "I-Data International A-S" } ,
-       { 0x1360, "Meinberg Funkuhren", "Meinberg Funkuhren GmbH & Co. KG" } ,
-       { 0x1361, "", "Soliton Systems K.K." } ,
-       { 0x1363, "", "Phoenix Technologies Ltd" } ,
-       { 0x1365, "Hypercope", "Hypercope Corp." } ,
-       { 0x1366, "Teijin", "Teijin Seiki Co. Ltd." } ,
-       { 0x1367, "", "Hitachi Zosen Corporation" } ,
-       { 0x1368, "", "Skyware Corporation" } ,
-       { 0x1369, "Digigram", "Digigram" } ,
-       { 0x136B, "", "Kawasaki Steel Corporation" } ,
-       { 0x136C, "", "Adtek System Science Co Ltd" } ,
-       { 0x1375, "", "Boeing - Sunnyvale" } ,
-       { 0x137A, "MOTU", "Mark Of The Unicorn Inc" } ,
-       { 0x137B, "", "PPT Vision" } ,
-       { 0x137C, "", "Iwatsu Electric Co Ltd" } ,
-       { 0x137D, "", "Dynachip Corporation" } ,
-       { 0x137E, "PTSC", "Patriot Scientific Corp." } ,
-       { 0x1380, "SANRITZ", "Sanritz Automation Co LTC" } ,
-       { 0x1381, "", "Brains Co. Ltd" } ,
-       { 0x1382, "Marian", "Marian - Electronic & Software" } ,
-       { 0x1384, "", "Stellar Semiconductor Inc" } ,
-       { 0x1385, "Netgear", "Netgear" } ,
-       { 0x1387, "Digital Signal Processing", "Curtiss-Wright Controls Embedded Computing" } ,
-       { 0x1388, "", "Hitachi Information Technology Co Ltd" } ,
-       { 0x1389, "Applicom", "Applicom International" } ,
-       { 0x138A, " ", "Validity Sensors, Inc." } ,
-       { 0x138B, "", "Tokimec Inc" } ,
-       { 0x138E, "", "Basler GMBH" } ,
-       { 0x138F, "", "Patapsco Designs Inc" } ,
-       { 0x1390, "CDI", "Concept Development Inc." } ,
-       { 0x1393, "", "Moxa Technologies Co Ltd" } ,
-       { 0x1394, "Level One", "Level One Communications" } ,
-       { 0x1395, "", "Ambicom Inc" } ,
-       { 0x1396, "", "Cipher Systems Inc" } ,
-       { 0x1397, "Cologne", "Cologne Chip Designs GmbH" } ,
-       { 0x1398, "", "Clarion Co. Ltd" } ,
-       { 0x139A, "", "Alacritech Inc" } ,
-       { 0x139D, "", "Xstreams PLC/ EPL Limited" } ,
-       { 0x139E, "", "Echostar Data Networks" } ,
-       { 0x13A0, "", "Crystal Group Inc" } ,
-       { 0x13A1, "", "Kawasaki Heavy Industries Ltd" } ,
-       { 0x13A3, "HI-FN", "HI-FN Inc." } ,
-       { 0x13A4, "", "Rascom Inc" } ,
-       { 0x13A7, "", "amc330" } ,
-       { 0x13A8, "XR", "Exar Corp." } ,
-       { 0x13A9, "", "Siemens Medical Solutions" } ,
-       { 0x13AA, "", "Nortel Networks - BWA Division" } ,
-       { 0x13AF, "", "T.Sqware" } ,
-       { 0x13B1, "", "Tamura Corporation" } ,
-       { 0x13B4, "", "Wellbean Co Inc" } ,
-       { 0x13B5, "", "ARM Ltd" } ,
-       { 0x13B6, "pci", "DLoG Gesellschaft für elektronische Datentechnik mbH" } ,
-       { 0x13B8, "", "Nokia Telecommunications OY" } ,
-       { 0x13BD, "SHARP", "Sharp Corporation" } ,
-       { 0x13BF, "", "Sharewave Inc" } ,
-       { 0x13C0, "Microgate", "Microgate Corp." } ,
-       { 0x13C1, "3ware", "LSI" } ,
-       { 0x13C2, "", "Technotrend Systemtechnik GMBH" } ,
-       { 0x13C3, "", "Janz Computer AG" } ,
-       { 0x13C7, "", "Blue Chip Technology Ltd" } ,
-       { 0x13CC, "", "Metheus Corporation" } ,
-       { 0x13CF, "", "Studio Audio & Video Ltd" } ,
-       { 0x13D0, "A", "B2C2 Inc" } ,
-       { 0x13D1, "AboCom", "AboCom Systems, Inc" } ,
-       { 0x13D4, "", "Graphics Microsystems Inc" } ,
-       { 0x13D6, "", "K.I. Technology Co Ltd" } ,
-       { 0x13D7, "tos6205", "Toshiba Engineering Corporation" } ,
-       { 0x13D8, "", "Phobos Corporation" } ,
-       { 0x13D9, "", "Apex Inc" } ,
-       { 0x13DC, "", "Netboost Corporation" } ,
-       { 0x13DE, "", "ABB Robotics Products AB" } ,
-       { 0x13DF, "E-Tech", "E-Tech Inc." } ,
-       { 0x13E0, "GVC", "GVC Corporation" } ,
-       { 0x13E3, "", "Nest Inc" } ,
-       { 0x13E4, "", "Calculex Inc" } ,
-       { 0x13E5, "", "Telesoft Design Ltd" } ,
-       { 0x13E9, "", "Intraserver Technology Inc" } ,
-       { 0x13EA, "", "Dallas Semiconductor" } ,
-       { 0x13F0, "", "IC Plus Corporation" } ,
-       { 0x13F1, "", "OCE - Industries S.A." } ,
-       { 0x13F4, "", "Troika Networks Inc" } ,
-       { 0x13F6, "C-Media", "C-Media Electronics Inc." } ,
-       { 0x13F9, "", "NTT Advanced Technology Corp." } ,
-       { 0x13FA, "Pentland", "Pentland Systems Ltd." } ,
-       { 0x13FB, "", "Aydin Corp" } ,
-       { 0x13FD, "", "Micro Science Inc" } ,
-       { 0x13FE, "Advantech", "Advantech Co., Ltd." } ,
-       { 0x13FF, "", "Silicon Spice Inc." } ,
-       { 0x1400, "ArtX", "ArtX Inc" } ,
-       { 0x1402, "Meilhaus Electronic", "Meilhaus Electronic GmbH Germany" } ,
-       { 0x1404, "", "Fundamental Software Inc" } ,
-       { 0x1406, "Oc", "Oce Print Logics Technologies S.A." } ,
-       { 0x1407, "LAVA", "Lava Computer MFG Inc." } ,
-       { 0x1408, "", "Aloka Co. Ltd" } ,
-       { 0x1409, "SUNIX", "SUNIX Co., Ltd." } ,
-       { 0x140A, "", "DSP Research Inc" } ,
-       { 0x140B, "", "Ramix Inc" } ,
-       { 0x140D, "", "Matsushita Electric Works Ltd" } ,
-       { 0x140F, "", "Salient Systems Corp" } ,
-       { 0x1412, "IC Ensemble", "IC Ensemble, Inc." } ,
-       { 0x1413, "", "Addonics" } ,
-       { 0x1415, "Oxford", "Oxford Semiconductor Ltd - now part of PLX Technology " } ,
-       { 0x1418, "KES Inc.", "Kyushu Electronics Systems Inc" } ,
-       { 0x1419, "", "Excel Switching Corp" } ,
-       { 0x141B, "Gerd Mokwinski", "Zoom Telephonics Inc" } ,
-       { 0x141E, "", "Fanuc Co. Ltd" } ,
-       { 0x141F, "", "Visiontech Ltd" } ,
-       { 0x1420, "", "Psion Dacom PLC" } ,
-       { 0x1425, "", "ASIC Designers Inc" } ,
-       { 0x1428, "", "Edec Co Ltd" } ,
-       { 0x1429, "", "Unex Technology Corp." } ,
-       { 0x142A, "", "Kingmax Technology Inc" } ,
-       { 0x142B, "", "Radiolan" } ,
-       { 0x142C, "", "Minton Optic Industry Co Ltd" } ,
-       { 0x142D, "", "Pixstream Inc" } ,
-       { 0x1430, "", "ITT Aerospace/Communications Division" } ,
-       { 0x1433, "", "Eltec Elektronik AG" } ,
-       { 0x1435, "RTD", "RTD Embedded Technologies, Inc." } ,
-       { 0x1436, "", "CIS Technology Inc" } ,
-       { 0x1437, "", "Nissin Inc Co" } ,
-       { 0x1438, "", "Atmel-Dream" } ,
-       { 0x143F, "", "Lightwell Co Ltd - Zax Division" } ,
-       { 0x1441, "", "Agie SA." } ,
-       { 0x1443, "Unibrain", "Unibrain S.A." } ,
-       { 0x1445, "", "Logical Co Ltd" } ,
-       { 0x1446, "", "Graphin Co. Ltd" } ,
-       { 0x1447, "", "Aim GMBH" } ,
-       { 0x1448, "Alesis", "Alesis Studio" } ,
-       { 0x144A, "ADLINK", "ADLINK Technology Inc" } ,
-       { 0x144B, "Loronix", "Loronix Information Systems, Inc." } ,
-       { 0x144D, "", "sanyo" } ,
-       { 0x1450, "", "Octave Communications Ind." } ,
-       { 0x1451, "", "SP3D Chip Design GMBH" } ,
-       { 0x1453, "", "Mycom Inc" } ,
-       { 0x1458, "Giga-Byte", "Giga-Byte Technologies" } ,
-       { 0x145C, "", "Cryptek" } ,
-       { 0x145F, "Baldor", "Baldor Electric Company" } ,
-       { 0x1460, "", "Dynarc Inc" } ,
-       { 0x1462, "MSI", "Micro-Star International Co Ltd" } ,
-       { 0x1463, "", "Fast Corporation" } ,
-       { 0x1464, "ICS", "Interactive Circuits & Systems Ltd" } ,
-       { 0x1468, "", "Ambit Microsystems Corp." } ,
-       { 0x1469, "", "Cleveland Motion Controls" } ,
-       { 0x146C, "", "Ruby Tech Corp." } ,
-       { 0x146D, "SDF", "Tachyon Inc." } ,
-       { 0x146E, "", "WMS Gaming" } ,
-       { 0x1471, "", "Integrated Telecom Express Inc" } ,
-       { 0x1473, "", "Zapex Technologies Inc" } ,
-       { 0x1474, "", "Doug Carson & Associates" } ,
-       { 0x1477, "", "Net Insight" } ,
-       { 0x1478, "", "Diatrend Corporation" } ,
-       { 0x147B, "", "Abit Computer Corp." } ,
-       { 0x147F, "", "Nihon Unisys Ltd." } ,
-       { 0x1482, "", "Isytec - Integrierte Systemtechnik Gmbh" } ,
-       { 0x1483, "", "Labway Coporation" } ,
-       { 0x1485, "", "Erma - Electronic GMBH" } ,
-       { 0x1489, "", "KYE Systems Corporation" } ,
-       { 0x148A, "", "Opto 22" } ,
-       { 0x148B, "", "Innomedialogic Inc." } ,
-       { 0x148C, "CP (PowerColor)", "C.P. Technology Co. Ltd" } ,
-       { 0x148D, "Digicom", "Digicom Systems Inc." } ,
-       { 0x148E, "", "OSI Plus Corporation" } ,
-       { 0x148F, "", "Plant Equipment Inc." } ,
-       { 0x1490, "", "TC Labs Pty Ltd." } ,
-       { 0x1493, "", "Maker Communications" } ,
-       { 0x1495, "", "Tokai Communications Industry Co. Ltd" } ,
-       { 0x1496, "", "Joytech Computer Co. Ltd." } ,
-       { 0x1497, "SMA", "SMA Technologie AG" } ,
-       { 0x1498, "Tews", "Tews Technologies" } ,
-       { 0x1499, "", "Micro-Technology Co Ltd" } ,
-       { 0x149A, "Andor Tech", "Andor Technology Ltd" } ,
-       { 0x149B, "", "Seiko Instruments Inc" } ,
-       { 0x149E, "", "Mapletree Networks Inc." } ,
-       { 0x149F, "", "Lectron Co Ltd" } ,
-       { 0x14A0, "", "Softing GMBH" } ,
-       { 0x14A2, "", "Millennium Engineering Inc" } ,
-       { 0x14A4, "sebastien", "GVC/BCM Advanced Research" } ,
-       { 0x14A9, "Hivertec Inc.", "Hivertec Inc." } ,
-       { 0x14AB, "", "Mentor Graphics Corp." } ,
-       { 0x14B1, "", "Nextcom K.K." } ,
-       { 0x14B3, "Xpeed", "Xpeed Inc." } ,
-       { 0x14B4, "", "Philips Business Electronics B.V." } ,
-       { 0x14B5, "Creamware", "Creamware GmbH" } ,
-       { 0x14B6, "", "Quantum Data Corp." } ,
-       { 0x14B7, "Proxim", "Proxim Inc." } ,
-       { 0x14B9, "Aironet", "Aironet Wireless Communication" } ,
-       { 0x14BA, "", "Internix Inc." } ,
-       { 0x14BB, "", "Semtech Corporation" } ,
-       { 0x14BE, "", "L3 Communications" } ,
-       { 0x14C0, "Compal", "Compal Electronics, Inc." } ,
-       { 0x14C1, "", "Myricom Inc." } ,
-       { 0x14C2, "", "DTK Computer" } ,
-       { 0x14C4, "", "Iwasaki Information Systems Co Ltd" } ,
-       { 0x14C5, "ABB", "ABB AB (Sweden)" } ,
-       { 0x14C6, "", "Data Race Inc" } ,
-       { 0x14C7, "Modtech", "Modular Technology Ltd." } ,
-       { 0x14C8, "Turbocomm", "Turbocomm Tech Inc" } ,
-       { 0x14C9, "", "Odin Telesystems Inc" } ,
-       { 0x14CB, "", "Billionton Systems Inc./Cadmus Micro Inc" } ,
-       { 0x14CD, "", "Universal Scientific Ind." } ,
-       { 0x14CF, "Tekmicro", "TEK Microsystems Inc." } ,
-       { 0x14D4, "PANACOM", "Panacom Technology Corporation" } ,
-       { 0x14D5, "", "Nitsuko Corporation" } ,
-       { 0x14D6, "", "Accusys Inc" } ,
-       { 0x14D7, "", "Hirakawa Hewtech Corp" } ,
-       { 0x14D8, "", "Hopf Elektronik GMBH" } ,
-       { 0x14D9, "", "Alpha Processor Inc" } ,
-       { 0x14DB, "Avlab", "Avlab Technology Inc." } ,
-       { 0x14DC, "Amplicon", "Amplicon Liveline Limited" } ,
-       { 0x14DD, "", "Imodl Inc." } ,
-       { 0x14DE, "", "Applied Integration Corporation" } ,
-       { 0x14E3, "", "Amtelco" } ,
-       { 0x14E4, "Broadcom", "Broadcom Corporation" } ,
-       { 0x14EA, "Planex", "Planex Communications, Inc." } ,
-       { 0x14EB, "", "Seiko Epson Corporation" } ,
-       { 0x14EC, "", "Acqiris" } ,
-       { 0x14ED, "", "Datakinetics Ltd" } ,
-       { 0x14EF, "", "Carry Computer Eng. Co Ltd" } ,
-       { 0x14F1, "Conexant", "Conexant Systems, Inc." } ,
-       { 0x14F2, "Mobility", "Mobility Electronics, Inc." } ,
-       { 0x14F4, "", "Tokyo Electronic Industry Co. Ltd." } ,
-       { 0x14F5, "dule", "Sopac Ltd" } ,
-       { 0x14F6, "", "Coyote Technologies LLC" } ,
-       { 0x14F7, "", "Wolf Technology Inc" } ,
-       { 0x14F8, "", "Audiocodes Inc" } ,
-       { 0x14F9, "", "AG Communications" } ,
-       { 0x14FB, "", "Transas Marine (UK) Ltd" } ,
-       { 0x14FC, "", "Quadrics Ltd" } ,
-       { 0x14FD, "Silex", "Silex Technology Inc." } ,
-       { 0x14FE, "", "Archtek Telecom Corp." } ,
-       { 0x14FF, "", "Twinhead International Corp." } ,
-       { 0x1501, "", "Banksoft Canada Ltd" } ,
-       { 0x1502, "", "Mitsubishi Electric Logistics Support Co" } ,
-       { 0x1503, "", "Kawasaki LSI USA Inc" } ,
-       { 0x1504, "", "Kaiser Electronics" } ,
-       { 0x1506, "", "Chameleon Systems Inc" } ,
-       { 0x1507, "Htec", "Htec Ltd." } ,
-       { 0x1509, "FIC", "First International Computer Inc" } ,
-       { 0x150B, "", "Yamashita Systems Corp" } ,
-       { 0x150C, "", "Kyopal Co Ltd" } ,
-       { 0x150D, "", "Warpspped Inc" } ,
-       { 0x150E, "", "C-Port Corporation" } ,
-       { 0x150F, "", "Intec GMBH" } ,
-       { 0x1510, "", "Behavior Tech Computer Corp" } ,
-       { 0x1511, "", "Centillium Technology Corp" } ,
-       { 0x1512, "Rosen", "Rosun Technologies Inc" } ,
-       { 0x1513, "", "Raychem" } ,
-       { 0x1514, "", "TFL LAN Inc" } ,
-       { 0x1515, "", "ICS Advent" } ,
-       { 0x1516, "", "Myson Technology Inc" } ,
-       { 0x1517, "", "Echotek Corporation" } ,
-       { 0x1518, "", "Kontron Modular Computers GmbH (PEP Modular Computers GMBH)" } ,
-       { 0x1519, "", "Telefon Aktiebolaget LM Ericsson" } ,
-       { 0x151A, "Globetek", "Globetek Inc." } ,
-       { 0x151B, "wesam", "Combox Ltd" } ,
-       { 0x151C, "", "Digital Audio Labs Inc" } ,
-       { 0x151D, "", "Fujitsu Computer Products Of America" } ,
-       { 0x151E, "", "Matrix Corp." } ,
-       { 0x151F, "", "Topic Semiconductor Corp" } ,
-       { 0x1520, "", "Chaplet System Inc" } ,
-       { 0x1521, "", "Bell Corporation" } ,
-       { 0x1522, "Mainpine", "Mainpine Limited" } ,
-       { 0x1523, "", "Music Semiconductors" } ,
-       { 0x1524, "mayer", "ENE Technology Inc" } ,
-       { 0x1525, "", "Impact Technologies" } ,
-       { 0x1526, "", "ISS Inc" } ,
-       { 0x1527, "", "Solectron" } ,
-       { 0x1528, "", "Acksys" } ,
-       { 0x1529, "", "American Microsystems Inc" } ,
-       { 0x152A, "", "Quickturn Design Systems" } ,
-       { 0x152B, "", "Flytech Technology Co Ltd" } ,
-       { 0x152C, "", "Macraigor Systems LLC" } ,
-       { 0x152D, "", "Quanta Computer Inc" } ,
-       { 0x152E, "", "Melec Inc" } ,
-       { 0x152F, "", "Philips - Crypto" } ,
-       { 0x1532, "", "Echelon Corporation" } ,
-       { 0x1533, "", "Baltimore" } ,
-       { 0x1534, "", "Road Corporation" } ,
-       { 0x1535, "", "Evergreen Technologies Inc" } ,
-       { 0x1537, "", "Datalex Communcations" } ,
-       { 0x1538, "Aralion", "Aralion Inc." } ,
-       { 0x1539, "", "Atelier Informatiques et Electronique Et" } ,
-       { 0x153A, "", "ONO Sokki" } ,
-       { 0x153B, "cami", "Terratec Electronic GMBH" } ,
-       { 0x153C, "", "Antal Electronic" } ,
-       { 0x153D, "", "Filanet Corporation" } ,
-       { 0x153E, "Techwell", "Techwell Inc" } ,
-       { 0x153F, "MIPS", "MIPS Technologies, Inc" } ,
-       { 0x1540, "", "Provideo Multimedia Co Ltd" } ,
-       { 0x1541, "", "Telocity Inc." } ,
-       { 0x1542, "", "Vivid Technology Inc" } ,
-       { 0x1543, "", "Silicon Laboratories" } ,
-       { 0x1544, "DCM", "DCM Technologies Ltd." } ,
-       { 0x1545, "Visiontek", "VisionTek" } ,
-       { 0x1546, "", "IOI Technology Corp." } ,
-       { 0x1547, "", "Mitutoyo Corporation" } ,
-       { 0x1548, "", "Jet Propulsion Laboratory" } ,
-       { 0x1549, "ISS", "Interconnect Systems Solutions" } ,
-       { 0x154A, "", "Max Technologies Inc." } ,
-       { 0x154B, "", "Computex Co Ltd" } ,
-       { 0x154C, "", "Visual Technology Inc." } ,
-       { 0x154D, "", "PAN International Industrial Corp" } ,
-       { 0x154E, "", "Servotest Ltd" } ,
-       { 0x154F, "", "Stratabeam Technology" } ,
-       { 0x1550, "", "Open Network Co Ltd" } ,
-       { 0x1551, "", "Smart Electronic Development GMBH" } ,
-       { 0x1553, "", "Chicony Electronics Co Ltd" } ,
-       { 0x1554, "PMC", "Prolink Microsystems Corp." } ,
-       { 0x1555, "Gesytec", "Gesytec GmbH" } ,
-       { 0x1556, "", "PLD Applications" } ,
-       { 0x1557, "", "Mediastar Co. Ltd" } ,
-       { 0x1558, "", "Clevo/Kapok Computer" } ,
-       { 0x1559, "", "SI Logic Ltd" } ,
-       { 0x155A, "", "Innomedia Inc" } ,
-       { 0x155B, "", "Protac International Corp" } ,
-       { 0x155C, "", "s" } ,
-       { 0x155D, "", "MAC System Co Ltd" } ,
-       { 0x155E, "KR", "KUKA Roboter GmbH" } ,
-       { 0x155F, "", "Perle Systems Limited" } ,
-       { 0x1560, "", "Terayon Communications Systems" } ,
-       { 0x1561, "", "Viewgraphics Inc" } ,
-       { 0x1562, "", "Symbol Technologies, Inc." } ,
-       { 0x1563, "", "A-Trend Technology Co Ltd" } ,
-       { 0x1564, "", "Yamakatsu Electronics Industry Co Ltd" } ,
-       { 0x1565, "xyz", "Biostar Microtech Intl Corp" } ,
-       { 0x1566, "", "Ardent Technologies Inc" } ,
-       { 0x1567, "", "Jungsoft" } ,
-       { 0x1568, "", "DDK Electronics Inc" } ,
-       { 0x1569, "AleksSPb", "Palit Microsystems Inc" } ,
-       { 0x156A, "Avtec", "Avtec Systems Inc" } ,
-       { 0x156B, "", "S2io Inc" } ,
-       { 0x156C, "", "Vidac Electronics GMBH" } ,
-       { 0x156D, "", "Alpha-Top Corp" } ,
-       { 0x156E, "", "Alfa Inc." } ,
-       { 0x156F, "", "M-Systems Flash Disk Pioneers Ltd" } ,
-       { 0x1570, "", "Lecroy Corporation" } ,
-       { 0x1571, "", "Contemporary Controls" } ,
-       { 0x1572, "", "Otis Elevator Company" } ,
-       { 0x1573, "", "Lattice - Vantis" } ,
-       { 0x1574, "", "Fairchild Semiconductor" } ,
-       { 0x1575, "", "Voltaire Advanced Data Security Ltd" } ,
-       { 0x1576, "ViewCast", "Viewcast Com" } ,
-       { 0x1578, "", "Hitt" } ,
-       { 0x1579, "", "Dual Technology Corporation" } ,
-       { 0x157A, "", "Japan Elecronics Ind. Inc" } ,
-       { 0x157B, "", "Star Multimedia Corp." } ,
-       { 0x157C, "Eurosoft", "Eurosoft (UK)" } ,
-       { 0x157D, "", "Gemflex Networks" } ,
-       { 0x157E, "", "Transition Networks" } ,
-       { 0x157F, "", "PX Instruments Technology Ltd" } ,
-       { 0x1580, "", "Primex Aerospace Co." } ,
-       { 0x1581, "", "SEH Computertechnik GMBH" } ,
-       { 0x1582, "", "Cytec Corporation" } ,
-       { 0x1583, "", "Inet Technologies Inc" } ,
-       { 0x1584, "", "Uniwill Computer Corp." } ,
-       { 0x1585, "", "Marconi Commerce Systems SRL" } ,
-       { 0x1586, "", "Lancast Inc" } ,
-       { 0x1587, "", "Konica Corporation" } ,
-       { 0x1588, "Solidum", "Solidum Systems Corp" } ,
-       { 0x1589, "", "Atlantek Microsystems Pty Ltd" } ,
-       { 0x158A, "", "Digalog Systems Inc" } ,
-       { 0x158B, "", "Allied Data Technologies" } ,
-       { 0x158C, "", "Hitachi Semiconductor & Devices Sales Co" } ,
-       { 0x158D, "", "Point Multimedia Systems" } ,
-       { 0x158E, "", "Lara Technology Inc" } ,
-       { 0x158F, "", "Ditect Coop" } ,
-       { 0x1590, "", "3pardata Inc." } ,
-       { 0x1591, "", "ARN" } ,
-       { 0x1592, "Syba", "Syba Tech Ltd." } ,
-       { 0x1593, "", "Bops Inc" } ,
-       { 0x1594, "", "Netgame Ltd" } ,
-       { 0x1595, "", "Diva Systems Corp." } ,
-       { 0x1596, "", "Folsom Research Inc" } ,
-       { 0x1597, "", "Memec Design Services" } ,
-       { 0x1598, "", "Granite Microsystems" } ,
-       { 0x1599, "", "Delta Electronics Inc" } ,
-       { 0x159A, "", "General Instrument" } ,
-       { 0x159B, "", "Faraday Technology Corp" } ,
-       { 0x159C, "", "Stratus Computer Systems" } ,
-       { 0x159D, "", "Ningbo Harrison Electronics Co Ltd" } ,
-       { 0x159E, "", "A-Max Technology Co Ltd" } ,
-       { 0x159F, "", "Galea Network Security" } ,
-       { 0x15A0, "", "Compumaster SRL" } ,
-       { 0x15A1, "", "Geocast Network Systems Inc" } ,
-       { 0x15A2, "", "Catalyst Enterprises Inc" } ,
-       { 0x15A3, "", "Italtel" } ,
-       { 0x15A4, "Rafa", "X-Net OY" } ,
-       { 0x15A5, "", "Toyota MACS Inc" } ,
-       { 0x15A6, "", "Sunlight Ultrasound Technologies Ltd" } ,
-       { 0x15A7, "", "SSE Telecom Inc" } ,
-       { 0x15A8, "", "Shanghai Communications Technologies Cen" } ,
-       { 0x15AA, "", "Moreton Bay" } ,
-       { 0x15AB, "", "Bluesteel Networks Inc" } ,
-       { 0x15AC, "", "North Atlantic Instruments" } ,
-       { 0x15AD, "VMware", "VMware Inc." } ,
-       { 0x15AE, "", "Amersham Pharmacia Biotech" } ,
-       { 0x15B0, "", "Zoltrix International Limited" } ,
-       { 0x15B1, "", "Source Technology Inc" } ,
-       { 0x15B2, "", "Mosaid Technologies Inc." } ,
-       { 0x15B3, "", "Mellanox Technology" } ,
-       { 0x15B4, "", "CCI/Triad" } ,
-       { 0x15B5, "", "Cimetrics Inc" } ,
-       { 0x15B6, "", "Texas Memory Systems Inc" } ,
-       { 0x15B7, "", "Sandisk Corp." } ,
-       { 0x15B8, "", "Addi-Data GMBH" } ,
-       { 0x15B9, "", "Maestro Digital Communications" } ,
-       { 0x15BA, "", "Impacct Technology Corp" } ,
-       { 0x15BB, "", "Portwell Inc" } ,
-       { 0x15BC, "Agilent", "Agilent Technologies" } ,
-       { 0x15BD, "", "DFI Inc." } ,
-       { 0x15BE, "", "Sola Electronics" } ,
-       { 0x15BF, "", "High Tech Computer Corp (HTC)" } ,
-       { 0x15C0, "BVM", "BVM Limited" } ,
-       { 0x15C1, "", "Quantel" } ,
-       { 0x15C2, "", "Newer Technology Inc" } ,
-       { 0x15C3, "", "Taiwan Mycomp Co Ltd" } ,
-       { 0x15C4, "", "EVSX Inc" } ,
-       { 0x15C5, "", "Procomp Informatics Ltd" } ,
-       { 0x15C6, "", "Technical University Of Budapest" } ,
-       { 0x15C7, "", "Tateyama System Laboratory Co Ltd" } ,
-       { 0x15C8, "", "Penta Media Co. Ltd" } ,
-       { 0x15C9, "", "Serome Technology Inc" } ,
-       { 0x15CA, "", "Bitboys OY" } ,
-       { 0x15CB, "", "AG Electronics Ltd" } ,
-       { 0x15CC, "", "Hotrail Inc." } ,
-       { 0x15CD, "", "Dreamtech Co Ltd" } ,
-       { 0x15CE, "", "Genrad Inc." } ,
-       { 0x15CF, "", "Hilscher GMBH" } ,
-       { 0x15D1, "Infineon", "Infineon Technologies AG" } ,
-       { 0x15D2, "", "FIC (First International Computer Inc)" } ,
-       { 0x15D3, "", "NDS Technologies Israel Ltd" } ,
-       { 0x15D4, "", "Iwill Corporation" } ,
-       { 0x15D5, "", "Tatung Co." } ,
-       { 0x15D6, "", "Entridia Corporation" } ,
-       { 0x15D7, "", "Rockwell-Collins Inc" } ,
-       { 0x15D8, "", "Cybernetics Technology Co Ltd" } ,
-       { 0x15D9, "", "Super Micro Computer Inc" } ,
-       { 0x15DA, "", "Cyberfirm Inc." } ,
-       { 0x15DB, "", "Applied Computing Systems Inc." } ,
-       { 0x15DC, "Litronic", "Litronic Inc." } ,
-       { 0x15DD, "gökhan", "Sigmatel Inc." } ,
-       { 0x15DE, "", "Malleable Technologies Inc" } ,
-       { 0x15E0, "", "Cacheflow Inc" } ,
-       { 0x15E1, "VTG", "Voice Technologies Group" } ,
-       { 0x15E2, "", "Quicknet Technologies Inc" } ,
-       { 0x15E3, "", "Networth Technologies Inc" } ,
-       { 0x15E4, "", "VSN Systemen BV" } ,
-       { 0x15E5, "", "Valley Technologies Inc" } ,
-       { 0x15E6, "", "Agere Inc." } ,
-       { 0x15E7, "", "GET Engineering Corp." } ,
-       { 0x15E8, "akmal", "National Datacomm Corp." } ,
-       { 0x15E9, "", "Pacific Digital Corp." } ,
-       { 0x15EA, "", "Tokyo Denshi Sekei K.K." } ,
-       { 0x15EB, "", "Drsearch GMBH" } ,
-       { 0x15EC, "", "Beckhoff Automation GmbH" } ,
-       { 0x15ED, "", "Macrolink Inc" } ,
-       { 0x15EE, "", "IN Win Development Inc." } ,
-       { 0x15EF, "", "Intelligent Paradigm Inc" } ,
-       { 0x15F0, "", "B-Tree Systems Inc" } ,
-       { 0x15F1, "", "Times N Systems Inc" } ,
-       { 0x15F2, "", "Diagnostic Instruments Inc" } ,
-       { 0x15F3, "", "Digitmedia Corp." } ,
-       { 0x15F4, "", "Valuesoft" } ,
-       { 0x15F5, "", "Power Micro Research" } ,
-       { 0x15F6, "", "Extreme Packet Device Inc" } ,
-       { 0x15F7, "", "Banctec" } ,
-       { 0x15F8, "", "Koga Electronics Co" } ,
-       { 0x15F9, "", "Zenith Electronics Co" } ,
-       { 0x15FA, "Axzam", "Axzam Corporation" } ,
-       { 0x15FB, "", "Zilog Inc." } ,
-       { 0x15FC, "", "Techsan Electronics Co Ltd" } ,
-       { 0x15FD, "", "N-Cubed.Net" } ,
-       { 0x15FE, "", "Kinpo Electronics Inc" } ,
-       { 0x15FF, "", "Fastpoint Technologies Inc." } ,
-       { 0x1600, "", "Northrop Grumman - Canada Ltd" } ,
-       { 0x1601, "", "Tenta Technology" } ,
-       { 0x1602, "", "Prosys-TEC Inc." } ,
-       { 0x1603, "", "Nokia Wireless Business Communications" } ,
-       { 0x1604, "", "Central System Research Co Ltd" } ,
-       { 0x1605, "", "Pairgain Technologies" } ,
-       { 0x1606, "", "Europop AG" } ,
-       { 0x1607, "", "Lava Semiconductor Manufacturing Inc." } ,
-       { 0x1608, "nuri", "Automated Wagering International" } ,
-       { 0x1609, "", "Sciemetric Instruments Inc" } ,
-       { 0x160A, "", "Kollmorgen Servotronix" } ,
-       { 0x160B, "", "Onkyo Corp." } ,
-       { 0x160C, "", "Oregon Micro Systems Inc." } ,
-       { 0x160D, "", "Aaeon Electronics Inc" } ,
-       { 0x160E, "", "CML Emergency Services" } ,
-       { 0x160F, "", "ITEC Co Ltd" } ,
-       { 0x1610, "", "Tottori Sanyo Electric Co Ltd" } ,
-       { 0x1611, "", "Bel Fuse Inc." } ,
-       { 0x1612, "", "Telesynergy Research Inc." } ,
-       { 0x1613, "", "System Craft Inc." } ,
-       { 0x1614, "", "Jace Tech Inc." } ,
-       { 0x1615, "", "Equus Computer Systems Inc" } ,
-       { 0x1616, "", "Iotech Inc." } ,
-       { 0x1617, "", "Rapidstream Inc" } ,
-       { 0x1618, "", "Esec SA" } ,
-       { 0x1619, "FarSite", "FarSite Communications Limited" } ,
-       { 0x161B, "", "Mobilian Israel Ltd" } ,
-       { 0x161C, "", "Berkshire Products" } ,
-       { 0x161D, "", "Gatec" } ,
-       { 0x161E, "", "Kyoei Sangyo Co Ltd" } ,
-       { 0x161F, "Arima", "Arima Computer Corporation" } ,
-       { 0x1620, "", "Sigmacom Co Ltd" } ,
-       { 0x1621, "", "Lynx Studio Technology Inc" } ,
-       { 0x1622, "NHC", "Nokia Home Communications" } ,
-       { 0x1623, "", "KRF Tech Ltd" } ,
-       { 0x1624, "", "CE Infosys GMBH" } ,
-       { 0x1625, "", "Warp Nine Engineering" } ,
-       { 0x1626, "", "TDK Semiconductor Corp." } ,
-       { 0x1627, "", "BCom Electronics Inc" } ,
-       { 0x1629, "", "Kongsberg Spacetec a.s." } ,
-       { 0x162A, "", "Sejin Computerland Co Ltd" } ,
-       { 0x162B, "", "Shanghai Bell Company Limited" } ,
-       { 0x162C, "", "C&H Technologies Inc" } ,
-       { 0x162D, "", "Reprosoft Co Ltd" } ,
-       { 0x162E, "", "Margi Systems Inc" } ,
-       { 0x162F, "", "Rohde & Schwarz GMBH & Co KG" } ,
-       { 0x1630, "", "Sky Computers Inc" } ,
-       { 0x1631, "", "NEC Computer International" } ,
-       { 0x1632, "", "Verisys Inc" } ,
-       { 0x1633, "", "Adac Corporation" } ,
-       { 0x1634, "", "Visionglobal Network Corp." } ,
-       { 0x1635, "", "Decros / S.ICZ a.s." } ,
-       { 0x1636, "", "Jean Company Ltd" } ,
-       { 0x1637, "", "NSI" } ,
-       { 0x1638, " Eumitcom Technology Inc", "Eumitcom Technology Inc" } ,
-       { 0x163A, "", "Air Prime Inc" } ,
-       { 0x163B, "", "Glotrex Co Ltd" } ,
-       { 0x163C, "", "intel" } ,
-       { 0x163D, "", "Heidelberg Digital LLC" } ,
-       { 0x163E, "&#1074;&#1083;&#1072;&#1076;&#1080;&#1084;&#1080;&", "3dpower" } ,
-       { 0x163F, "", "Renishaw PLC" } ,
-       { 0x1640, "", "Intelliworxx Inc" } ,
-       { 0x1641, "", "MKNet Corporation" } ,
-       { 0x1642, "", "Bitland" } ,
-       { 0x1643, "", "Hajime Industries Ltd" } ,
-       { 0x1644, "", "Western Avionics Ltd" } ,
-       { 0x1645, "", "Quick-Serv. Computer Co. Ltd" } ,
-       { 0x1646, "", "Nippon Systemware Co Ltd" } ,
-       { 0x1647, "", "Hertz Systemtechnik GMBH" } ,
-       { 0x1648, "", "MeltDown Systems LLC" } ,
-       { 0x1649, "", "Jupiter Systems" } ,
-       { 0x164A, "", "Aiwa Co. Ltd" } ,
-       { 0x164C, "", "Department Of Defense" } ,
-       { 0x164D, "", "Ishoni Networks" } ,
-       { 0x164E, "", "Micrel Inc." } ,
-       { 0x164F, "DataVoice", "Datavoice (Pty) Ltd." } ,
-       { 0x1650, "", "Admore Technology Inc." } ,
-       { 0x1651, "", "Chaparral Network Storage" } ,
-       { 0x1652, "", "Spectrum Digital Inc." } ,
-       { 0x1653, "Naturetech", "Nature Worldwide Technology Corp" } ,
-       { 0x1654, "", "Sonicwall Inc" } ,
-       { 0x1655, "", "Dazzle Multimedia Inc." } ,
-       { 0x1656, "", "Insyde Software Corp" } ,
-       { 0x1657, "", "Brocade Communications Systems" } ,
-       { 0x1658, "", "Med Associates Inc." } ,
-       { 0x1659, "", "Shiba Denshi Systems Inc." } ,
-       { 0x165A, "", "Epix Inc." } ,
-       { 0x165B, "", "Real-Time Digital Inc." } ,
-       { 0x165C, "", "Kondo Kagaku" } ,
-       { 0x165D, "salva", "Hsing Tech. Enterprise Co. Ltd." } ,
-       { 0x165E, "", "Hyunju Computer Co. Ltd." } ,
-       { 0x165F, "Comart", "Comartsystem Korea" } ,
-       { 0x1660, "", "Network Security Technologies Inc. (Net" } ,
-       { 0x1661, "", "Worldspace Corp." } ,
-       { 0x1662, "", "Int Labs" } ,
-       { 0x1663, "", "Elmec Inc. Ltd." } ,
-       { 0x1664, "", "Fastfame Technology Co. Ltd." } ,
-       { 0x1665, "", "Edax Inc." } ,
-       { 0x1666, "", "Norpak Corporation" } ,
-       { 0x1667, "", "CoSystems Inc." } ,
-       { 0x1668, "Actiontec", "Actiontec Electronics Inc." } ,
-       { 0x166A, "", "Komatsu Ltd." } ,
-       { 0x166B, "", "Supernet Inc." } ,
-       { 0x166C, "", "Shade Ltd." } ,
-       { 0x166D, "", "Sibyte Inc." } ,
-       { 0x166E, "", "Schneider Automation Inc." } ,
-       { 0x166F, "", "Televox Software Inc." } ,
-       { 0x1670, "", "Rearden Steel" } ,
-       { 0x1671, "", "Atan Technology Inc." } ,
-       { 0x1672, "", "Unitec Co. Ltd." } ,
-       { 0x1673, "", "pctel" } ,
-       { 0x1675, "", "Square Wave Technology" } ,
-       { 0x1676, "Gateway", "Emachines Inc." } ,
-       { 0x1677, "", "Bernecker + Rainer" } ,
-       { 0x1678, "", "INH Semiconductor" } ,
-       { 0x1679, "", "Tokyo Electron Device Ltd." } ,
-       { 0x167F, "iba", "iba AG" } ,
-       { 0x1680, "Dunti", "Dunti Corp." } ,
-       { 0x1681, "Hercules", "Hercules" } ,
-       { 0x1682, "PINE", "PINE Technology, Ltd." } ,
-       { 0x1688, "CastleNet", "CastleNet Technology Inc." } ,
-       { 0x168A, "USA", "Utimaco Safeware AG" } ,
-       { 0x168B, "", "Circut Assembly Corp." } ,
-       { 0x168C, "Atheros", "Atheros Communications Inc." } ,
-       { 0x168D, "NMI", "NMI Electronics Ltd." } ,
-       { 0x168E, "Hyundai MultiCAV", "Hyundai MultiCAV Computer Co. Ltd." } ,
-       { 0x168F, "qsb", "KDS Innotech Corp." } ,
-       { 0x1690, "NetContinuum", "NetContinuum, Inc." } ,
-       { 0x1693, "FERMA", "FERMA" } ,
-       { 0x1695, "EPoX", "EPoX Computer Co., Ltd." } ,
-       { 0x16AE, "SFNT", "SafeNet Inc." } ,
-       { 0x16B3, "", "CNF Mobile Solutions" } ,
-       { 0x16B8, "Sonnet Technologies", "Sonnet Technologies, Inc." } ,
-       { 0x16CA, "Cenatek", "Cenatek Inc." } ,
-       { 0x16CB, "Minolta", "Minolta Co. Ltd." } ,
-       { 0x16CC, "Inari", "Inari Inc." } ,
-       { 0x16D0, "", "Systemax" } ,
-       { 0x16E0, "3MTS", "Third Millenium Test Solutions, Inc." } ,
-       { 0x16E5, "", "Intellon Corporation" } ,
-       { 0x16EC, "USR", "U.S. Robotics" } ,
-       { 0x16F0, "", "LaserLinc Inc." } ,
-       { 0x16F1, "Adicti", "Adicti Corp." } ,
-       { 0x16F3, "Jetway", "Jetway Information Co., Ltd" } ,
-       { 0x16F6, "VideoTele.com", "VideoTele.com Inc." } ,
-       { 0x1700, "Antara", "Antara LLC" } ,
-       { 0x1701, "", "Interactive Computer Products Inc." } ,
-       { 0x1702, "IMC", "Internet Machines Corp." } ,
-       { 0x1703, "Desana", "Desana Systems" } ,
-       { 0x1704, "Clearwater", "Clearwater Networks" } ,
-       { 0x1705, "Digital First", "Digital First" } ,
-       { 0x1706, "PBC", "Pacific Broadband Communications" } ,
-       { 0x1707, "Cogency", "Cogency Semiconductor Inc." } ,
-       { 0x1708, "Harris", "Harris Corp." } ,
-       { 0x1709, "Zarlink", "Zarlink Semiconductor" } ,
-       { 0x170A, "Alpine", "Alpine Electronics Inc." } ,
-       { 0x170B, "NetOctave", "NetOctave Inc." } ,
-       { 0x170C, "YottaYotta", "YottaYotta Inc." } ,
-       { 0x170D, "SMI", "SensoMotoric Instruments GmbH" } ,
-       { 0x170E, "San Valley", "San Valley Systems, Inc." } ,
-       { 0x170F, "Cyberdyne", "Cyberdyne Inc." } ,
-       { 0x1710, "Pelago", "Pelago Nutworks" } ,
-       { 0x1711, "NetScreen", "MyName Technologies, Inc." } ,
-       { 0x1712, "NICE", "NICE Systems Inc." } ,
-       { 0x1713, "TOPCON", "TOPCON Corp." } ,
-       { 0x1725, "Vitesse", "Vitesse Semiconductor" } ,
-       { 0x1734, "Fujitsu-Siemens", "Fujitsu-Siemens Computers GmbH" } ,
-       { 0x1737, "LinkSys", "LinkSys" } ,
-       { 0x173B, "Altima", "Altima Communications Inc." } ,
-       { 0x1743, "Peppercon", "Peppercon AG" } ,
-       { 0x174B, "PC Partner (Sapphire)", "PC Partner Limited" } ,
-       { 0x1752, "AMW Europe GmbH", "Global Brands Manufacture Ltd." } ,
-       { 0x1753, "TeraRecon", "TeraRecon, Inc." } ,
-       { 0x1755, "Alchemy", "Alchemy Semiconductor Inc." } ,
-       { 0x176A, "GDC", "General Dynamics Canada" } ,
-       { 0x1775, " ", "General Electric" } ,
-       { 0x1789, "Ennyah", "Ennyah Technologies Corp" } ,
-       { 0x1793, "Unitech", "Unitech Electronics Co., Ltd" } ,
-       { 0x17A7, "Start Network", "Start Network Technology Co., Ltd." } ,
-       { 0x17AA, "lenovo", "Legend Ltd. (Beijing)" } ,
-       { 0x17AB, "", "Phillips Components" } ,
-       { 0x17AF, "Hightech", "Hightech Information Systems, Ltd." } ,
-       { 0x17BE, "Philips", "Philips Semiconductors" } ,
-       { 0x17C0, "Wistron", "Wistron Corp." } ,
-       { 0x17C4, "", "Movita" } ,
-       { 0x17CC, "NetChip", "NetChip" } ,
-       { 0x17D5, "Neterion", "Neterion Inc." } ,
-       { 0x17db, " ", "Cray, Inc." } ,
-       { 0x17E9, "", "DH electronics GmbH" } ,
-       { 0x17EE, "Connect3D", "Connect Components, Ltd." } ,
-       { 0x17F3, "RDC", "RDC Semiconductor Co., Ltd." } ,
-       { 0x1813, "Ambient", "phillip rees" } ,
-       { 0x1814, "Ralink Technology", "Ralink Technology, Corp." } ,
-       { 0x1815, "devolo", "devolo AG" } ,
-       { 0x1820, "InfiniCon", "InfiniCon Systems, Inc." } ,
-       { 0x1824, "Avocent", "Avocent" } ,
-       { 0x1841, "D-link AirPlus G DWL-G510 rev.C", "Panda Platinum" } ,
-       { 0x1860, "Primagraphics", "Primagraphics Ltd." } ,
-       { 0x186C, "Humusoft", "Humusoft S.R.O" } ,
-       { 0x1887, "Elan", "Elan Digital Systems Ltd" } ,
-       { 0x1888, "", "Varisys Limited" } ,
-       { 0x188D, "Millogic", "Millogic Ltd." } ,
-       { 0x1890, "", "Egenera, Inc." } ,
-       { 0x18BC, "", "Info-Tek Corp." } ,
-       { 0x18C9, "ARVOO", "ARVOO Engineering BV" } ,
-       { 0x18CA, "XGI", "XGI Technology Inc" } ,
-       { 0x18F1, "Spc", "Spectrum Systementwicklung Microelectronic GmbH" } ,
-       { 0x18F4, "Napatech", "Napatech A/S" } ,
-       { 0x18F7, "Commtech", "Commtech, Inc." } ,
-       { 0x18FB, "", "Resilience Corporation" } ,
-       { 0x1905, "WIS Computers", "WIS Technology, Inc." } ,
-       { 0x1910, "Seaway Networks", "Seaway Networks" } ,
-       { 0x1931, " ", "Option NV" } ,
-       { 0x1941, " ", "Stelar" } ,
-       { 0x1969, " ATHR", "Atheros Communications" } ,
-       { 0x1971, "", "AGEIA Technologies, Inc." } ,
-       { 0x197B, " ali", "JMicron Technology Corp." } ,
-       { 0x198a, " ", "Nallatech" } ,
-       { 0x1991, " tps", "Topstar Digital Technologies Co., Ltd." } ,
-       { 0x19a2, " ", "ServerEngines" } ,
-       { 0x19A8, "DAQDATA", "DAQDATA GmbH" } ,
-       { 0x19AC, "Kasten Chase", "Kasten Chase Applied Research" } ,
-       { 0x19B6, " ", "Mikrotik" } ,
-       { 0x19E2, "Vector", "Vector Informatik GmbH" } ,
-       { 0x19E3, " ", "DDRdrive LLC" } ,
-       { 0x1A08, "", "Linux Networx" } ,
-       { 0x1a41, " ", "Tilera Corporation" } ,
-       { 0x1A42, "", "Imaginant" } ,
-       { 0x1B13, "Jaton Corp", "Jaton Corporation USA" } ,
-       { 0x1BAD, " ", "ReFLEX CES" } ,
-       { 0x1DE1, "Tekram", "Tekram" } ,
-       { 0x1FCF, "Miranda", "Miranda Technologies Ltd." } ,
-       { 0x2001, "", "Temporal Research Ltd" } ,
-       { 0x2646, "Kingston", "Kingston Technology Co." } ,
-       { 0x270F, "ChainTech", "ChainTech Computer Co. Ltd." } ,
-       { 0x2EC1, "", "Zenic Inc" } ,
-       { 0x3388, "Hint", "Hint Corp." } ,
-       { 0x3411, "", "Quantum Designs (H.K.) Inc." } ,
-       { 0x3513, "ARCOM", "ARCOM Control Systems Ltd." } ,
-       { 0x38EF, "", "4links" } ,
-       { 0x3D3D, "3DLabs", "3Dlabs, Inc. Ltd" } ,
-       { 0x4005, "Avance", "Avance Logic Inc." } ,
-       { 0x4144, "Alpha Data", "Alpha Data" } ,
-       { 0x416C, "", "Aladdin Knowledge Systems" } ,
-       { 0x4680, "UMAX Comp", "UMAX Computer Corp." } ,
-       { 0x4843, "Hercules", "Hercules Computer Technology" } ,
-       { 0x4943, "", "Growth Networks" } ,
-       { 0x4954, "Integral", "Integral Technologies" } ,
-       { 0x4978, "Axil", "Axil Computer Inc." } ,
-       { 0x4C48, "Lung Hwa", "Lung Hwa Electronics" } ,
-       { 0x4C53, "SBS", "SBS-OR Industrial Computers" } ,
-       { 0x4CA1, "", "Seanix Technology Inc" } ,
-       { 0x4D51, "Mediaq", "Mediaq Inc." } ,
-       { 0x4D54, "", "Microtechnica Co Ltd" } ,
-       { 0x4DDC, "ILC", "ILC Data Device Corp." } ,
-       { 0x4E8, " samsung YP-R1JEB", "Samsung Windows Portable Devices" } ,
-       { 0x5053, "TBS/Voyetra", "TBS/Voyetra Technologies" } ,
-       { 0x508A, " ", "Samsung T10 MP3 Player" } ,
-       { 0x5136, "", "S S Technologies" } ,
-       { 0x5143, "Qualcomm", "Qualcomm Inc. USA" } ,
-       { 0x5333, "S3 86c617", "S3 Graphics Co., Ltd" } ,
-       { 0x544C, "", "Teralogic Inc" } ,
-       { 0x5555, "Genroco", "Genroco Inc." } ,
-       { 0x5853, " Citrix", "Citrix Systems, Inc." } ,
-       { 0x6409, "", "Logitec Corp." } ,
-       { 0x6666, "Decision", "Decision Computer International Co." } ,
-       { 0x7604, "O.N.", "O.N. Electric Co. Ltd." } ,
-       { 0x7d1, " ", "D-Link Corporation" } ,
-       { 0x8080, "Xirlink", "Xirlink, Inc" } ,
-       { 0x8086, "Intel", "Intel Corporation" } ,
-       { 0x80EE, "VirtualBox", "Oracle Corporation - InnoTek Systemberatung GmbH" } ,
-       { 0x8866, "T-Square", "T-Square Design Inc." } ,
-       { 0x8888, "Sil Magic", "Silicon Magic" } ,
-       { 0x8E0E, "Computone", "Computone Corporation" } ,
-       { 0x9004, "Adaptec", "Adaptec Inc" } ,
-       { 0x9005, "Adaptec", "Adaptec Inc" } ,
-       { 0x919A, "", "Gigapixel Corp" } ,
-       { 0x9412, "Holtek", "Holtek" } ,
-       { 0x9699, "", "Omni Media Technology Inc." } ,
-       { 0x9710, "MosChip", "MosChip Semiconductor Technology" } ,
-       { 0x9902, "StarGen", "StarGen, Inc." } ,
-       { 0xA0A0, "Aopen", "Aopen Inc." } ,
-       { 0xA0F1, "", "Unisys Corporation" } ,
-       { 0xA200, "NEC", "NEC Corp." } ,
-       { 0xA259, "HP", "Hewlett Packard" } ,
-       { 0xA304, "Sony", "Sony" } ,
-       { 0xA727, "", "3com Corporation" } ,
-       { 0xAA42, "Scitex", "Scitex Digital Video" } ,
-       { 0xAC1E, "", "Digital Receiver Technology Inc" } ,
-       { 0xB1B3, "Shiva", "Shiva Europe Ltd." } ,
-       { 0xB894, "", "Brown & Sharpe Mfg. Co." } ,
-       { 0xBEEF, "Mindstream Computing", "Mindstream Computing" } ,
-       { 0xC001, "TSI", "TSI Telsys" } ,
-       { 0xC0A9, "Micron/Crucial", "Micron/Crucial Technology" } ,
-       { 0xC0DE, "", "Motorola" } ,
-       { 0xC0FE, "Mot Engrg", "Motion Engineering Inc." } ,
-       { 0xC622, "", "Hudson Soft Co Ltd" } ,
-       { 0xCA50, "Varian", "Varian, Inc" } ,
-       { 0xCAFE, "", "Chrysalis-ITS" } ,
-       { 0xCCCC, "", "Catapult Communications" } ,
-       { 0xD4D4, "Processing", "Curtiss-Wright Controls Embedded Computing" } ,
-       { 0xDC93, "", "Dawicontrol" } ,
-       { 0xDEAD, "Indigita", "Indigita Corporation" } ,
-       { 0xDEAF, "", "Middle Digital, Inc" } ,
-       { 0xE159, "Tiger Jet", "Tiger Jet Network Inc" } ,
-       { 0xE4BF, "", "EKF Elektronik GMBH" } ,
-       { 0xEA01, "", "Eagle Technology" } ,
-       { 0xEABB, "Aashima", "Aashima Technology B.V." } ,
-       { 0xEACE, "Endace", "Endace Measurement Systems Ltd." } ,
-       { 0xECC0, "Echo", "Echo Digital Audio Corporation" } ,
-       { 0xEDD8, "ARK Logic", "ARK Logic, Inc" } ,
-       { 0xF5F5, "", "F5 Networks Inc." } ,
-       { 0xFA57, "Interagon", "Interagon AS" } ,
-} ;
-
-
-// Use this value for loop control during searching:
-#define        PCI_VENTABLE_LEN        (sizeof(PciVenTable)/sizeof(PCI_VENTABLE))
-
-typedef struct _PCI_DEVTABLE
-{
-       unsigned short  VenId ;
-       unsigned short  DevId ;
-       char *  Chip ;
-       char *  ChipDesc ;
-}  PCI_DEVTABLE, *PPCI_DEVTABLE ;
-
-PCI_DEVTABLE   PciDevTable [] =
-{
-       { 0x165C, 0x0002, "FT232BL", "FT232BL" } ,
-       { 0x16AE, 0x1141, "SafeXcel-1141", "???" } ,
-       { 0x11DA, 0x2000, "2", "Virtual-Bus / AlacrityVM bridge" } ,
-       { 0x11DB, 0x1234, "", "Dreamcast Broadband Adapter" } ,
-       { 0x11DE, 0x6057, "ZR36067", "AV PCI Controller" } ,
-       { 0x11DE, 0x6067, "zr36067pqc", "zoran" } ,
-       { 0x11DE, 0x6120, "ZR36120PQC", "MPEG VideoBVPSXI Capture Card" } ,
-       { 0x11DE, 0x9876, "", "" } ,
-       { 0x11EC, 0x2064, "", "" } ,
-       { 0x11F0, 0x4231, "", "" } ,
-       { 0x11F0, 0x4232, "FASTline UTP Quattro", "PCI EN_8086 DEV_4232 subsys_12018086 rev_00cce1000e1" } ,
-       { 0x11F0, 0x4233, "FASTline FO", "" } ,
-       { 0x11F0, 0x4234, "FASTline UTP", "" } ,
-       { 0x11F0, 0x4235, "FASTline-II UTP", "" } ,
-       { 0x11F0, 0x4236, "FASTline-II FO", "" } ,
-       { 0x11F0, 0x4731, "GIGAline", "Gigabit Ethernet Adapter" } ,
-       { 0x11F4, 0x2915, "2915", "" } ,
-       { 0x11F6, 0x0112, "ATT2MD11", "ReadyLink ENET100-VG4" } ,
-       { 0x11F6, 0x0113, "", "FreedomLine 100" } ,
-       { 0x11F6, 0x1401, "832AE28030680", "ReadyLink RL2000" } ,
-       { 0x11F6, 0x2011, "TXA9882", "ReadyLink  RL100ATX/PCI Fast Ethernet Adapter" } ,
-       { 0x11F6, 0x2201, "TXA9883", "ReadyLink 100TX (Winbond W89C840)" } ,
-       { 0x11F6, 0x9881, "TXA9881?", "ReadyLink RL100TX Fast Ethernet Adapter" } ,
-       { 0x11F8, 0x7364, "PM7364", "FREEDM-32 Frame Engine & Datalink Mgr" } ,
-       { 0x11F8, 0x7366, "PM7364", "FREEDM-8 Frame Engine & Datalink Manager" } ,
-       { 0x11F8, 0x7367, "PM7367", "FREEDM-32P32 Frame Engine & Datalink Mgr" } ,
-       { 0x11F8, 0x7375, "PM7375", "LASAR-155 ATM SAR" } ,
-       { 0x11F8, 0x7380, "PM7380", "FREEDM-32P672 Frm Engine & Datalink Mgr" } ,
-       { 0x11F8, 0x7382, "PM7382", "FREEDM-32P256 Frm Engine & Datalink Mgr" } ,
-       { 0x11F8, 0x7384, "PM7384", "FREEDM-84P672 Frm Engine & Datalink Mgr" } ,
-       { 0x11F8, 0x8000, "PM8000 SPC", "6G SAS/SATA Controller" } ,
-       { 0x11F8, 0x8010, "PM8010 SRC", "6G SAS/SATA RAID Controller" } ,
-       { 0x11FE, 0x0001, "RocketPort", "" } ,
-       { 0x11FE, 0x0002, "RocketPort", "" } ,
-       { 0x11FE, 0x0003, "RocketPort", "" } ,
-       { 0x11FE, 0x0004, "RocketPort", "" } ,
-       { 0x11FE, 0x0005, "RocketPort", "" } ,
-       { 0x11FE, 0x0006, "RocketPort", "" } ,
-       { 0x11FE, 0x0007, "RocketPort", "" } ,
-       { 0x11FE, 0x0008, "RocketPort", "" } ,
-       { 0x11FE, 0x0009, "RocketPort", "" } ,
-       { 0x11FE, 0x000A, "RocketPort", "" } ,
-       { 0x11FE, 0x000B, "RocketPort", "" } ,
-       { 0x11FE, 0x000C, "RocketPort", "" } ,
-       { 0x11FE, 0x000D, "RocketPort", "" } ,
-       { 0x11FE, 0x8015, "RocketPort", "4-port UART 16954" } ,
-       { 0x1202, 0x0001, "NAIATMPCI", "PCI ATM Adapter" } ,
-       { 0x1208, 0x4853, "", "HS-Link Device" } ,
-       { 0x1365, 0x9050, "HYSDN", "" } ,
-       { 0x1209, 0x0100, "PCI 9054", "PLX PCI BRIDGE" } ,
-       { 0x120E, 0x0100, "Cyclom-Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0101, "Cyclom-Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0102, "Cyclom-4Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0103, "Cyclom-4Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0104, "Cyclom-8Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0105, "Cyclom-8Y", "Multiport Serial Card" } ,
-       { 0x120E, 0x0200, "Cyclom-Z", "Intelligent Multiport Serial" } ,
-       { 0x120E, 0x0201, "Cyclom-Z", "Intelligent Serial Card" } ,
-       { 0x120E, 0x0300, "PC300 RX 2", "" } ,
-       { 0x120E, 0x0301, "PC300 RX 1", "" } ,
-       { 0x120E, 0x0302, "PC300 TE 2", "" } ,
-       { 0x120E, 0x0303, "PC300 TE 1", "teclado" } ,
-       { 0x120F, 0x0001, "Roadrunner", "" } ,
-       { 0x1210, 0x25f4, "No data", "No data" } ,
-       { 0x1216, 0x0003, "188A2L432B", "PTM400 PCI Taxi Module" } ,
-       { 0x1217, 0x00f7, "0x00f71217", "1394 Open Host Controller Interface" } ,
-       { 0x1217, 0x6729, "OZ6729", "PCI to PCMCIA Bridge" } ,
-       { 0x1217, 0x673A, "OZ6730", "PCI to PCMCIA Bridge" } ,
-       { 0x1217, 0x6832, "OZ6832/3", "CardBus Controller" } ,
-       { 0x1217, 0x6836, "OZ6836/6860", "CardBus Controller" } ,
-       { 0x1217, 0x6872, "OZ6812", "CardBus Controller" } ,
-       { 0x1217, 0x6925, "OZ6922", "CardBus Controller" } ,
-       { 0x1217, 0x6933, "OZ6933", "CardBus Controller" } ,
-       { 0x1217, 0x6972, "OZ6912", "CardBus Controller" } ,
-       { 0x1217, 0x7110, "OZ711Mx", "MemoryCardBus Accelerator" } ,
-       { 0x1217, 0x7112, "", "" } ,
-       { 0x1217, 0x7113, "0Z711EC1", "SmartCardBus Contoller" } ,
-       { 0x1217, 0x7114, "OZ711M1", "CardBus Controller" } ,
-       { 0x1217, 0x7120, "Unknown device", "O2Micro Integrated MMC/SD controller" } ,
-       { 0x1217, 0x7130, "501179", "O2Micro Integrated MMC/SD/MS/xD/SM Controller" } ,
-       { 0x1217, 0x7134, "OZ711MP1/MS1", "MemoryCardBus Cont