1LOCAL_DIR := $(GET_LOCAL_DIR) 2 3MODULE := $(LOCAL_DIR) 4 5MODULE_OPTIONS := extra_warnings 6MODULE_DEPS := lib/fixed_point 7 8# x86 code always runs with the mmu enabled 9WITH_KERNEL_VM := 1 10ifneq ($(CPU),legacy) 11WITH_SMP ?= 1 12else 13WITH_SMP ?= 0 14endif 15 16ifeq ($(SUBARCH),x86-32) 17MEMBASE ?= 0x00000000 18KERNEL_BASE ?= 0x80000000 19KERNEL_LOAD_OFFSET ?= 0x00200000 20KERNEL_ASPACE_BASE ?= 0x80000000 21KERNEL_ASPACE_SIZE ?= 0x7ff00000 22USER_ASPACE_BASE ?= 0x1000 # 4KB 23USER_ASPACE_SIZE ?= 0x7fffe000 # 2GB - 2*4KB 24 25SUBARCH_DIR := $(LOCAL_DIR)/32 26endif 27ifeq ($(SUBARCH),x86-64) 28GLOBAL_DEFINES += \ 29 IS_64BIT=1 \ 30 31MEMBASE ?= 0 32KERNEL_BASE ?= 0xffffffff80000000 33KERNEL_LOAD_OFFSET ?= 0x00200000 34KERNEL_ASPACE_BASE ?= 0xffffff8000000000UL # -512GB 35KERNEL_ASPACE_SIZE ?= 0x0000008000000000UL 36USER_ASPACE_BASE ?= 0x0000000000001000UL # 4KB 37USER_ASPACE_SIZE ?= 0x00007fffffffe000UL # ((1<<47) - 2*4KB) 38SUBARCH_DIR := $(LOCAL_DIR)/64 39endif 40 41SUBARCH_BUILDDIR := $(call TOBUILDDIR,$(SUBARCH_DIR)) 42 43GLOBAL_DEFINES += \ 44 ARCH_$(SUBARCH)=1 \ 45 MEMBASE=$(MEMBASE) \ 46 KERNEL_BASE=$(KERNEL_BASE) \ 47 KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET) \ 48 KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \ 49 KERNEL_ASPACE_SIZE=$(KERNEL_ASPACE_SIZE) \ 50 USER_ASPACE_BASE=$(USER_ASPACE_BASE) \ 51 USER_ASPACE_SIZE=$(USER_ASPACE_SIZE) \ 52 ARCH_HAS_MMU=1 53 54ifeq ($(WITH_SMP),1) 55SMP_MAX_CPUS ?= 16 56GLOBAL_DEFINES += \ 57 WITH_SMP=1 \ 58 SMP_MAX_CPUS=$(SMP_MAX_CPUS) 59else 60GLOBAL_DEFINES += \ 61 SMP_MAX_CPUS=1 62endif 63 64MODULE_SRCS += \ 65 $(SUBARCH_DIR)/start.S \ 66\ 67 $(SUBARCH_DIR)/asm.S \ 68 $(SUBARCH_DIR)/exceptions.S \ 69 $(SUBARCH_DIR)/gdt.S \ 70 $(SUBARCH_DIR)/mmu.c \ 71 $(SUBARCH_DIR)/ops.S \ 72 $(SUBARCH_DIR)/spinlock.S \ 73\ 74 $(LOCAL_DIR)/arch.c \ 75 $(LOCAL_DIR)/cache.c \ 76 $(LOCAL_DIR)/descriptor.c \ 77 $(LOCAL_DIR)/faults.c \ 78 $(LOCAL_DIR)/feature.c \ 79 $(LOCAL_DIR)/lapic.c \ 80 $(LOCAL_DIR)/mp.c \ 81 $(LOCAL_DIR)/pv.c \ 82 $(LOCAL_DIR)/thread.c \ 83 84# legacy x86's dont have fpu support 85ifneq ($(CPU),legacy) 86GLOBAL_DEFINES += \ 87 X86_WITH_FPU=1 88 89MODULE_SRCS += \ 90 $(LOCAL_DIR)/fpu.c 91else 92GLOBAL_DEFINES += WITH_NO_FP=1 93endif 94 95include $(LOCAL_DIR)/toolchain.mk 96 97# set the default toolchain to x86 elf and set a #define 98ifeq ($(SUBARCH),x86-32) 99ifndef TOOLCHAIN_PREFIX 100TOOLCHAIN_PREFIX := $(ARCH_x86_TOOLCHAIN_PREFIX) 101endif 102endif # SUBARCH x86-32 103ifeq ($(SUBARCH),x86-64) 104ifndef TOOLCHAIN_PREFIX 105TOOLCHAIN_PREFIX := $(ARCH_x86_64_TOOLCHAIN_PREFIX) 106endif 107endif # SUBARCH x86-64 108 109$(info ARCH_x86_TOOLCHAIN_PREFIX = $(ARCH_x86_TOOLCHAIN_PREFIX)) 110$(info ARCH_x86_64_TOOLCHAIN_PREFIX = $(ARCH_x86_64_TOOLCHAIN_PREFIX)) 111$(info TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREFIX)) 112 113cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc /dev/null 2>&1`"; \ 114 then echo "$(2)"; else echo "$(3)"; fi ;) 115 116# disable SSP if the compiler supports it; it will break stuff 117GLOBAL_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) 118 119ARCH_COMPILEFLAGS += -fasynchronous-unwind-tables 120ARCH_COMPILEFLAGS += -gdwarf-2 121ARCH_COMPILEFLAGS += -fno-pic 122ARCH_LDFLAGS += -z max-page-size=4096 123 124ifeq ($(SUBARCH),x86-64) 125ARCH_COMPILEFLAGS += -fno-stack-protector 126ARCH_COMPILEFLAGS += -mcmodel=kernel 127ARCH_COMPILEFLAGS += -mno-red-zone 128endif # SUBARCH x86-64 129 130# set switches to generate/not generate fpu code 131ARCH_COMPILEFLAGS_FLOAT += 132ARCH_COMPILEFLAGS_NOFLOAT += -mgeneral-regs-only 133 134# select default optimizations for different target cpu levels 135ifeq ($(CPU),legacy) 136# compile for 386 when selecting 'legacy' cpu support 137ARCH_COMPILEFLAGS += -march=i386 138ARCH_OPTFLAGS := -Os 139GLOBAL_DEFINES += X86_LEGACY=1 140else ifeq ($(SUBARCH),x86-32) 141ARCH_COMPILEFLAGS += -march=i686 142ARCH_OPTFLAGS := -O2 143GLOBAL_DEFINES += X86_LEGACY=0 144else ifeq ($(SUBARCH),x86-64) 145ARCH_COMPILEFLAGS += -march=x86-64 146ARCH_OPTFLAGS := -O2 147GLOBAL_DEFINES += X86_LEGACY=0 148endif 149 150LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) -print-libgcc-file-name) 151LINKER_SCRIPT += $(SUBARCH_BUILDDIR)/kernel.ld 152 153# potentially generated files that should be cleaned out with clean make rule 154GENERATED += $(SUBARCH_BUILDDIR)/kernel.ld 155 156# rules for generating the linker scripts 157$(SUBARCH_BUILDDIR)/kernel.ld: $(SUBARCH_DIR)/kernel.ld $(wildcard arch/*.ld) 158 @echo generating $@ 159 @$(MKDIR) 160 $(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp 161 @$(call TESTANDREPLACEFILE,$@.tmp,$@) 162 163include make/module.mk 164