summaryrefslogtreecommitdiff
path: root/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/Kconfig32
-rw-r--r--arch/x86/Makefile54
-rw-r--r--arch/x86/configs/amd64_defconfig0
-rw-r--r--arch/x86/configs/i386_defconfig1
-rw-r--r--arch/x86/machine/boot.c6
-rw-r--r--arch/x86/machine/pmap.c46
-rw-r--r--arch/x86/machine/pmap.h6
-rw-r--r--arch/x86/machine/pmem.h6
-rw-r--r--arch/x86/machine/types.h6
9 files changed, 122 insertions, 35 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
new file mode 100644
index 00000000..421deaa4
--- /dev/null
+++ b/arch/x86/Kconfig
@@ -0,0 +1,32 @@
+menu "Architecture-specific options"
+
+config 64BITS
+ bool "64-bits kernel" if ARCH = "x86"
+ default ARCH != "i386"
+ ---help---
+ Build a 64-bits kernel.
+
+config X86_PAE
+ bool "Enable PAE (Physical Address Extension)"
+ depends on X86_32
+ ---help---
+ PAE allows addressing physical memory beyond 4 GiB at the cost
+ of more pagetable lookup and memory overhead.
+
+endmenu
+
+config X86_32
+ def_bool y
+ depends on !64BITS
+
+config X86_64
+ def_bool y
+ depends on 64BITS
+
+config X86
+ def_bool y
+
+config SUBARCH
+ string
+ default "i386" if X86_32
+ default "amd64" if X86_64
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
new file mode 100644
index 00000000..f0640f77
--- /dev/null
+++ b/arch/x86/Makefile
@@ -0,0 +1,54 @@
+ifeq ($(shell uname -m),x86_64)
+ KCONFIG_DEFCONFIG := amd64_defconfig
+else
+ KCONFIG_DEFCONFIG := i386_defconfig
+endif
+
+# Prevent GCC from generating any FP code by mistake.
+XBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
+XBUILD_CFLAGS += $(call cc-option,-mno-avx,)
+
+# Store unwind information in .debug_frame instead of .eh_frame. Unwind
+# tables aren't used at runtime, so using a debug section reduces the kernel
+# code size.
+XBUILD_CFLAGS += -fno-asynchronous-unwind-tables
+
+# For now, use frame pointers for convenient stack tracing.
+XBUILD_CFLAGS += -fno-omit-frame-pointer
+
+XBUILD_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
+
+ifeq ($(CONFIG_X86_32),y)
+ biarch := $(call cc-option,-m32)
+ XBUILD_CPPFLAGS += -m32
+else
+ biarch := -m64
+ XBUILD_CPPFLAGS += -m64
+
+ XBUILD_CFLAGS += -mno-red-zone
+ XBUILD_CFLAGS += -mcmodel=kernel
+endif
+
+x15_SOURCES-y += \
+ arch/x86/machine/acpi.c \
+ arch/x86/machine/atcons.c \
+ arch/x86/machine/atkbd.c \
+ arch/x86/machine/biosmem.c \
+ arch/x86/machine/boot_asm.S \
+ arch/x86/machine/boot.c \
+ arch/x86/machine/cga.c \
+ arch/x86/machine/cpu_asm.S \
+ arch/x86/machine/cpu.c \
+ arch/x86/machine/ioapic.c \
+ arch/x86/machine/lapic.c \
+ arch/x86/machine/pic.c \
+ arch/x86/machine/pit.c \
+ arch/x86/machine/pmap.c \
+ arch/x86/machine/ssp.c \
+ arch/x86/machine/strace.c \
+ arch/x86/machine/string.c \
+ arch/x86/machine/tcb_asm.S \
+ arch/x86/machine/tcb.c \
+ arch/x86/machine/trap_asm.S \
+ arch/x86/machine/trap.c \
+ arch/x86/machine/uart.c
diff --git a/arch/x86/configs/amd64_defconfig b/arch/x86/configs/amd64_defconfig
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/arch/x86/configs/amd64_defconfig
diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig
new file mode 100644
index 00000000..7d843afd
--- /dev/null
+++ b/arch/x86/configs/i386_defconfig
@@ -0,0 +1 @@
+# 64BITS is not set
diff --git a/arch/x86/machine/boot.c b/arch/x86/machine/boot.c
index 47055c87..afc41d70 100644
--- a/arch/x86/machine/boot.c
+++ b/arch/x86/machine/boot.c
@@ -353,10 +353,10 @@ boot_setup_paging(struct multiboot_raw_info *mbi, unsigned long eax)
void __init
boot_log_info(void)
{
- log_info(KERNEL_NAME "/" QUOTE(X15_X86_SUBARCH) " " KERNEL_VERSION
-#ifdef X15_X86_PAE
+ log_info(KERNEL_NAME "/" CONFIG_SUBARCH " " KERNEL_VERSION
+#ifdef CONFIG_X86_PAE
" PAE"
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
);
}
diff --git a/arch/x86/machine/pmap.c b/arch/x86/machine/pmap.c
index 07b8a707..0448d07d 100644
--- a/arch/x86/machine/pmap.c
+++ b/arch/x86/machine/pmap.c
@@ -82,7 +82,7 @@ struct pmap_cpu_table {
};
struct pmap {
- struct pmap_cpu_table *cpu_tables[X15_MAX_CPUS];
+ struct pmap_cpu_table *cpu_tables[CONFIG_MAX_CPUS];
};
/*
@@ -98,13 +98,13 @@ typedef void (*pmap_walk_fn_t)(phys_addr_t pa, unsigned int index,
* that using a percpu variable would actually become ugly. This array
* is rather small anyway.
*/
-static struct pmap_cpu_table pmap_kernel_cpu_tables[X15_MAX_CPUS] __read_mostly;
+static struct pmap_cpu_table pmap_kernel_cpu_tables[CONFIG_MAX_CPUS] __read_mostly;
struct pmap pmap_kernel_pmap;
struct pmap *pmap_current_ptr __percpu;
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
/*
* Alignment required on page directory pointer tables.
@@ -115,9 +115,9 @@ struct pmap *pmap_current_ptr __percpu;
* "Hidden" kernel root page tables for PAE mode.
*/
static alignas(PMAP_PDPT_ALIGN) pmap_pte_t
- pmap_cpu_kpdpts[X15_MAX_CPUS][PMAP_L2_PTES_PER_PT] __read_mostly;
+ pmap_cpu_kpdpts[CONFIG_MAX_CPUS][PMAP_L2_PTES_PER_PT] __read_mostly;
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
/*
* Flags related to page protection.
@@ -260,7 +260,7 @@ struct pmap_update_request {
* on remote processors.
*/
struct pmap_update_request_array {
- struct pmap_update_request requests[X15_MAX_CPUS];
+ struct pmap_update_request requests[CONFIG_MAX_CPUS];
struct mutex lock;
};
@@ -270,10 +270,10 @@ static int pmap_do_remote_updates __read_mostly;
static struct kmem_cache pmap_cache;
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
static char pmap_panic_no_pae[] __bootdata
= "pmap: PAE not supported";
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
static char pmap_panic_inval_msg[] __bootdata
= "pmap: invalid physical address";
static char pmap_panic_directmap_msg[] __bootdata
@@ -369,17 +369,17 @@ out:
eax = 1;
cpu_cpuid(&eax, &ebx, &ecx, &edx);
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
if (!(edx & CPU_FEATURE2_PAE)) {
boot_panic(pmap_panic_no_pae);
}
return (1 << PMAP_L1_SKIP);
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
if (edx & CPU_FEATURE2_PSE) {
return (1 << PMAP_L1_SKIP);
}
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
out:
return PAGE_SIZE;
@@ -401,11 +401,11 @@ pmap_boot_enable_pgext(unsigned long pgsize)
*
* See the boot module.
*/
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
cpu_enable_pae();
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
cpu_enable_pse();
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
}
#endif /* __LP64__ */
@@ -428,11 +428,11 @@ pmap_setup_paging(void)
* direct physical mapping of physical memory.
*/
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
root_ptp = (void *)BOOT_VTOP((uintptr_t)pmap_cpu_kpdpts[0]);
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
root_ptp = biosmem_bootalloc(1);
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
va = vm_page_trunc((uintptr_t)&_boot);
pa = va;
@@ -496,11 +496,11 @@ pmap_ap_setup_paging(void)
pmap = (void *)BOOT_VTOP((uintptr_t)&pmap_kernel_pmap);
cpu_table = (void *)BOOT_VTOP((uintptr_t)pmap->cpu_tables[boot_ap_id]);
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
return (void *)(uint32_t)cpu_table->root_ptp_pa;
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
return (void *)cpu_table->root_ptp_pa;
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
}
/*
@@ -1004,10 +1004,10 @@ pmap_copy_cpu_table(unsigned int cpu)
kernel_pmap = pmap_get_kernel_pmap();
sptp = pmap_ptp_from_pa(kernel_pmap->cpu_tables[cpu_id()]->root_ptp_pa);
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
cpu_table->root_ptp_pa = BOOT_VTOP((uintptr_t)pmap_cpu_kpdpts[cpu]);
dptp = pmap_ptp_from_pa(cpu_table->root_ptp_pa);
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
struct vm_page *page;
page = vm_page_alloc(0, VM_PAGE_SEL_DIRECTMAP, VM_PAGE_PMAP);
@@ -1018,7 +1018,7 @@ pmap_copy_cpu_table(unsigned int cpu)
cpu_table->root_ptp_pa = vm_page_to_pa(page);
dptp = vm_page_direct_ptr(page);
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
pmap_copy_cpu_table_recursive(sptp, level, dptp, PMAP_START_ADDRESS);
}
diff --git a/arch/x86/machine/pmap.h b/arch/x86/machine/pmap.h
index d8c2455b..369679fd 100644
--- a/arch/x86/machine/pmap.h
+++ b/arch/x86/machine/pmap.h
@@ -132,7 +132,7 @@
#define PMAP_L2_MASK PMAP_L1_MASK
#define PMAP_L3_MASK PMAP_L1_MASK
#else /* __LP64__ */
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
#define PMAP_NR_LEVELS 3
#define PMAP_L0_BITS 9
#define PMAP_L1_BITS 9
@@ -140,13 +140,13 @@
#define PMAP_VA_MASK DECL_CONST(0xffffffff, UL)
#define PMAP_PA_MASK DECL_CONST(0x000ffffffffff000, ULL)
#define PMAP_L2_MASK PMAP_PAE_L2_MASK
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
#define PMAP_NR_LEVELS 2
#define PMAP_L0_BITS 10
#define PMAP_L1_BITS 10
#define PMAP_VA_MASK DECL_CONST(0xffffffff, UL)
#define PMAP_PA_MASK DECL_CONST(0xfffff000, UL)
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
#endif /* __LP64__ */
#define PMAP_L0_SKIP 12
diff --git a/arch/x86/machine/pmem.h b/arch/x86/machine/pmem.h
index b6c6db0c..33006a7e 100644
--- a/arch/x86/machine/pmem.h
+++ b/arch/x86/machine/pmem.h
@@ -39,13 +39,13 @@
#define PMEM_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, UL)
#else /* __LP64__ */
#define PMEM_DIRECTMAP_LIMIT DECL_CONST(0x38000000, ULL)
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
#define PMEM_MAX_ZONES 3
#define PMEM_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, ULL)
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
#define PMEM_MAX_ZONES 3
#define PMEM_HIGHMEM_LIMIT DECL_CONST(0xfffff000, UL)
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
#endif /* __LP64__ */
/*
diff --git a/arch/x86/machine/types.h b/arch/x86/machine/types.h
index fa41e910..cd825154 100644
--- a/arch/x86/machine/types.h
+++ b/arch/x86/machine/types.h
@@ -18,10 +18,10 @@
#ifndef _X86_TYPES_H
#define _X86_TYPES_H
-#ifdef X15_X86_PAE
+#ifdef CONFIG_X86_PAE
typedef unsigned long long phys_addr_t;
-#else /* X15_X86_PAE */
+#else /* CONFIG_X86_PAE */
typedef unsigned long phys_addr_t;
-#endif /* X15_X86_PAE */
+#endif /* CONFIG_X86_PAE */
#endif /* _X86_TYPES_H */