Finishes removal of x86_32 (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Feb 2015 16:05:18 +0000 (11:05 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Feb 2015 16:10:14 +0000 (11:10 -0500)
You won't be able to select the a non-64 bit kernel from Kconfig.  The
symbol CONFIG_X86_64 is still around, since some code we port from other
OSs might expect it.

I didn't mess around much with gcc/glibc.  We're lucky that all works.
But you won't be able to ask our build system to make a 32 bit
toolchain.

I tested a cross-compiler rebuild and get_html.  I didn't test the
jenkins change.

30 files changed:
GETTING_STARTED
Kconfig
config-default
kern/arch/x86/Kconfig
kern/arch/x86/Makefile
kern/arch/x86/bitops.h
kern/arch/x86/coreid.h
kern/arch/x86/cpuinfo.c
kern/arch/x86/kdebug.c
kern/arch/x86/kernel32.ld [deleted file]
kern/arch/x86/page_alloc.c
kern/arch/x86/ros/mmu.h
kern/arch/x86/ros/mmu32.h [deleted file]
kern/arch/x86/ros/syscall.h
kern/arch/x86/ros/syscall32.h [deleted file]
kern/arch/x86/ros/trapframe.h
kern/arch/x86/ros/trapframe32.h [deleted file]
kern/arch/x86/smp_boot.c
kern/arch/x86/trap.c
kern/arch/x86/trap.h
kern/arch/x86/trap32.h [deleted file]
kern/arch/x86/types.h
kern/arch/x86/x86.h
kern/include/smp.h
kern/src/elf.c
kern/src/monitor.c
kern/src/net/ptclbsum.c
tools/compilers/gcc-glibc/Makefile
tools/compilers/gcc-glibc/Makelocal.template
tools/jenkins/launcher.sh

index 60337e1..7a3bab5 100644 (file)
@@ -79,10 +79,6 @@ my path contains:
 
 /home/brho/classes/ros/ros-gcc-glibc/install-x86_64-ros-gcc/bin
 
-       and
-
-/home/brho/classes/ros/ros-gcc-glibc/install-i686-ros-gcc/bin
-
 You can also set up MAKE_JOBS, so you don't over or under load your system when
 building.  I have a 2 core laptop, so I use MAKE_JOBS := 3
 
diff --git a/Kconfig b/Kconfig
index 0981d1f..551d1cd 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -11,9 +11,9 @@ config SRCARCH
 
 config 64BIT
        bool "64-bit kernel"
-       default n
+       default y
        help
-               Say yes to build a 64-bit kernel, amd64 / x86_64, riscv64, etc.
+               Say yes to build a 64-bit kernel.  Must be 'y' for x86.
 
 menuconfig RUN_INIT_SCRIPT
        bool "Run init script after boot"
index 2128bca..f7b61c5 100644 (file)
@@ -3,7 +3,6 @@
 #
 CONFIG_64BIT=y
 CONFIG_X86=y
-# CONFIG_X86_32 is not set
 CONFIG_X86_64=y
 
 #
index 20cd789..dbff2af 100644 (file)
@@ -1,9 +1,7 @@
 config X86
+       select 64BIT
        def_bool y
 
-config X86_32
-       def_bool !64BIT
-
 config X86_64
        def_bool 64BIT
 
index 42bcd18..e1fdaaa 100644 (file)
@@ -1,4 +1,3 @@
-ifeq ($(CONFIG_X86_64),y)
 CROSS_COMPILE := x86_64-ucb-akaros-
 BITS := 64
 KERNEL_LD := kernel64.ld
@@ -8,13 +7,6 @@ CFLAGS_KERNEL += -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow
 LDFLAGS_KERNEL += -z max-page-size=0x1000
 # Need to change the format to 32 bit, to trick multiboot/grub1 into loading
 ARCH_POST_LINK_CMD = cp $@ $@-64b; $(OBJCOPY) -I elf64-x86-64 -O elf32-i386 $@
-else ifeq ($(CONFIG_X86_32),y)
-CROSS_COMPILE := i686-ucb-akaros-
-BITS := 32
-KERNEL_LD := kernel32.ld
-# basically a nop.  this runs post-link of the kernel
-       ARCH_POST_LINK_CMD = echo -n
-endif
 
 # BITS is used in Kbuilds, so we can select bit-specific source files.
 export BITS
index f6651d9..2c6badc 100644 (file)
@@ -396,7 +396,6 @@ static inline int ffs(int x)
 {
        int r;
 
-#ifdef CONFIG_X86_64
        /*
         * AMD64 says BSFL won't clobber the dest reg if x==0; Intel64 says the
         * dest reg is undefined if x==0, but their CPU architect says its
@@ -409,16 +408,6 @@ static inline int ffs(int x)
        asm("bsfl %1,%0"
            : "=r" (r)
            : "rm" (x), "0" (-1));
-#elif defined(CONFIG_X86_CMOV)
-       asm("bsfl %1,%0\n\t"
-           "cmovzl %2,%0"
-           : "=&r" (r) : "rm" (x), "r" (-1));
-#else
-       asm("bsfl %1,%0\n\t"
-           "jnz 1f\n\t"
-           "movl $-1,%0\n"
-           "1:" : "=r" (r) : "rm" (x));
-#endif
        return r + 1;
 }
 
@@ -437,7 +426,6 @@ static inline int fls(int x)
 {
        int r;
 
-#ifdef CONFIG_X86_64
        /*
         * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the
         * dest reg is undefined if x==0, but their CPU architect says its
@@ -450,16 +438,6 @@ static inline int fls(int x)
        asm("bsrl %1,%0"
            : "=r" (r)
            : "rm" (x), "0" (-1));
-#elif defined(CONFIG_X86_CMOV)
-       asm("bsrl %1,%0\n\t"
-           "cmovzl %2,%0"
-           : "=&r" (r) : "rm" (x), "rm" (-1));
-#else
-       asm("bsrl %1,%0\n\t"
-           "jnz 1f\n\t"
-           "movl $-1,%0\n"
-           "1:" : "=r" (r) : "rm" (x));
-#endif
        return r + 1;
 }
 
@@ -474,7 +452,6 @@ static inline int fls(int x)
  * set bit if value is nonzero. The last (most significant) bit is
  * at position 64.
  */
-#ifdef CONFIG_X86_64
 static __always_inline int fls64(uint64_t x)
 {
        int bitpos = -1;
@@ -488,7 +465,5 @@ static __always_inline int fls64(uint64_t x)
            : "rm" (x));
        return bitpos + 1;
 }
-#else
-#error "Need the generic version of fls64"
-#endif
+
 #endif /* _ASM_X86_BITOPS_H */
index 5c319f8..5043ef4 100644 (file)
@@ -37,7 +37,6 @@ static inline int node_id(void)
        return 0;
 }
 
-#ifdef CONFIG_X86_64
 static inline int core_id(void)
 {
        int coreid;
@@ -47,17 +46,6 @@ static inline int core_id(void)
        asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
        return coreid;
 }
-#else
-/* 32 bit code just uses the old crap.  could use rdtscp, but not worth the
- * hassle. */
-/* 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());
-}
-#endif /* CONFIG_X86_64 */
 
 /* Tracks whether it is safe to execute core_id() or not. */
 extern bool core_id_ready;
index 33dd980..521b6dd 100644 (file)
@@ -159,13 +159,11 @@ void print_cpuinfo(void)
        lcr4(rcr4() & ~CR4_TSD);
        printk("1 GB Jumbo pages %ssupported\n", edx & (1 << 26) ? "" : "not ");
        printk("FS/GS MSRs %ssupported\n", edx & (1 << 29) ? "" : "not ");
-       #ifdef CONFIG_X86_64
        if (!(edx & (1 << 29))) {
                printk("Can't handle no FS/GS MSRs!\n");
                while (1)
                        asm volatile ("hlt");
        }
-       #endif
        cpuid(0x00000006, 0x0, &eax, 0, 0, 0);
        if (eax & (1 << 2))
                printk("Always running APIC detected\n");
@@ -173,13 +171,8 @@ void print_cpuinfo(void)
                printk("Always running APIC *not* detected\n");
 }
 
-#ifdef CONFIG_X86_64
 #define BIT_SPACING "        "
 #define BIT_DASHES "----------------"
-#else
-#define BIT_SPACING ""
-#define BIT_DASHES ""
-#endif
 
 void show_mapping(pde_t *pgdir, uintptr_t start, size_t size)
 {
index 6a6853b..1e6178e 100644 (file)
@@ -328,32 +328,15 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
 
 void backtrace_frame(uintptr_t eip, uintptr_t ebp)
 { 
-       extern char (SNT RO _start)[];
-       eipdebuginfo_t debuginfo;
-       char buf[256];
        char *func_name;
        #define MAX_BT_DEPTH 20
        uintptr_t pcs[MAX_BT_DEPTH];
        size_t nr_pcs = backtrace_list(eip, ebp, pcs, MAX_BT_DEPTH);
 
        for (int i = 0; i < nr_pcs; i++) {
-               #ifdef CONFIG_X86_64
                func_name = get_fn_name(pcs[i]);
                printk("#%02d [<%p>] in %s\n", i + 1,  pcs[i], func_name);
                kfree(func_name);
-               #else
-               debuginfo_eip(pcs[i], &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 + 1,  pcs[i], buf, 
-                       debuginfo.eip_fn_addr - (uintptr_t)_start,
-                       debuginfo.eip_fn_addr, debuginfo.eip_file, debuginfo.eip_line);
-               cprintf("    ebp: %x   Args:", ebp);
-               for (int j = 0; j < MIN(debuginfo.eip_fn_narg, 5); j++)
-                       cprintf(" %08x", *(uintptr_t*)(ebp + 2 + j));
-               cprintf("\n");
-               #endif /* CONFIG_X86_64 */
        }
 }
 
diff --git a/kern/arch/x86/kernel32.ld b/kern/arch/x86/kernel32.ld
deleted file mode 100644 (file)
index dca2ddf..0000000
+++ /dev/null
@@ -1,79 +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)
-       }
-
-       /* Needed this for syslinux, which was sitting around 16MB phys.  This just
-        * jumps us forward to the 32MB mark, both physically and virtually. */
-       . = 0x02000000;
-
-       /* 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 */
-
-       INCLUDE kern/linker_tables.ld
-
-       .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)
-       }
-}
index 44d84c6..ae17264 100644 (file)
@@ -200,7 +200,6 @@ static void account_for_pages(physaddr_t boot_freemem_paddr)
         * array either (and accidentally run off the end of the array).
         *
         * Additionally, 32 bit doesn't acknowledge pmem above the 4GB mark. */
-#ifdef CONFIG_X86_64
        start_of_free_2 = 0x0000000100000000;
        if (max_paddr < start_of_free_2)
                return;
@@ -208,7 +207,6 @@ static void account_for_pages(physaddr_t boot_freemem_paddr)
                assert(kref_refcnt(&pa64_to_page(i)->pg_kref) == 1);
        for (physaddr_t i = start_of_free_2; i < max_paddr; i += PGSIZE)
                track_free_page(pa64_to_page(i));
-#endif /* CONFIG_X86_64 */
 }
 
 /* Initialize the memory free lists.  After this, do not use boot_alloc. */
index 960b40f..280c3d0 100644 (file)
@@ -4,11 +4,7 @@
 #ifndef ROS_INC_ARCH_MMU_H
 #define ROS_INC_ARCH_MMU_H
 
-#ifdef __x86_64__
 #include <ros/arch/mmu64.h>
-#else
-#include <ros/arch/mmu32.h>
-#endif
 
 /* **************************************** */
 /* Control Registers */
diff --git a/kern/arch/x86/ros/mmu32.h b/kern/arch/x86/ros/mmu32.h
deleted file mode 100644 (file)
index 62196f7..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-#ifndef ROS_INC_ARCH_MMU32_H
-#define ROS_INC_ARCH_MMU32_H
-
-#ifndef ROS_INC_ARCH_MMU_H
-#error "Do not include include ros/arch/mmu32.h directly"
-#endif
-
-#ifndef __ASSEMBLER__
-#include <ros/common.h>
-typedef unsigned long pte_t;
-typedef unsigned long pde_t;
-#endif
-
-/* x86's 32 bit Virtual Memory Map.  Symbols are similar on other archs
- *
- * Virtual memory map:                                Permissions
- *                                                    kernel/user
- *
- *    4 Gig -------->  +------------------------------+
- *                     :              .               :
- *  KERN_VMAP_TOP      +------------------------------+ 0xfec00000
- *                     |                              |
- *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
- *                     :              .               :
- *                     :              .               :
- *                     :              .               :
- *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| RW/--
- *                     |                              | RW/--
- *                     |   Remapped Physical Memory   | RW/--
- *                     |                              | RW/--
- *    KERNBASE ----->  +------------------------------+ 0xc0000000
- *                     |  Cur. Page Table (Kern. RW)  | RW/--  PTSIZE
- *    VPT          --> +------------------------------+ 0xbfc00000
- *                     |          Local APIC          | RW/--  APIC_SIZE
- *    LAPIC        --> +------------------------------+ 0xbfb00000
- *                     |            IOAPIC            | RW/--  APIC_SIZE
- *    IOAPIC,      --> +------------------------------+ 0xbfa00000
- *  KERN_DYN_TOP       |   Kernel Dynamic Mappings    |
- *                     |              .               |
- *                     :              .               :
- *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
- *                     :                              :
- *                     |      Invalid Memory (*)      | --/--
- *    ULIM      ---->  +------------------------------+ 0x80000000      --+
- *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE     |
- *    UVPT      ---->  +------------------------------+ 0x7fc00000      --+
- *                     | Unmapped (expandable region) |                   |
- *                     |                              | R-/R-            PTSIZE
- *                     |     Per-Process R/O Info     |                   |
- * UWLIM, UINFO ---->  +------------------------------+ 0x7f800000      --+
- *                     | Unmapped (expandable region) |                   |
- *                     |                              | RW/RW            PTSIZE
- *                     |     Per-Process R/W Data     |                   |
- *    UDATA     ---->  +------------------------------+ 0x7f400000      --+
- *    UMAPTOP,         |    Global Shared R/W Data    | RW/RW  PGSIZE
- *      UGDATA  ---->  +------------------------------+ 0x7f3ff000
- *                     |     User Exception Stack     | RW/RW  PGSIZE
- *                     +------------------------------+ 0x7f3fe000
- *                     |       Empty Memory (*)       | --/--  PGSIZE
- *    USTACKTOP  --->  +------------------------------+ 0x7f3fd000
- *                     |      Normal User Stack       | RW/RW  256*PGSIZE (1MB)
- *                     +------------------------------+ 0x7f2fd000
- *                     |       Empty Memory (*)       | --/--  PGSIZE
- *    USTACKBOT  --->  +------------------------------+ 0x7f2fc000
- *                     |                              |
- *                     |                              |
- *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *                     .                              .
- *                     .                              .
- *                     .                              .
- *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
- *                     |     Program Data & Heap      |
- *    UTEXT -------->  +------------------------------+ 0x00800000
- *                     |                              |
- *                     |       Empty Memory (*)       |
- *                     |                              |
- *                     +------------------------------+ 0x00000000
- *
- * (*) Note: The kernel ensures that "Invalid Memory" (ULIM) is *never*
- *     mapped.  "Empty Memory" is normally unmapped, but user programs may
- *     map pages there if desired.  ROS user programs map pages temporarily
- *     at UTEMP.
- *
- *     KERN_VMAP_TOP is set to the IO_APIC_BASE, where we'll map in the IOAPIC
- *     and LAPIC.  We need to not give out this region as free pages.
- */
-
-
-// At IOPHYSMEM (640K) there is a 384K hole for I/O.  From the kernel,
-// IOPHYSMEM can be addressed at KERNBASE + IOPHYSMEM.  The hole ends
-// at physical address EXTPHYSMEM.
-#define IOPHYSMEM      0x0A0000
-#define VGAPHYSMEM     0x0A0000
-#define DEVPHYSMEM     0x0C0000
-#define BIOSPHYSMEM    0x0F0000
-#define EXTPHYSMEM     0x100000
-
-/* **************************************** */
-/* Kernel Virtual Memory Mapping  (not really an MMU thing) */
-
-#define KERNBASE        0xC0000000
-#define KERN_LOAD_ADDR  KERNBASE
-/* 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 kernel mappings */
-/* Virtual page table.  Entry PDX(VPT) in the PD contains a pointer to
- * the page directory itself, thereby turning the PD into a page table,
- * which maps all the PTEs containing the page mappings for the entire
- * virtual address space into that 4 Meg region starting at VPT. */
-#define VPT                            (KERNBASE - PTSIZE)
-#define VPD (VPT + (VPT >> 10))
-#define vpd VPD
-#define APIC_SIZE              0x100000
-#define LAPIC_BASE             (VPT - APIC_SIZE)
-#define IOAPIC_BASE            (LAPIC_BASE - APIC_SIZE)
-
-/* All arches must define this, which is the lower limit of their static
- * mappings, and where the dynamic mappings will start. */
-#define KERN_DYN_TOP   IOAPIC_BASE
-
-#define ULIM            0x80000000
-
-/* Same as VPT but read-only for users */
-#define UVPT           (ULIM - PTSIZE)
-
-/* Arbitrary boundary between the break and the start of
- * memory returned by calls to mmap with addr = 0 */
-#define BRK_END 0x40000000
-
-// Use this if needed in annotations
-#define IVY_KERNBASE (0xC000U << 16)
-
-/* **************************************** */
-/* Page table constants, macros, etc */
-
-// A linear address 'la' has a three-part structure as follows:
-//
-// +--------10------+-------10-------+---------12----------+
-// | Page Directory |   Page Table   | Offset within Page  |
-// |      Index     |      Index     |                     |
-// +----------------+----------------+---------------------+
-//  \--- PDX(la) --/ \--- PTX(la) --/ \---- PGOFF(la) ----/
-//  \----------- PPN(la) -----------/
-//
-// The PDX, PTX, PGOFF, and PPN macros decompose linear addresses as shown.
-// To construct a linear address la from PDX(la), PTX(la), and PGOFF(la),
-// use PGADDR(PDX(la), PTX(la), PGOFF(la)).
-
-// page number field of address
-#define LA2PPN(la)     (((uintptr_t) (la)) >> PGSHIFT)
-#define PTE2PPN(pte)   LA2PPN(pte)
-
-// page directory index
-#define PDX(la)                ((((uintptr_t) (la)) >> PDXSHIFT) & 0x3FF)
-
-// page table index
-#define PTX(la)                ((((uintptr_t) (la)) >> PTXSHIFT) & 0x3FF)
-
-// offset in page
-#define PGOFF(la)      (((uintptr_t) (la)) & 0xFFF)
-
-// offset in jumbo page
-#define JPGOFF(la)     (((uintptr_t) (la)) & 0x003FFFFF)
-
-// construct PTE from PPN and flags
-#define PTE(ppn, flags) ((ppn) << PTXSHIFT | PGOFF(flags))
-
-// construct linear address from indexes and offset
-#define PGADDR(d, t, o)        ((void*SNT) ((d) << PDXSHIFT | (t) << PTXSHIFT | (o)))
-
-// Page directory and page table constants.
-#define NPDENTRIES     1024            // page directory entries per page directory
-#define NPTENTRIES     1024            // page table entries per page table
-
-#define PTXSHIFT       12              // offset of PTX in a linear address
-#define PDXSHIFT       22              // offset of PDX in a linear address
-
-// Page table/directory entry flags.
-#define PTE_P          0x001   // Present
-#define PTE_W          0x002   // Writeable
-#define PTE_U          0x004   // User
-#define PTE_PWT                0x008   // Write-Through
-#define PTE_PCD                0x010   // Cache-Disable
-#define PTE_A          0x020   // Accessed
-#define PTE_D          0x040   // Dirty
-#define PTE_PS         0x080   // Page Size (only applies to PDEs)
-#define PTE_PAT                0x080   // PAT (only applies to second layer PTEs)
-#define PTE_G          0x100   // Global Page
-#define PTE_NOCACHE    (PTE_PWT | PTE_PCD)
-
-#define PTE_PERM       (PTE_W | PTE_U) // The permissions fields
-// commly used access modes
-#define PTE_KERN_RW    PTE_W           // Kernel Read/Write
-#define PTE_KERN_RO    0               // Kernel Read-Only
-#define PTE_USER_RW    (PTE_W | PTE_U) // Kernel/User Read/Write
-#define PTE_USER_RO    PTE_U           // Kernel/User Read-Only
-
-// The PTE_AVAIL bits aren't used by the kernel or interpreted by the
-// hardware, so user processes are allowed to set them arbitrarily.
-#define PTE_AVAIL      0xE00   // Available for software use
-
-// Only flags in PTE_USER may be used in system calls.
-#define PTE_USER       (PTE_AVAIL | PTE_P | PTE_W | PTE_U)
-
-// address in page table entry
-#define PTE_ADDR(pte)  ((physaddr_t) (pte) & ~0xFFF)
-
-#define PTSHIFT 22
-#define PTSIZE (1 << PTSHIFT)
-#define PGSHIFT 12
-#define PGSIZE (1 << PGSHIFT)
-#define JPGSIZE PTSIZE
-
-// we must guarantee that for any PTE, exactly one of the following is true
-#define PAGE_PRESENT(pte) ((pte) & PTE_P)
-#define PAGE_UNMAPPED(pte) ((pte) == 0)
-#define PAGE_PAGED_OUT(pte) (!PAGE_PRESENT(pte) && !PAGE_UNMAPPED(pte))
-
-/* **************************************** */
-/* Segmentation */
-
-// Global descriptor numbers
-#define GD_NULL   0x00     // NULL descriptor
-#define GD_KT     0x08     // kernel text
-#define GD_KD     0x10     // kernel data
-#define GD_UT     0x18     // user text
-#define GD_UD     0x20     // user data
-#define GD_TSS    0x28     // Task segment selector
-#define GD_LDT    0x30     // local descriptor table
-
-#ifdef __ASSEMBLER__
-
-/*
- * Macros to build GDT entries in assembly.
- */
-#define SEG_NULL                                               \
-       .word 0, 0;                                             \
-       .byte 0, 0, 0, 0
-#define SEG(type,base,lim)                                     \
-       .word (((lim) >> 12) & 0xffff), ((base) & 0xffff);      \
-       .byte (((base) >> 16) & 0xff), (0x90 | (type)),         \
-               (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
-
-#else  // not __ASSEMBLER__
-
-// Segment Descriptors
-typedef struct Segdesc {
-       unsigned sd_lim_15_0 : 16;  // Low bits of segment limit
-       unsigned sd_base_15_0 : 16; // Low bits of segment base address
-       unsigned sd_base_23_16 : 8; // Middle bits of segment base address
-       unsigned sd_type : 4;       // Segment type (see STS_ constants)
-       unsigned sd_s : 1;          // 0 = system, 1 = application
-       unsigned sd_dpl : 2;        // Descriptor Privilege Level
-       unsigned sd_p : 1;          // Present
-       unsigned sd_lim_19_16 : 4;  // High bits of segment limit
-       unsigned sd_avl : 1;        // Unused (available for software use)
-       unsigned sd_rsv1 : 1;       // Reserved
-       unsigned sd_db : 1;         // 0 = 16-bit segment, 1 = 32-bit segment
-       unsigned sd_g : 1;          // Granularity: limit scaled by 4K when set
-       unsigned sd_base_31_24 : 8; // High bits of segment base address
-} segdesc_t;
-typedef struct Segdesc syssegdesc_t;
-
-// Null segment
-#define SEG_NULL       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
-// Segment that is loadable but faults when used
-#define SEG_FAULT      { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0 }
-// Normal segment
-#define SEG(type, base, lim, dpl)                                                                      \
-{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,      \
-    type, 1, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                       \
-    (unsigned) (base) >> 24 }
-
-#define SEG16(type, base, lim, dpl)                                                            \
-{ (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,                      \
-    type, 1, dpl, 1, (unsigned) (lim) >> 16, 0, 0, 1, 0,                       \
-    (unsigned) (base) >> 24 }
-
-// System segment (LDT)
-#define SEG_SYS(type, base, lim, dpl)                                                          \
-{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,      \
-    type, 0, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                       \
-    (unsigned) (base) >> 24 }
-
-#define SEG16_SYS(type, base, lim, dpl)                                                        \
-{ (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,                      \
-    type, 0, dpl, 1, (unsigned) (lim) >> 16, 0, 0, 1, 0,                       \
-    (unsigned) (base) >> 24 }
-
-#define SEG_SYS_SMALL(type, base, lim, dpl) \
-        SEG16_SYS(type, base, lim, dpl)
-
-// Task state segment format (as described by the Pentium architecture book)
-typedef struct taskstate {
-       uint32_t ts_link;       // Old ts selector
-       uintptr_t ts_esp0;      // Stack pointers and segment selectors
-       uint16_t ts_ss0;        //   after an increase in privilege level
-       uint16_t ts_padding1;
-       uintptr_t ts_esp1;
-       uint16_t ts_ss1;
-       uint16_t ts_padding2;
-       uintptr_t ts_esp2;
-       uint16_t ts_ss2;
-       uint16_t ts_padding3;
-       physaddr_t ts_cr3;      // Page directory base
-       uintptr_t ts_eip;       // Saved state from last task switch
-       uint32_t ts_eflags;
-       uint32_t ts_eax;        // More saved state (registers)
-       uint32_t ts_ecx;
-       uint32_t ts_edx;
-       uint32_t ts_ebx;
-       uintptr_t ts_esp;
-       uintptr_t ts_ebp;
-       uint32_t ts_esi;
-       uint32_t ts_edi;
-       uint16_t ts_es;         // Even more saved state (segment selectors)
-       uint16_t ts_padding4;
-       uint16_t ts_cs;
-       uint16_t ts_padding5;
-       uint16_t ts_ss;
-       uint16_t ts_padding6;
-       uint16_t ts_ds;
-       uint16_t ts_padding7;
-       uint16_t ts_fs;
-       uint16_t ts_padding8;
-       uint16_t ts_gs;
-       uint16_t ts_padding9;
-       uint16_t ts_ldt;
-       uint16_t ts_padding10;
-       uint16_t ts_t;          // Trap on task switch
-       uint16_t ts_iomb;       // I/O map base address
-} taskstate_t;
-
-// Gate descriptors for interrupts and traps
-typedef struct Gatedesc {
-       unsigned gd_off_15_0 : 16;   // low 16 bits of offset in segment
-       unsigned gd_ss : 16;         // segment selector
-       unsigned gd_args : 5;        // # args, 0 for interrupt/trap gates
-       unsigned gd_rsv1 : 3;        // reserved(should be zero I guess)
-       unsigned gd_type : 4;        // type(STS_{TG,IG32,TG32})
-       unsigned gd_s : 1;           // must be 0 (system)
-       unsigned gd_dpl : 2;         // DPL - highest ring allowed to use this
-       unsigned gd_p : 1;           // Present
-       unsigned gd_off_31_16 : 16;  // high bits of offset in segment
-} gatedesc_t;
-
-// Set up a normal interrupt/trap gate descriptor.
-// - istrap: 1 for a trap (= exception) gate, 0 for an interrupt gate.
-//   - interrupt gates automatically disable interrupts (cli)
-// - sel: Code segment selector for interrupt/trap handler
-// - off: Offset in code segment for interrupt/trap handler
-// - dpl: Descriptor Privilege Level -
-//       the privilege level required for software to invoke
-//       this interrupt/trap gate explicitly using an int instruction.
-#define SETGATE(gate, istrap, sel, off, dpl)                   \
-{                                                              \
-       (gate).gd_off_15_0 = (uint32_t) (off) & 0xffff;         \
-       (gate).gd_ss = (sel);                                   \
-       (gate).gd_args = 0;                                     \
-       (gate).gd_rsv1 = 0;                                     \
-       (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32;        \
-       (gate).gd_s = 0;                                        \
-       (gate).gd_dpl = (dpl);                                  \
-       (gate).gd_p = 1;                                        \
-       (gate).gd_off_31_16 = (uint32_t) (off) >> 16;           \
-}
-
-#define ROSETGATE(gate, istrap, sel, off, dpl)                 \
-{                                                              \
-       (gate).gd_off_15_0 = SINIT((uint32_t) (off) & 0xffff);          \
-       (gate).gd_ss = SINIT(sel);                                      \
-       (gate).gd_args = SINIT(0);                                      \
-       (gate).gd_rsv1 = SINIT(0);                                      \
-       (gate).gd_type = SINIT((istrap) ? STS_TG32 : STS_IG32); \
-       (gate).gd_s = SINIT(0);                                 \
-       (gate).gd_dpl = SINIT(dpl);                                     \
-       (gate).gd_p = SINIT(1);                                 \
-       (gate).gd_off_31_16 = SINIT((uint32_t) (off) >> 16);            \
-}
-
-// Set up a call gate descriptor.
-#define SETCALLGATE(gate, ss, off, dpl)                        \
-{                                                              \
-       (gate).gd_off_15_0 = (uint32_t) (off) & 0xffff;         \
-       (gate).gd_ss = (ss);                                    \
-       (gate).gd_args = 0;                                     \
-       (gate).gd_rsv1 = 0;                                     \
-       (gate).gd_type = STS_CG32;                              \
-       (gate).gd_s = 0;                                        \
-       (gate).gd_dpl = (dpl);                                  \
-       (gate).gd_p = 1;                                        \
-       (gate).gd_off_31_16 = (uint32_t) (off) >> 16;           \
-}
-
-// Pseudo-descriptors used for LGDT, LLDT and LIDT instructions.
-typedef struct Pseudodesc {
-       uint16_t pd_lim;                // Limit
-       uint32_t pd_base;               // Base address
-} __attribute__ ((packed)) pseudodesc_t;
-
-#endif /* !__ASSEMBLER__ */
-
-// Application segment type bits
-#define STA_X          0x8         // Executable segment
-#define STA_E          0x4         // Expand down (non-executable segments)
-#define STA_C          0x4         // Conforming code segment (executable only)
-#define STA_W          0x2         // Writeable (non-executable segments)
-#define STA_R          0x2         // Readable (executable segments)
-#define STA_A          0x1         // Accessed
-
-// System segment type bits
-#define STS_T16A       0x1         // Available 16-bit TSS
-#define STS_LDT                0x2         // Local Descriptor Table
-#define STS_T16B       0x3         // Busy 16-bit TSS
-#define STS_CG16       0x4         // 16-bit Call Gate
-#define STS_TG         0x5         // Task Gate / Coum Transmitions
-#define STS_IG16       0x6         // 16-bit Interrupt Gate
-#define STS_TG16       0x7         // 16-bit Trap Gate
-#define STS_T32A       0x9         // Available 32-bit TSS
-#define STS_T32B       0xB         // Busy 32-bit TSS
-#define STS_CG32       0xC         // 32-bit Call Gate
-#define STS_IG32       0xE         // 32-bit Interrupt Gate
-#define STS_TG32       0xF         // 32-bit Trap Gate
-
-#define SEG_COUNT      7               // Number of segments in the steady state
-#define LDT_SIZE       (8192 * sizeof(segdesc_t))
-#endif /* ROS_INC_ARCH_MMU32_H */
index 72eef4e..c038c19 100644 (file)
@@ -5,11 +5,7 @@
 
 #ifndef ROS_KERNEL
 
-#ifdef __x86_64__
 #include <ros/arch/syscall64.h>
-#else
-#include <ros/arch/syscall32.h>
-#endif
 
 static inline long __ros_arch_syscall(long _a0, long _a1)
 {
diff --git a/kern/arch/x86/ros/syscall32.h b/kern/arch/x86/ros/syscall32.h
deleted file mode 100644 (file)
index b97627a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef ROS_INC_ARCH_SYSCALL32_H
-#define ROS_INC_ARCH_SYSCALL32_H
-
-#ifndef ROS_INC_ARCH_SYSCALL_H
-#error "Do not include include ros/arch/syscall32.h directly"
-#endif
-
-#ifndef ROS_KERNEL
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <ros/common.h>
-#include <assert.h>
-
-static inline intreg_t __syscall_sysenter(uintreg_t a0, uintreg_t a1)
-{
-       /* The kernel clobbers ecx, so we save it manually. */
-       intreg_t ret = 0;
-       asm volatile ("  pushl %%ecx;        "
-                     "  pushl %%edx;        "
-                     "  pushl %%ebp;        "
-                     "  movl %%esp, %%ebp;  "
-                     "  leal 1f, %%edx;     "
-                     "  sysenter;           "
-                     "1:                    "
-                     "  popl %%ebp;         "
-                     "  popl %%edx;         "
-                     "  popl %%ecx;         "
-                     : "=a" (ret)
-                     : "a" (a0),
-                       "S" (a1)
-                     : "cc", "memory");
-       return ret;
-}
-
-static inline intreg_t __syscall_trap(uintreg_t a0, uintreg_t a1)
-{
-       intreg_t ret;
-
-       /* If you change this, change pop_user_ctx() */
-       asm volatile("int %1"
-                    : "=a" (ret)
-                    : "i" (T_SYSCALL),
-                      "a" (a0),
-                      "d" (a1)
-                    : "cc", "memory");
-       return ret;
-}
-
-#endif
-
-#endif /* ROS_INC_ARCH_SYSCALL32_H */
index 53083c3..0ead2da 100644 (file)
 #define PF_ERROR_USER                  0x04
 #define PF_VMR_BACKED                  (1 << 31)
 
-#ifdef __x86_64__
 #include <ros/arch/trapframe64.h>
-#else
-#include <ros/arch/trapframe32.h>
-#endif
 
 /* FP state and whatever else the kernel won't muck with automatically.  For
  * now, it's the Non-64-bit-mode layout of FP and XMM registers, as used by
diff --git a/kern/arch/x86/ros/trapframe32.h b/kern/arch/x86/ros/trapframe32.h
deleted file mode 100644 (file)
index 0cc3e19..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef ROS_INC_ARCH_TRAPFRAME32_H
-#define ROS_INC_ARCH_TRAPFRAME32_H
-
-#ifndef ROS_INC_ARCH_TRAPFRAME_H
-#error "Do not include include ros/arch/trapframe32.h directly"
-#endif
-
-typedef struct pushregs {
-       /* registers as pushed by pusha */
-       uint32_t reg_edi;
-       uint32_t reg_esi;
-       uint32_t reg_ebp; uint32_t reg_oesp;            /* Useless */
-       uint32_t reg_ebx;
-       uint32_t reg_edx;
-       uint32_t reg_ecx;
-       uint32_t reg_eax;
-} push_regs_t;
-
-struct hw_trapframe {
-       push_regs_t tf_regs;
-       uint16_t tf_gs;
-       uint16_t tf_padding1;
-       uint16_t tf_fs;
-       uint16_t tf_padding2;
-       uint16_t tf_es;
-       uint16_t tf_padding3;
-       uint16_t tf_ds;
-       uint16_t tf_padding4;
-       uint32_t tf_trapno;
-       /* below here defined by x86 hardware */
-       uint32_t tf_err;
-       uintptr_t tf_eip;
-       uint16_t tf_cs;
-       uint16_t tf_padding5;
-       uint32_t tf_eflags;
-       /* below here only when crossing rings, such as from user to kernel */
-       uintptr_t tf_esp;
-       uint16_t tf_ss;
-       uint16_t tf_padding6;
-};
-
-struct sw_trapframe {
-       uint32_t tf_ebp;
-       uint32_t tf_ebx;
-       uint32_t tf_esi;
-       uint32_t tf_edi;
-       uint32_t tf_esp;
-       uint32_t tf_eip;
-       uint32_t tf_mxcsr;
-       uint16_t tf_fpucw;
-       uint16_t tf_gs;         /* something to track TLS is callee-saved (sort of) */
-};
-
-#endif /* ROS_INC_ARCH_TRAPFRAME32_H */
index dd1b143..9886fd2 100644 (file)
@@ -90,14 +90,12 @@ void smp_final_core_init(void)
                wait = FALSE;
        while (wait)
                cpu_relax();
-#ifdef CONFIG_X86_64
        /* at this point, it is safe to get the OS coreid */
        int coreid = get_os_coreid(hw_core_id());
        struct per_cpu_info *pcpui = &per_cpu_info[coreid];
        pcpui->coreid = coreid;
        write_msr(MSR_GS_BASE, (uint64_t)pcpui);
        write_msr(MSR_KERN_GS_BASE, (uint64_t)pcpui);
-#endif
        /* don't need this for the kernel anymore, but userspace can still use it */
        setup_rdtscp(coreid);
        /* After this point, all cores have set up their segmentation and whatnot to
@@ -173,13 +171,8 @@ void smp_boot(void)
        memcpy(KADDR(trampoline_pg), (void *COUNT(PGSIZE))TC(smp_entry),
            smp_entry_end - smp_entry);
 
-       /* 64 bit already has the tramp pg mapped (1 GB of lowmem)  */
-#ifndef CONFIG_X86_64
-       // This mapping allows access to the trampoline with paging on and off
-       // via trampoline_pg
-       page_insert(boot_pgdir, pa2page(trampoline_pg), (void*SNT)trampoline_pg,
-                   PTE_W);
-#endif
+       /* Make sure the trampoline page is mapped.  64 bit already has the tramp pg
+        * mapped (1 GB of lowmem), so this is a nop. */
 
        // Allocate a stack for the cores starting up.  One for all, must share
        if (kpage_alloc(&smp_stack))
@@ -346,10 +339,8 @@ void __arch_pcpu_init(uint32_t coreid)
                pcpui->gdt = (segdesc_t*)(*my_stack_bot +
                                          sizeof(taskstate_t) + sizeof(pseudodesc_t));
        }
-#ifdef CONFIG_X86_64
        assert(read_msr(MSR_GS_BASE) == (uint64_t)pcpui);
        assert(read_msr(MSR_KERN_GS_BASE) == (uint64_t)pcpui);
-#endif
        /* Don't try setting up til after setting GS */
        x86_sysenter_init(x86_get_stacktop_tss(pcpui->tss));
        /* need to init perfctr before potentiall using it in timer handler */
index 10526be..9de622d 100644 (file)
@@ -278,21 +278,12 @@ static bool __handle_page_fault(struct hw_trapframe *hw_tf, unsigned long *aux)
                       hw_tf->tf_rip, core_id(), err);
                print_trapframe(hw_tf);
                /* Turn this on to help debug bad function pointers */
-#ifdef CONFIG_X86_64
                printd("rsp %p\n\t 0(rsp): %p\n\t 8(rsp): %p\n\t 16(rsp): %p\n"
                       "\t24(rsp): %p\n", hw_tf->tf_rsp,
                       *(uintptr_t*)(hw_tf->tf_rsp +  0),
                       *(uintptr_t*)(hw_tf->tf_rsp +  8),
                       *(uintptr_t*)(hw_tf->tf_rsp + 16),
                       *(uintptr_t*)(hw_tf->tf_rsp + 24));
-#else
-               printd("esp %p\n\t 0(esp): %p\n\t 4(esp): %p\n\t 8(esp): %p\n"
-                      "\t12(esp): %p\n", hw_tf->tf_esp,
-                      *(uintptr_t*)(hw_tf->tf_esp +  0),
-                      *(uintptr_t*)(hw_tf->tf_esp +  4),
-                      *(uintptr_t*)(hw_tf->tf_esp +  8),
-                      *(uintptr_t*)(hw_tf->tf_esp + 12));
-#endif
        }
        return TRUE;
 }
@@ -618,7 +609,6 @@ int route_irqs(int apic_vec, int os_coreid)
 
 /* It's a moderate pain in the ass to put these in bit-specific files (header
  * hell with the set_current_ helpers) */
-#ifdef CONFIG_X86_64
 void sysenter_callwrapper(struct syscall *sysc, unsigned long count,
                           struct sw_trapframe *sw_tf)
 {
@@ -635,30 +625,6 @@ void sysenter_callwrapper(struct syscall *sysc, unsigned long count,
        proc_restartcore();
 }
 
-#else
-
-/* This is called from sysenter's asm, with the tf on the kernel stack. */
-/* TODO: use a sw_tf for sysenter */
-void sysenter_callwrapper(struct hw_trapframe *hw_tf)
-{
-       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
-       assert(!in_kernel(hw_tf));
-       set_current_ctx_hw(pcpui, hw_tf);
-       __set_cpu_state(pcpui, CPU_STATE_KERNEL);
-       /* Once we've set_current_ctx, we can enable interrupts.  This used to be
-        * mandatory (we had immediate KMSGs that would muck with cur_ctx).  Now it
-        * should only help for sanity/debugging. */
-       enable_irq();
-
-       /* Set up and run the async calls */
-       prep_syscalls(current,
-                                 (struct syscall*)x86_get_sysenter_arg0(hw_tf),
-                                 (unsigned int)x86_get_sysenter_arg1(hw_tf));
-       /* If you use pcpui again, reread it, since you might have migrated */
-       proc_restartcore();
-}
-#endif
-
 /* Declared in x86/arch.h */
 void send_ipi(uint32_t os_coreid, uint8_t vector)
 {
index 0ee5767..4366181 100644 (file)
@@ -196,11 +196,7 @@ set_frame_pointer(uintptr_t fp)
 
 extern segdesc_t *gdt;
 
-#ifdef CONFIG_X86_64
 #include <arch/trap64.h>
-#else
-#include <arch/trap32.h>
-#endif
 
 #endif /* !__ASSEMBLER__ */
 
diff --git a/kern/arch/x86/trap32.h b/kern/arch/x86/trap32.h
deleted file mode 100644 (file)
index d70a52b..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Copyright (c) 2009-13 The Regents of the University of California
- * Barret Rhoden <brho@cs.berkeley.edu>
- * See LICENSE for details.
- *
- * x86 trap.h bit-specific functions.  This is included by trap.h, do not
- * include it directly.  Any function beginning with x86_ is internal to x86,
- * and not to be called by the main kernel.  Other functions are part of the
- * kernel-arch interface. */
-
-#ifndef ROS_KERN_ARCH_TRAP32_H
-#define ROS_KERN_ARCH_TRAP32_H
-
-#ifndef ROS_KERN_ARCH_TRAP_H
-#error "Do not include arch/trap32.h directly."
-#endif
-
-static inline bool in_kernel(struct hw_trapframe *hw_tf)
-{
-       return (hw_tf->tf_cs & ~3) == GD_KT;
-}
-
-static inline uintptr_t get_hwtf_pc(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_eip;
-}
-
-static inline uintptr_t get_hwtf_fp(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_ebp;
-}
-
-static inline uintptr_t x86_get_ip_hw(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_eip;
-}
-
-static inline void x86_advance_ip(struct hw_trapframe *hw_tf, size_t bytes)
-{
-       hw_tf->tf_eip += bytes;
-}
-
-static inline void x86_fake_rdtscp(struct hw_trapframe *hw_tf)
-{
-       uint64_t tsc_time = read_tsc();
-       hw_tf->tf_eip += 3;
-       hw_tf->tf_regs.reg_eax = tsc_time & 0xffffffff;
-       hw_tf->tf_regs.reg_edx = tsc_time >> 32;
-       hw_tf->tf_regs.reg_ecx = core_id();
-}
-
-static inline void x86_sysenter_init(uintptr_t stacktop)
-{
-       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
-       write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
-       write_msr(MSR_IA32_SYSENTER_EIP, (uintptr_t) &sysenter_handler);
-}
-
-static inline void x86_set_sysenter_stacktop(uintptr_t stacktop)
-{
-       write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
-}
-
-static inline long x86_get_sysenter_arg0(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_eax;
-}
-
-static inline long x86_get_sysenter_arg1(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_esi;
-}
-
-static inline long x86_get_systrap_arg0(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_eax;
-}
-
-static inline long x86_get_systrap_arg1(struct hw_trapframe *hw_tf)
-{
-       return hw_tf->tf_regs.reg_edx;
-}
-
-static inline uintptr_t x86_get_stacktop_tss(struct taskstate *tss)
-{
-       return tss->ts_esp0;
-}
-
-static inline void x86_set_stacktop_tss(struct taskstate *tss, uintptr_t top)
-{
-       tss->ts_esp0 = top;
-       tss->ts_ss0 = GD_KD;
-}
-
-#endif /* ROS_KERN_ARCH_TRAP32_H */
index 19700b9..6b7c188 100644 (file)
@@ -26,8 +26,6 @@ typedef int pid_t;
 typedef int uid_t;
 typedef int gid_t;
 
-#ifdef CONFIG_X86_64
-
 #define NUM_ADDR_BITS 64
 #define BITS_PER_LONG 64
 #define MAX_VADDR     ((uint64_t)(~0) >> (64-NUM_ADDR_BITS))
@@ -35,17 +33,5 @@ typedef uint64_t uintptr_t;
 #define PAGE_SHIFT 12
 #define PAGE_SIZE (1<<PAGE_SHIFT)
 #define PAGE_MASK 0xFFFFFFFFfffff000
-#else /* 32 bit */
-
-#define NUM_ADDR_BITS 32
-#define BITS_PER_LONG 32
-#define MAX_VADDR     ((uint64_t)(~0) >> (64-NUM_ADDR_BITS))
-typedef uint32_t uintptr_t;
-
-#define PAGE_SHIFT 12
-#define PAGE_SIZE (1<<PAGE_SHIFT)
-#define PAGE_MASK 0xFFFFF000
-#endif /* 64bit / 32bit */
-
 
 #endif /* !ROS_INC_TYPES_H */
index 6009ecf..a862be0 100644 (file)
@@ -55,8 +55,6 @@
 /* Arch Constants */
 #define MAX_NUM_CPUS                           255
 
-#ifdef CONFIG_X86_64
-
 #define X86_REG_BP                                     "rbp"
 #define X86_REG_SP                                     "rsp"
 #define X86_REG_IP                                     "rip"
 #define X86_REG_CX                                     "rcx"
 #define X86_REG_DX                                     "rdx"
 
-#else /* 32 bit */
-
-#define X86_REG_BP                                     "ebp"
-#define X86_REG_SP                                     "esp"
-#define X86_REG_IP                                     "eip"
-#define X86_REG_AX                                     "eax"
-#define X86_REG_BX                                     "ebx"
-#define X86_REG_CX                                     "ecx"
-#define X86_REG_DX                                     "edx"
-
-#endif /* 64bit / 32bit */
 
 /* Various flags defined: can be included from assembler. */
 
index b7e0797..c31ad34 100644 (file)
@@ -18,7 +18,7 @@
 #include <syscall.h>
 #include <alarm.h>
 #include <trace.h>
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86
 #include <arch/vm.h>
 #endif
 
@@ -41,7 +41,7 @@ static char *cpu_state_names[NR_CPU_STATES] =
 };
 
 struct per_cpu_info {
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86
        uintptr_t stacktop;                     /* must be first */
        int coreid;                                     /* must be second */
        /* virtual machines */
index 8db3e45..eb06184 100644 (file)
@@ -80,7 +80,9 @@ static int load_one_elf(struct proc *p, struct file *f, uintptr_t pgoffset,
                goto fail;
        }
        #endif
-       #ifdef CONFIG_X86_64
+       /* Not sure what RISCV's 64 bit kernel can do here, so this check is x86
+        * only */
+       #ifdef CONFIG_X86
        if (elf32) {
                printk("[kernel] load_one_elf: 32 bit elf on 64 bit kernel\n");
                goto fail;
index 14af76b..648dd1d 100644 (file)
@@ -218,7 +218,7 @@ int mon_sm(int argc, char **argv, struct hw_trapframe *hw_tf)
 
 int mon_setmapperm(int argc, char **argv, struct hw_trapframe *hw_tf)
 {
-#ifndef CONFIG_X86_32
+#if 1 // was x86-32 only.
        cprintf("I don't support this call yet!\n");
        return 1;
 #else
@@ -1212,7 +1212,7 @@ int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf)
                return -1;
        }
 
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86
        hw_tf->tf_rip = (uintptr_t)smp_idle;
        dec_ktrap_depth(pcpui);
 
@@ -1240,7 +1240,7 @@ int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf)
 #else
        printk("KPF return not supported\n");
        return -1;
-#endif /* CONFIG_X86_64 */
+#endif /* CONFIG_X86 */
 }
 
 int mon_ks(int argc, char **argv, struct hw_trapframe *hw_tf)
index bcc4cc1..eed828d 100644 (file)
@@ -19,7 +19,7 @@ static uint8_t *aendian = (uint8_t *) & endian;
 #define        LITTLE  *aendian
 
 
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86
 
 /* $NetBSD: in_cksum.c,v 1.7 1997/09/02 13:18:15 thorpej Exp $ */
 
index 40d0983..61d327f 100644 (file)
@@ -5,19 +5,16 @@ MAKE_JOBS :=
 -include Makelocal
 
 ifndef RISCV_INSTDIR
-ifndef I686_INSTDIR
 ifndef X86_64_INSTDIR
 ifndef X86_64_NATIVE_INSTDIR
 busted: 
-       @echo "You need to setup either a RISCV_INSTDIR, an I686_INSTDIR, or an X86_64_INSTDIR to point to where you want the tools installed. The best way to do this is to create a 'Makelocal' file in the current directory and put it in there."; false
+       @echo "You need to setup either a RISCV_INSTDIR or an X86_64_INSTDIR to point to where you want the tools installed. The best way to do this is to create a 'Makelocal' file in the current directory and put it in there."; false
 riscv: busted
-i686: busted
 x86_64: busted
 x86_64-native: busted
 endif
 endif 
 endif 
-endif 
 
 # Check to make sure that we have gawk installed on our system and not some
 # other version of awk
@@ -51,14 +48,6 @@ RISCV_GLIBC_CONFIGURE_FLAGS :=
 RISCV_GCC_BUILD_FLAGS := 
 RISCV_CFLAGS :=
 
-# Configuration parameters for x86
-I686_ARCH := i686
-I686_BINARY_PREFIX := $(I686_ARCH)-ucb-akaros-
-I686_SYSROOT := $(I686_INSTDIR)/$(I686_ARCH)-ucb-akaros/sysroot
-I686_GLIBC_CONFIGURE_FLAGS := 
-I686_GCC_BUILD_FLAGS := 
-I686_CFLAGS := -march=i486
-
 # Configuration parameters for x86_64
 X86_64_ARCH := x86_64
 X86_64_BINARY_PREFIX := $(X86_64_ARCH)-ucb-akaros-
@@ -88,17 +77,6 @@ error:
 riscv: error
 endif
 endif
-ifneq (,$(filter i686,$(MAKECMDGOALS)))
-ifeq (,$(shell grep "CONFIG_X86_32=y" $(ROSDIR)/.config))
-error: 
-       @echo "Akaros tree not configured for i686"
-       @echo "Make sure you have configured ROSDIR for this architecture before proceeding"
-       @echo "e.g. cd \$$ROSDIR"
-       @echo "     make ARCH=x86 defconfig"
-       @false
-i686: error
-endif
-endif
 ifneq (,$(filter x86_64,$(MAKECMDGOALS)))
 ifeq (,$(shell grep "CONFIG_X86_64=y" $(ROSDIR)/.config))
 error: 
@@ -126,15 +104,12 @@ all:
        @echo "You need to run one of the following commands, "
        @echo "depending on which version of the cross compiler you are trying to generate:"
        @echo "  make riscv"
-       @echo "  make i686"
        @echo "  make x86_64"
        @echo "  make x86-64-native"
        @echo "  make riscv-revert"
-       @echo "  make i686-revert"
        @echo "  make x86_64-revert"
        @echo "  make x86_64-native-revert"
        @echo "  make riscv-uninstall"
-       @echo "  make i686-uninstall"
        @echo "  make x86_64-uninstall"
        @echo "  make x86_64-native-uninstall"
        @echo "  make clean"
@@ -153,20 +128,6 @@ riscv:
        export GCC_BUILD_FLAGS=$(RISCV_GCC_BUILD_FLAGS);\
        $(MAKE) make-all
 
-i686:
-       export LD_LIBRARY_PATH=; \
-       export DESTDIR=$(DESTDIR);\
-       export INSTDIR=$(I686_INSTDIR);\
-       export SYSROOT=$(I686_SYSROOT);\
-       export PATH=$(DESTDIR)$(I686_INSTDIR)/bin:$(PATH);\
-       export ARCH=$(I686_ARCH);\
-       export ARCH_CFLAGS=$(I686_CFLAGS);\
-       export ROS_ARCH_DIR=x86;\
-       export BINARY_PREFIX=$(I686_BINARY_PREFIX);\
-       export GLIBC_CONFIGURE_FLAGS=$(I686_GLIBC_CONFIGURE_FLAGS);\
-       export GCC_BUILD_FLAGS=$(I686_GCC_BUILD_FLAGS);\
-       $(MAKE) make-all
-
 x86_64:
        export LD_LIBRARY_PATH=; \
        export DESTDIR=$(DESTDIR);\
@@ -214,9 +175,6 @@ make-native-all:
 riscv-uninstall:
        -rm -rf $(RISCV_INSTDIR)
 
-i686-uninstall:
-       -rm -rf $(I686_INSTDIR)
-
 x86_64-uninstall:
        -rm -rf $(X86_64_INSTDIR)
 
@@ -227,10 +185,6 @@ riscv-revert:
        rm -rf $(RISCV_INSTDIR)
        cp -r $(RISCV_BINARY_PREFIX)install.bak $(RISCV_INSTDIR)
 
-i686-revert: 
-       rm -rf $(I686_INSTDIR)
-       cp -r $(I686_BINARY_PREFIX)install.bak $(I686_INSTDIR)
-
 x86_64-revert: 
        rm -rf $(X86_64_INSTDIR)
        cp -r $(X86_64_BINARY_PREFIX)install.bak $(X86_64_INSTDIR)
index 34e41fe..6d858bd 100644 (file)
@@ -2,7 +2,6 @@
 MAKE_JOBS := 
 
 RISCV_INSTDIR         := $(HOME)/install/riscv-ros-gcc/
-I686_INSTDIR          := $(HOME)/install/i686-ros-gcc/
 X86_64_INSTDIR        := $(HOME)/install/x86_64-ros-gcc/
 X86_64_NATIVE_INSTDIR := $(HOME)/install/x86_64-ros-gcc-native/
 
index ced2dce..5d5c07f 100755 (executable)
@@ -69,7 +69,6 @@ fi
 
 function add_cross_compiler_to_path() {
        export PATH=$WORKSPACE/install/riscv-ros-gcc/bin:$PATH
-       export PATH=$WORKSPACE/install/i686-ros-gcc/bin:$PATH
        export PATH=$WORKSPACE/install/x86_64-ros-gcc/bin:$PATH
 }
 
@@ -89,12 +88,6 @@ function build_config() {
        case "$COMPILATION_ARCH" in
        RISCV)  make ARCH=riscv defconfig
            ;;
-       I686)  make ARCH=x86 defconfig
-                  sed -i -e 's/CONFIG_64BIT=y/# CONFIG_64BIT is not set/' \
-                         -e 's/# CONFIG_X86_32 is not set/CONFIG_X86_32=y/' \
-                         -e 's/CONFIG_X86_64=y/# CONFIG_X86_64 is not set/' \
-                         .config
-           ;;
        X86_64)  make ARCH=x86 defconfig
            ;;
        esac
@@ -114,7 +107,6 @@ function build_config() {
 
 function build_cross_compiler() {
        declare -A ARCH_SUBDIRS=( ["RISCV"]="riscv-ros-gcc" \
-                                 ["I686"]="i686-ros-gcc" \
                                  ["X86_64"]="x86_64-ros-gcc" )
 
        echo -e "\n[BUILD_CROSS_COMPILER]: Begin"
@@ -130,7 +122,6 @@ function build_cross_compiler() {
        echo "# Number of make jobs to spawn.  
 MAKE_JOBS := 3
 RISCV_INSTDIR         := $WORKSPACE/install/${ARCH_SUBDIRS["RISCV"]}/
-I686_INSTDIR          := $WORKSPACE/install/${ARCH_SUBDIRS["I686"]}/
 X86_64_INSTDIR        := $WORKSPACE/install/${ARCH_SUBDIRS["X86_64"]}/
 " > Makelocal
 
@@ -142,8 +133,6 @@ X86_64_INSTDIR        := $WORKSPACE/install/${ARCH_SUBDIRS["X86_64"]}/
        case "$COMPILATION_ARCH" in
        RISCV)  make riscv
            ;;
-       I686)  make i686
-           ;;
        X86_64)  make x86_64
            ;;
        esac