1LOCAL_DIR := $(GET_LOCAL_DIR)
2
3MODULE := $(LOCAL_DIR)
4
5WITH_KERNEL_VM=1
6
7ifeq ($(SUBARCH),x86-32)
8MEMBASE ?= 0x00000000
9KERNEL_BASE ?= 0x80000000
10KERNEL_LOAD_OFFSET ?= 0x00200000
11KERNEL_ASPACE_BASE ?= 0x80000000
12KERNEL_ASPACE_SIZE ?= 0x7ff00000
13USER_ASPACE_BASE   ?= 0x00001000
14USER_ASPACE_SIZE   ?= 0x7fffe000
15
16SUBARCH_DIR := $(LOCAL_DIR)/32
17endif
18ifeq ($(SUBARCH),x86-64)
19GLOBAL_DEFINES += \
20	IS_64BIT=1 \
21
22MEMBASE ?= 0
23KERNEL_BASE ?= 0xffffffff80000000
24KERNEL_LOAD_OFFSET ?= 0
25KERNEL_ASPACE_BASE ?= 0xffffff8000000000UL # -512GB
26KERNEL_ASPACE_SIZE ?= 0x0000008000000000UL
27USER_ASPACE_BASE   ?= 0x0000000000001000UL
28USER_ASPACE_SIZE   ?= 0x00007fffffffe000UL
29SUBARCH_DIR := $(LOCAL_DIR)/64
30endif
31
32SUBARCH_BUILDDIR := $(call TOBUILDDIR,$(SUBARCH_DIR))
33
34GLOBAL_DEFINES += \
35	ARCH_$(SUBARCH)=1 \
36	MEMBASE=$(MEMBASE) \
37	KERNEL_BASE=$(KERNEL_BASE) \
38	KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET) \
39	KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \
40	KERNEL_ASPACE_SIZE=$(KERNEL_ASPACE_SIZE) \
41	USER_ASPACE_BASE=$(USER_ASPACE_BASE) \
42	USER_ASPACE_SIZE=$(USER_ASPACE_SIZE) \
43	SMP_MAX_CPUS=1 \
44	X86_WITH_FPU=1
45
46MODULE_SRCS += \
47	$(SUBARCH_DIR)/start.S \
48	$(SUBARCH_DIR)/asm.S \
49	$(SUBARCH_DIR)/exceptions.S \
50	$(SUBARCH_DIR)/mmu.c \
51	$(SUBARCH_DIR)/ops.S \
52	$(SUBARCH_DIR)/safecopy.S \
53	$(SUBARCH_DIR)/usercopy.c \
54\
55	$(LOCAL_DIR)/arch.c \
56	$(LOCAL_DIR)/cache.c \
57	$(LOCAL_DIR)/gdt.S \
58	$(LOCAL_DIR)/thread.c \
59	$(LOCAL_DIR)/faults.c \
60	$(LOCAL_DIR)/descriptor.c \
61	$(LOCAL_DIR)/fpu.c
62
63include $(LOCAL_DIR)/toolchain.mk
64
65# set the default toolchain to x86 elf and set a #define
66ifeq ($(SUBARCH),x86-32)
67ifndef TOOLCHAIN_PREFIX
68TOOLCHAIN_PREFIX := $(ARCH_x86_TOOLCHAIN_PREFIX)
69endif
70endif # SUBARCH x86-32
71ifeq ($(SUBARCH),x86-64)
72ifndef TOOLCHAIN_PREFIX
73TOOLCHAIN_PREFIX := $(ARCH_x86_64_TOOLCHAIN_PREFIX)
74endif
75endif # SUBARCH x86-64
76
77$(warning ARCH_x86_TOOLCHAIN_PREFIX = $(ARCH_x86_TOOLCHAIN_PREFIX))
78$(warning ARCH_x86_64_TOOLCHAIN_PREFIX = $(ARCH_x86_64_TOOLCHAIN_PREFIX))
79$(warning TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREFIX))
80
81ARCH_COMPILEFLAGS += $(ARCH_$(ARCH)_COMPILEFLAGS)
82
83cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc /dev/null 2>&1`"; \
84	then echo "$(2)"; else echo "$(3)"; fi ;)
85
86# disable SSP if the compiler supports it; it will break stuff
87GLOBAL_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
88
89GLOBAL_COMPILEFLAGS += -fasynchronous-unwind-tables
90GLOBAL_COMPILEFLAGS += -fno-pic
91GLOBAL_LDFLAGS += -z max-page-size=4096
92
93# do no use FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instruction in kernel
94# this flag influences kernel part only
95ARCH_COMPILEFLAGS += -msoft-float
96
97ifeq ($(SUBARCH),x86-64)
98GLOBAL_COMPILEFLAGS += -fno-stack-protector
99GLOBAL_COMPILEFLAGS += -mcmodel=kernel
100GLOBAL_COMPILEFLAGS += -mno-red-zone
101endif # SUBARCH x86-64
102
103
104ARCH_OPTFLAGS := -O2
105
106LINKER_SCRIPT += $(SUBARCH_BUILDDIR)/kernel.ld
107
108# potentially generated files that should be cleaned out with clean make rule
109GENERATED += $(SUBARCH_BUILDDIR)/kernel.ld
110
111# rules for generating the linker scripts
112$(SUBARCH_BUILDDIR)/kernel.ld: $(SUBARCH_DIR)/kernel.ld $(wildcard arch/*.ld) linkerscript.phony
113	@echo generating $@
114	@$(MKDIR)
115	$(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp
116	@$(call TESTANDREPLACEFILE,$@.tmp,$@)
117
118linkerscript.phony:
119.PHONY: linkerscript.phony
120
121include make/module.mk
122