haiku/build/jam/images/MMCImage
Alexander von Gluck IV 398b7899e8 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 <kallisti5@unixzen.com>
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
2020-06-22 18:48:20 +00:00

148 lines
4.2 KiB
Plaintext

# Set anyboot file name and directory defaults.
HAIKU_MMC_NAME ?= $(HAIKU_DEFAULT_MMC_NAME) ;
HAIKU_MMC_DIR ?= $(HAIKU_DEFAULT_MMC_DIR) ;
HAIKU_MMC = $(HAIKU_MMC_NAME) ;
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 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) ;
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
# 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=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 ;
}
}
}
#BlessSDImage haiku-$(TARGET_KERNEL_ARCH).mmc ;
NotFile haiku-mmc-image ;
Depends haiku-mmc-image : $(HAIKU_MMC_NAME) ;