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