ekern

ekern.git
git clone git://git.lenczewski.org/ekern.git
Log | Files | Refs | README | LICENSE

build.sh (2294B)


      1 #!/bin/sh
      2 
      3 TARGET="${1:-amd64}"
      4 
      5 AS="clang"
      6 CC="clang"
      7 LD="ld.lld"
      8 
      9 NM="llvm-nm"
     10 OBJCOPY="llvm-objcopy"
     11 
     12 WARNINGS="-Wall -Wextra -Wpedantic -Werror -Wno-fixed-enum-extension"
     13 CFLAGS="-std=c11 -ffreestanding -fPIC -fno-stack-protector -mno-red-zone"
     14 CPPFLAGS="-Iinclude"
     15 LDFLAGS=""
     16 
     17 case $TARGET in
     18 	amd64)
     19 		TRIPLE="x86_64-none-elf"
     20 		UEFIARCH="X64"
     21 		KERNARCH="AMD64"
     22 		;;
     23 	arm64)
     24 		TRIPLE="aarch64-none-elf"
     25 		UEFIARCH="AA64"
     26 		KERNARCH="ARM64"
     27 		;;
     28 	*)
     29 		echo "Unsupported target: $TARGET, must be one of: amd64 arm64"
     30 		exit 1
     31 		;;
     32 esac
     33 
     34 KASFLAGS="-target $TRIPLE"
     35 KCFLAGS="-target $TRIPLE $CFLAGS $WARNINGS"
     36 KCPPFLAGS="$CPPFLAGS -D__KERNEL__=1 -D__KERNEL_${KERNARCH}__=1"
     37 KLDFLAGS="$LDFLAGS -T src/kernel.lds"
     38 
     39 set -ex
     40 
     41 mkdir -p bin obj mnt
     42 
     43 # build kernel
     44 $CC $KCFLAGS $KCPPFLAGS -c src/efistub.c -o obj/efistub.o
     45 $CC $KCFLAGS $KCPPFLAGS -c src/kernel.c -o obj/kernel.o
     46 $LD $KLDFLAGS obj/efistub.o obj/kernel.o -o bin/kernel.elf
     47 
     48 ## generate kernel symbol offset header
     49 SEDSCRIPT="s/^\([0-9a-fA-F]*\) [a-zA-Z] \(__.*\)/#define \2 0x\1/p"
     50 $NM bin/kernel.elf | sed -ne "$SEDSCRIPT" > obj/voffset.h
     51 
     52 ## generate efistub
     53 $AS $KASFLAGS $KCPPFLAGS -Iobj -c src/header.S -o obj/header.o
     54 
     55 ## create binary image
     56 $OBJCOPY -O binary -R .head -S bin/kernel.elf bin/kernel.bin
     57 $OBJCOPY -O binary -S obj/header.o bin/header.bin
     58 cat bin/header.bin bin/kernel.bin > bin/kernel.efi
     59 
     60 # build disk image (64 MiB ESP, 32 MiB data)
     61 # ---
     62 #  see: https://wiki.osdev.org/Bootable_Disk
     63 
     64 dd if=/dev/zero of=mnt/disk.img bs=1M count=96 status=none
     65 
     66 cat <<EOF | sfdisk mnt/disk.img
     67 unit: sectors
     68 label: gpt
     69 
     70 type=U, start=2048,		size=131072, bootable
     71 type=L, start=$((2048+131072))
     72 EOF
     73 
     74 ## write ESP
     75 dd if=/dev/zero of=mnt/esp.img bs=512 count=131072 status=none
     76 
     77 mformat -i mnt/esp.img -F ::
     78 mmd -i mnt/esp.img ::/EFI ::/EFI/BOOT
     79 mcopy -i mnt/esp.img bin/kernel.efi ::/EFI/BOOT/BOOT$UEFIARCH.EFI
     80 
     81 dd if=mnt/esp.img of=mnt/disk.img bs=512 count=131072 seek=2048 conv=notrunc status=none
     82 
     83 ## write data partition
     84 dd if=/dev/zero of=mnt/dat.img bs=512 count=$((65535-2048-33)) status=none
     85 
     86 mformat -i mnt/dat.img ::
     87 
     88 ## TODO: copy over any relevant data
     89 
     90 dd if=mnt/dat.img of=mnt/disk.img bs=512 seek=$((2048+141072)) conv=notrunc status=none
     91 
     92 # run image under QEMU
     93 scripts/qemu-$TARGET.sh $(realpath mnt/disk.img)