From 398b7899e8b510e7ebdc817f20bd366ebc288eb1 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Sat, 20 Jun 2020 21:15:00 -0500 Subject: [PATCH] arm: Generate proper mmc image * Stub out makebootable like on u-boot * Place haiku_loader.efi at EFI/BOOT/BOOTXXX.EFI * Generate boot.scr for u-boot + EFI * haiku-mmc.image now attempts to auto-boot in qemu-system-arm * Same code paths should roughly apply for arm64,riscv,etc Change-Id: I563ebd77422d9e5dfcfeeedadcbc60471e8a57f4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2938 Reviewed-by: Alex von Gluck IV Reviewed-by: Adrien Destugues --- build/jam/images/MMCImage | 176 +++++++++++++----- src/bin/makebootable/platform/efi/Jamfile | 3 + .../platform/efi/makebootable.cpp | 6 + src/system/boot/Jamfile | 6 + src/tools/makebootable/platform/efi/Jamfile | 13 ++ 5 files changed, 154 insertions(+), 50 deletions(-) create mode 100644 src/bin/makebootable/platform/efi/Jamfile create mode 100644 src/bin/makebootable/platform/efi/makebootable.cpp create mode 100644 src/tools/makebootable/platform/efi/Jamfile diff --git a/build/jam/images/MMCImage b/build/jam/images/MMCImage index df85b6c4e0..907e19f50a 100644 --- a/build/jam/images/MMCImage +++ b/build/jam/images/MMCImage @@ -7,65 +7,141 @@ HAIKU_MMC_LABEL ?= $(HAIKU_DEFAULT_MMC_LABEL) ; # SD/mmc image rule # requires mtools package on linux # Files must be in this order: loader floppyboot everything_else -rule BuildUBootSDImage image : files +rule BuildSDImage image : files { - Depends $(image) : $(files) $(TARGET_DEVICE_TREES) ; - SDIMAGE_BLOCK_SIZE on $(image) = 1048576 ; # 1MiB - SDIMAGE_MTOOLS_H on $(image) = 255 ; - SDIMAGE_MTOOLS_S on $(image) = 63 ; - SDIMAGE_MTOOLS_C on $(image) = 8 ; - SDIMAGE_SIZE on $(image) = $(HAIKU_BOOT_SDIMAGE_SIZE) ; - SDIMAGE_BEGIN on $(image) = $(HAIKU_BOOT_SDIMAGE_BEGIN:E=63) ; - BuildUBootSDImage1 $(image) : $(files) ; + Depends $(image) : $(files) $(TARGET_DEVICE_TREES) ; + SDIMAGE_BLOCK_SIZE on $(image) = 1048576 ; # 1MiB + SDIMAGE_MTOOLS_H on $(image) = 255 ; + SDIMAGE_MTOOLS_S on $(image) = 63 ; + SDIMAGE_MTOOLS_C on $(image) = 8 ; + SDIMAGE_SIZE on $(image) = $(HAIKU_BOOT_SDIMAGE_SIZE) ; + SDIMAGE_BEGIN on $(image) = $(HAIKU_BOOT_SDIMAGE_BEGIN:E=63) ; + + if $(TARGET_BOOT_PLATFORM) = efi { + switch $(TARGET_ARCH) { + case x86_64 : + EFINAME on $(image) = "BOOTX64.EFI" ; + case arm : + EFINAME on $(image) = "BOOTARM.EFI" ; + case arm64 : + EFINAME on $(image) = "BOOTAA64.EFI" ; + case riscv32 : + EFINAME on $(image) = "BOOTRISCV32.EFI" ; + case riscv64 : + EFINAME on $(image) = "BOOTRISCV64.EFI" ; + case * : + Exit "Error: Unknown EFI architecture!" ; + } + BuildEfiSDImage1 $(image) : $(files) ; + } else { + BuildUBootSDImage1 $(image) : $(files) ; + } } actions BuildUBootSDImage1 { - $(RM) $(1) - $(RM) $(1).mtools + $(RM) $(1) + $(RM) $(1).mtools - # make an empty image - dd of=$(1) \ - if=/dev/zero \ - bs=$(SDIMAGE_BLOCK_SIZE) \ - count=$(SDIMAGE_SIZE) - # generate mtools config - echo 'drive i: file="$(1)" partition=1 cylinders=$(SDIMAGE_MTOOLS_C) - heads=$(SDIMAGE_MTOOLS_H) sectors=$(SDIMAGE_MTOOLS_S) - mformat_only' > $(1).mtools - # partition it - MTOOLSRC=$(1).mtools mpartition -b$(SDIMAGE_BEGIN) -cI -T 0xc i: - # format the image - MTOOLSRC=$(1).mtools mformat -L 32 -v "HAIKU" i: + # make an empty image + dd of=$(1) \ + if=/dev/zero \ + bs=$(SDIMAGE_BLOCK_SIZE) \ + count=$(SDIMAGE_SIZE) + # generate mtools config + echo 'drive i: file="$(1)" partition=1 cylinders=$(SDIMAGE_MTOOLS_C) + heads=$(SDIMAGE_MTOOLS_H) sectors=$(SDIMAGE_MTOOLS_S) + mformat_only' > $(1).mtools + # partition it + MTOOLSRC=$(1).mtools mpartition -b$(SDIMAGE_BEGIN) -cI -T 0xc i: + # format the image + MTOOLSRC=$(1).mtools mformat -L 32 -v "HAIKU" i: - # generate u-boot environment variables - echo 'os=haiku' > uEnv.txt - # populate - $(CP) $(2[2-2]) haiku_loader.ub - MTOOLSRC=$(1).mtools mcopy haiku_loader.ub i: - $(RM) haiku_loader.ub - $(CP) $(2[3-3]) haiku_floppyboot.ub - MTOOLSRC=$(1).mtools mcopy haiku_floppyboot.ub i: - $(RM) haiku_floppyboot.ub - MTOOLSRC=$(1).mtools mcopy $(2[4-]) i: - MTOOLSRC=$(1).mtools mcopy uEnv.txt i: - # populate fdts - MTOOLSRC=$(1).mtools mmd i:\fdt - MTOOLSRC=$(1).mtools mcopy $(TARGET_DEVICE_TREES[1-]) i:\fdt\ - # list content - MTOOLSRC=$(1).mtools mdir i: - MTOOLSRC=$(1).mtools mdir i:\fdt - # cleanup - $(RM) $(1).mtools - $(RM) uEnv.txt - $(RM) boot.scr - # Add haiku bootstrap partition to MMC image - cat $(2[0]) >> $(1) + # generate u-boot environment variables + echo 'os=haiku' > uEnv.txt + echo 'platform=u-boot' >> uEnv.txt + echo 'loader=haiku_loader.ub' >> uEnv.txt + + # populate + MTOOLSRC=$(1).mtools mcopy $(2[2-2]) i:/haiku_loader.ub + MTOOLSRC=$(1).mtools mcopy $(2[3-3]) i:/haiku_floppyboot.ub + MTOOLSRC=$(1).mtools mcopy $(2[4-]) i: + MTOOLSRC=$(1).mtools mcopy uEnv.txt i: + # populate fdts + MTOOLSRC=$(1).mtools mmd i:/fdt + MTOOLSRC=$(1).mtools mcopy $(TARGET_DEVICE_TREES[1-]) i:/fdt/ + # list content + MTOOLSRC=$(1).mtools mdir i: + MTOOLSRC=$(1).mtools mdir i:/fdt + # cleanup + $(RM) $(1).mtools + $(RM) uEnv.txt + $(RM) boot.scr + # Add haiku bootstrap partition to MMC image + cat $(2[0]) >> $(1) +} + + +actions BuildEfiSDImage1 +{ + $(RM) $(1) + $(RM) $(1).mtools + + # make an empty image + dd of=$(1) \ + if=/dev/zero \ + bs=$(SDIMAGE_BLOCK_SIZE) \ + count=$(SDIMAGE_SIZE) + # generate mtools config + echo 'drive i: file="$(1)" partition=1 cylinders=$(SDIMAGE_MTOOLS_C) + heads=$(SDIMAGE_MTOOLS_H) sectors=$(SDIMAGE_MTOOLS_S) + mformat_only' > $(1).mtools + # partition it + MTOOLSRC=$(1).mtools mpartition -b$(SDIMAGE_BEGIN) -cI -T 0xc i: + # format the image + MTOOLSRC=$(1).mtools mformat -L 32 -v "HAIKU" i: + + # generate u-boot environment variables + echo 'os=haiku' > uEnv.txt + echo 'platform=efi' >> uEnv.txt + echo "loader=EFI/BOOT/$(EFINAME)" >> uEnv.txt + + # populate + MTOOLSRC=$(1).mtools mmd i:/EFI + MTOOLSRC=$(1).mtools mmd i:/EFI/BOOT + MTOOLSRC=$(1).mtools mcopy $(2[2-2]) i:/EFI/BOOT/$(EFINAME) + # Not really needed on EFI since we use EFI runtime services. + #MTOOLSRC=$(1).mtools mcopy $(2[3-3]) i:/haiku_floppyboot.ub + MTOOLSRC=$(1).mtools mcopy $(2[4-]) i: + MTOOLSRC=$(1).mtools mcopy uEnv.txt i: + # populate fdts + MTOOLSRC=$(1).mtools mmd i:/fdt + MTOOLSRC=$(1).mtools mcopy $(TARGET_DEVICE_TREES[1-]) i:/fdt/ + # list content + MTOOLSRC=$(1).mtools mdir i: + MTOOLSRC=$(1).mtools mdir i:/fdt + MTOOLSRC=$(1).mtools mdir i:/EFI/BOOT + # cleanup + $(RM) $(1).mtools + $(RM) uEnv.txt + $(RM) boot.scr + # Add haiku bootstrap partition to MMC image + cat $(2[0]) >> $(1) +} + +for platform in [ MultiBootSubDirSetup ] { + on $(platform) { + # SD/mmc image targets + if $(TARGET_BOOT_PLATFORM) = efi { + BuildSDImage $(HAIKU_MMC_NAME) : + $(HAIKU_IMAGE) haiku_loader.$(TARGET_BOOT_PLATFORM) haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) boot.scr ; + } else { + BuildSDImage $(HAIKU_MMC_NAME) : + $(HAIKU_IMAGE) haiku_loader.$(TARGET_BOOT_PLATFORM) haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) boot.scr ; + } + } } -# SD/mmc image targets -BuildUBootSDImage $(HAIKU_MMC_NAME) : - $(HAIKU_IMAGE) haiku_loader.u-boot haiku-floppyboot.tgz.u-boot boot.scr ; #BlessSDImage haiku-$(TARGET_KERNEL_ARCH).mmc ; NotFile haiku-mmc-image ; Depends haiku-mmc-image : $(HAIKU_MMC_NAME) ; diff --git a/src/bin/makebootable/platform/efi/Jamfile b/src/bin/makebootable/platform/efi/Jamfile new file mode 100644 index 0000000000..d5d62e6ed4 --- /dev/null +++ b/src/bin/makebootable/platform/efi/Jamfile @@ -0,0 +1,3 @@ +SubDir HAIKU_TOP src bin makebootable platform efi ; + +BinCommand makebootable : makebootable.cpp ; diff --git a/src/bin/makebootable/platform/efi/makebootable.cpp b/src/bin/makebootable/platform/efi/makebootable.cpp new file mode 100644 index 0000000000..8d3ab2762f --- /dev/null +++ b/src/bin/makebootable/platform/efi/makebootable.cpp @@ -0,0 +1,6 @@ +int +main() +{ + return 0; +} + diff --git a/src/system/boot/Jamfile b/src/system/boot/Jamfile index e23eac3572..e26fb3fd39 100644 --- a/src/system/boot/Jamfile +++ b/src/system/boot/Jamfile @@ -317,6 +317,12 @@ for platform in [ MultiBootSubDirSetup ] { switch $(TARGET_BOOT_PLATFORM) { case efi : BuildEFILoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ; + if $(TARGET_ARCH) = arm || $(TARGET_ARCH) = arm64 { + BuildUImage haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) : haiku-floppyboot.tgz : + -A $(TARGET_ARCH) -O linux -T ramdisk -C none + -n 'Haiku $(TARGET_KERNEL_ARCH) floppyboot' ; + BuildUImageScript boot.scr : $(HAIKU_MMC_UBOOT_SCRIPT) ; + } case bios_ia32 : BuildBiosLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ; diff --git a/src/tools/makebootable/platform/efi/Jamfile b/src/tools/makebootable/platform/efi/Jamfile new file mode 100644 index 0000000000..1aa97cc9db --- /dev/null +++ b/src/tools/makebootable/platform/efi/Jamfile @@ -0,0 +1,13 @@ +SubDir HAIKU_TOP src tools makebootable platform efi ; + +SEARCH_SOURCE + += [ FDirName $(HAIKU_TOP) src bin makebootable platform efi ] ; + +BuildPlatformMain makebootable : + makebootable.cpp + $(hostPlatformSources) + : + # $(HOST_LIBBE) + $(HOST_LIBSTDC++) $(HOST_LIBSUPC++) +; +