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
7BOOT_SHIM_DIR := $(GET_LOCAL_DIR)
8
9ifeq ($(PLATFORM_BOARD_NAME),)
10$(error PLATFORM_BOARD_NAME not defined)
11endif
12
13BOOT_SHIM_BUILDDIR := $(BUILDDIR)/boot-shim/$(PLATFORM_BOARD_NAME)
14
15BOOT_SHIM_SRCS := \
16    $(BOOT_SHIM_DIR)/boot-shim.S \
17    $(BOOT_SHIM_DIR)/boot-shim.c \
18    $(BOOT_SHIM_DIR)/debug.c \
19    $(BOOT_SHIM_DIR)/devicetree.c \
20    $(BOOT_SHIM_DIR)/util.c \
21    $(BOOT_SHIM_DIR)/$(PLATFORM_BOARD_NAME)-uart.c \
22    kernel/lib/libc/string/memcpy.c \
23    kernel/lib/libc/string/memmove.c \
24    kernel/lib/libc/string/memset.c \
25    kernel/lib/libc/string/strcmp.c \
26    kernel/lib/libc/string/strncmp.c \
27    system/ulib/libzbi/zbi.c \
28
29BOOT_SHIM_OBJS := $(BOOT_SHIM_SRCS:%=$(BOOT_SHIM_BUILDDIR)/%.o)
30
31ALLSRCS += $(BOOT_SHIM_SRCS)
32ALLOBJS += $(BOOT_SHIM_OBJS)
33
34BOOT_SHIM_LD := $(BOOT_SHIM_DIR)/boot-shim.ld
35BOOT_SHIM_ELF := $(BOOT_SHIM_BUILDDIR)/boot-shim.elf
36BOOT_SHIM_BIN := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-boot-shim.bin
37
38KERNEL_ALIGN := 65536
39SHIM_DEFINES := -DKERNEL_ALIGN=$(KERNEL_ALIGN)
40SHIM_INCLUDES := -Ikernel/include -Ikernel/lib/libc/include -Isystem/public
41SHIM_INCLUDES += -Ikernel/arch/arm64/include
42SHIM_INCLUDES += -Isystem/ulib/ddk/include  # for ddk/protocol/platform-defs.h
43SHIM_INCLUDES += -Isystem/ulib/libzbi/include
44SHIM_CFLAGS := $(NO_SAFESTACK) $(NO_SANITIZERS)
45
46# The shim code runs with alignment checking enabled, so make sure the
47# compiler doesn't use any unaligned memory accesses.
48SHIM_CFLAGS += -mstrict-align
49
50# for including target specific headers
51SHIM_INCLUDES += -Ikernel/target/arm64/board/$(PLATFORM_BOARD_NAME)
52
53# capture board specific variables for the build rules
54$(BOOT_SHIM_BIN): BOOT_SHIM_BUILDDIR:=$(BOOT_SHIM_BUILDDIR)
55$(BOOT_SHIM_BIN): BOOT_SHIM_OBJS:=$(BOOT_SHIM_OBJS)
56$(BOOT_SHIM_BIN): BOOT_SHIM_ELF:=$(BOOT_SHIM_ELF)
57$(BOOT_SHIM_BIN): BOOT_SHIM_BIN:=$(BOOT_SHIM_BIN)
58$(BOOT_SHIM_BIN): SHIM_INCLUDES:=$(SHIM_INCLUDES)
59
60$(BOOT_SHIM_BUILDDIR)/%.S.o: %.S
61	@$(MKDIR)
62	$(call BUILDECHO, compiling $<)
63	$(NOECHO)$(CC) $(SHIM_INCLUDES) $(SHIM_DEFINES) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) $(GLOBAL_OPTFLAGS) $(GLOBAL_ASMFLAGS) $(KERNEL_ASMFLAGS) $(ARCH_ASMFLAGS) -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
64
65$(BOOT_SHIM_BUILDDIR)/%.c.o: %.c
66	@$(MKDIR)
67	$(call BUILDECHO, compiling $<)
68	$(NOECHO)$(CC) $(SHIM_INCLUDES) $(SHIM_DEFINES) $(GLOBAL_COMPILEFLAGS) $(KERNEL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) $(GLOBAL_OPTFLAGS) $(GLOBAL_CFLAGS) $(KERNEL_CFLAGS) $(ARCH_CFLAGS) $(SHIM_CFLAGS) -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
69
70$(BOOT_SHIM_ELF): $(BOOT_SHIM_OBJS) $(BOOT_SHIM_LD)
71	$(call BUILDECHO,linking $@)
72	$(NOECHO)$(LD) $(GLOBAL_LDFLAGS) $(KERNEL_LDFLAGS) --build-id=none $(BOOT_SHIM_OBJS) -defsym KERNEL_ALIGN=$(KERNEL_ALIGN) -T $(BOOT_SHIM_LD) -o $@
73
74# The shim code should be purely position-independent code.
75$(BOOT_SHIM_ELF).pure-stamp: $(BOOT_SHIM_ELF) scripts/gen-kaslr-fixups.sh
76	$(call BUILDECHO,checking $<)
77	$(NOECHO)scripts/gen-kaslr-fixups.sh --pure \
78					     $< '$(READELF)' '$(OBJDUMP)' $@
79
80$(BOOT_SHIM_BIN): $(BOOT_SHIM_ELF) $(BOOT_SHIM_ELF).pure-stamp
81	$(call BUILDECHO,generating $@)
82	$(NOECHO)$(OBJCOPY) -O binary $< $@
83GENERATED += $(BOOT_SHIM_BIN)
84EXTRA_BUILDDEPS += $(BOOT_SHIM_BIN)
85