1# Copyright 2018 The Fuchsia Authors
2#
3# Use of this source code is governed by a MIT-style
4# license that can be found in the LICENSE file or at
5# https://opensource.org/licenses/MIT
6
7LOCAL_DIR := $(GET_LOCAL_DIR)
8
9MULTIBOOT_BIN := $(BUILDDIR)/multiboot.bin
10MULTIBOOT_ELF := $(BUILDDIR)/multiboot.elf
11
12MULTIBOOT_LDFLAGS := -m elf_i386
13MULTIBOOT_LDSCRIPT := $(LOCAL_DIR)/multiboot.ld
14MULTIBOOT_COMPILEFLAGS := \
15    $(NO_SAFESTACK) $(NO_SANITIZERS) \
16    -m32 -mregparm=3 -fno-pic \
17    -Ikernel/arch/x86/page_tables/include \
18    -Ikernel/platform/pc/include \
19    -Isystem/ulib/zbi/include
20MULTIBOOT_SRCDEPS := $(KERNEL_CONFIG_HEADER)
21
22MULTIBOOT_SRCS := \
23    $(LOCAL_DIR)/multiboot-start.S \
24    $(LOCAL_DIR)/multiboot-main.c \
25    $(LOCAL_DIR)/paging.c \
26    $(LOCAL_DIR)/trampoline.c \
27    $(LOCAL_DIR)/util.c \
28    system/ulib/libzbi/zbi.c
29
30MULTIBOOT_OBJS := $(MULTIBOOT_SRCS:%=$(BUILDDIR)/$(LOCAL_DIR)/%.o)
31
32$(filter %.S.o,$(MULTIBOOT_OBJS)): \
33    $(BUILDDIR)/$(LOCAL_DIR)/%.S.o: %.S $(MULTIBOOT_SRCDEPS)
34	@$(MKDIR)
35	$(call BUILDECHO, assembling $<)
36	$(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \
37		       $(GLOBAL_OPTFLAGS) $(GLOBAL_ASMFLAGS) \
38		       $(KERNEL_ASMFLAGS) $(ARCH_ASMFLAGS) \
39		       $(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \
40		       $(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \
41		       -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
42
43$(filter %.c.o,$(MULTIBOOT_OBJS)): \
44    $(BUILDDIR)/$(LOCAL_DIR)/%.c.o: %.c $(MULTIBOOT_SRCDEPS)
45	@$(MKDIR)
46	$(call BUILDECHO, compiling $<)
47	$(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \
48		       $(GLOBAL_OPTFLAGS) $(GLOBAL_CFLAGS) \
49		       $(KERNEL_CFLAGS) $(ARCH_CFLAGS) \
50		       $(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \
51		       $(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \
52		       -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
53
54ALLSRCS += $(MULTIBOOT_SRCS)
55ALLOBJS += $(MULTIBOOT_OBJS)
56
57$(MULTIBOOT_ELF): $(MULTIBOOT_LDSCRIPT) $(MULTIBOOT_OBJS)
58	$(call BUILDECHO,linking $@)
59	$(NOECHO)$(LD) $(GLOBAL_LDFLAGS) $(KERNEL_LDFLAGS) \
60		       $(MULTIBOOT_LDFLAGS) -o $@ -T $^
61GENERATED += $(MULTIBOOT_ELF)
62EXTRA_IDFILES += $(MULTIBOOT_ELF).id
63
64# We could make a Multiboot image meant to be loaded without ELF headers
65# and do `objcopy -O binary` here.  But there's no reason to, and having an
66# ELF binary to look at is nicer.  To remove the ELF headers instead, the
67# linker script would need to remove `+ SIZEOF_HEADERS` and then the
68# multiboot header would be first thing in the raw binary.
69$(MULTIBOOT_BIN): $(MULTIBOOT_ELF).strip
70	$(call BUILDECHO, generating $@)
71	$(NOECHO)ln -f $< $@
72GENERATED += $(MULTIBOOT_BIN) $(MULTIBOOT_ELF).strip
73
74# Build the multiboot trampoline whenever building the kernel.
75kernel: $(MULTIBOOT_BIN)
76