mkdir -p build
touch build/.dir
nasm -f elf32 -g -F dwarf sample/entry.asm -o build/entry.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c sample/demo.c -o build/demo.o
i686-elf-ld -m elf_i386 -z noexecstack -T sample/linker.ld build/entry.o build/demo.o -o build/sample.elf
dd if=/dev/zero of=build/blank.img bs=512 count=2048 status=none
{ printf '%%define STAGE2_LBA %s\n' '1'; printf '%%define STAGE2_SECTORS %s\n' '8'; printf '%%define HEADER_LBA %s\n' '9'; printf '%%define PAYLOAD_LBA %s\n' '10'; printf '%%define PAYLOAD_MAX_BYTES %s\n' '65536'; printf '%%define KERNEL_MEMORY_MAX_BYTES %s\n' '131072'; printf '%%define PAYLOAD_SEGMENT %s\n' '0x1000'; printf '%%define READ_CHUNK_SECTORS %s\n' '32'; printf '%%define HEADER_MAGIC %s\n' '0x334f5342'; printf '%%define HEADER_VERSION %s\n' '1'; } > build/layout.inc
nasm -D DAY02_ONLY -f bin boot/mbr.asm -o build/day02-mbr.bin
test "$(wc -c < build/day02-mbr.bin)" -eq 512
cp build/day02-mbr.bin build/day02-mbr.img
truncate -s $(( 4096 * 512 )) build/day02-mbr.img
nasm -f bin boot/mbr.asm -o build/mbr.bin
test "$(wc -c < build/mbr.bin)" -eq 512
nasm -f bin boot/stage2.asm -o build/stage2.bin
test "$(wc -c < build/stage2.bin)" -eq 4096
nasm -f elf32 -g -F dwarf kernel/entry.asm -o build/kernel-entry.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/main.c -o build/kernel-main.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/runtime.c -o build/kernel-runtime.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/console.c -o build/kernel-console.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/exceptions.c -o build/kernel-exceptions.o
nasm -f elf32 -g -F dwarf kernel/exceptions.asm -o build/kernel-isr.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/timer.c -o build/kernel-timer.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/keyboard.c -o build/kernel-keyboard.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/memory.c -o build/kernel-memory.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/paging.c -o build/kernel-paging.o
nasm -f elf32 -g -F dwarf kernel/paging-probes.asm -o build/kernel-paging-probes.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -c kernel/heap.c -o build/kernel-heap.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -fno-inline -c kernel/task.c -o build/kernel-task.o
nasm -f elf32 -g -F dwarf kernel/switch.asm -o build/kernel-switch.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -c kernel/user.c -o build/kernel-user.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -c kernel/syscall.c -o build/kernel-syscall.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -c kernel/elf.c -o build/kernel-elf.o
nasm -f elf32 -g -F dwarf kernel/user-entry.asm -o build/kernel-user-entry.o
nasm -f elf32 -g -F dwarf user/day18-entry.asm -o build/day18-user-entry.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -c user/day18.c -o build/day18-user.o
i686-elf-ld -m elf_i386 -z noexecstack -T user/day18.ld build/day18-user-entry.o build/day18-user.o -o build/day18-user-debug.elf
test -z "$(i686-elf-nm -u build/day18-user-debug.elf)"
test "$(i686-elf-nm -n build/day18-user-debug.elf | awk '$3 == "day18_result" { print "0x" $1 }')" = 0x40001000
i686-elf-objcopy --strip-all build/day18-user-debug.elf build/day18-user.elf
nasm -f elf32 -g -F dwarf kernel/day18-elf-blob.asm -o build/kernel-day18-elf-blob.o
nasm -f elf32 -g -F dwarf user/day19-entry.asm -o build/day19-user-entry.o
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -Os -c user/day19.c -o build/day19-user.o
i686-elf-ld -m elf_i386 -z noexecstack -T user/day19.ld build/day19-user-entry.o build/day19-user.o -o build/day19-user-debug.elf
test -z "$(i686-elf-nm -u build/day19-user-debug.elf)"
test "$(i686-elf-nm -n build/day19-user-debug.elf | awk '$3 == "day19_mode" { print "0x" $1 }')" = 0x40001000
test "$(i686-elf-nm -n build/day19-user-debug.elf | awk '$3 == "day19_progress" { print "0x" $1 }')" = 0x40001004
test "$(i686-elf-nm -n build/day19-user-debug.elf | awk '$3 == "day19_release" { print "0x" $1 }')" = 0x40001008
i686-elf-objcopy --strip-all build/day19-user-debug.elf build/day19-user.elf
nasm -f elf32 -g -F dwarf kernel/day19-elf-blob.asm -o build/kernel-day19-elf-blob.o
i686-elf-ld -m elf_i386 --defsym=__kernel_file_max=65536 --defsym=__kernel_memory_max=131072 -z noexecstack -T kernel/linker.ld build/kernel-entry.o build/kernel-main.o build/kernel-runtime.o build/kernel-console.o build/kernel-exceptions.o build/kernel-isr.o build/kernel-timer.o build/kernel-keyboard.o build/kernel-memory.o build/kernel-paging.o build/kernel-paging-probes.o build/kernel-heap.o build/kernel-task.o build/kernel-switch.o build/kernel-user.o build/kernel-syscall.o build/kernel-elf.o build/kernel-user-entry.o build/kernel-day18-elf-blob.o build/kernel-day19-elf-blob.o -o build/kernel.elf
i686-elf-objcopy -O binary build/kernel.elf build/kernel.bin
cc -std=c11 -O2 -Wall -Wextra -Werror tools/mkpayload.c -o build/mkpayload
sh tools/kernel-header.sh build/kernel 65536 131072 0x334f5342 1
dd if=/dev/zero of=build/kernel.pad bs=512 count=128 status=none
dd if=build/kernel.bin of=build/kernel.pad bs=512 conv=notrunc status=none
test "$(wc -c < build/kernel.pad)" -eq $(( 128 * 512 ))
cp build/mbr.bin build/mbr.img
truncate -s $(( 4096 * 512 )) build/mbr.img
dd if=build/stage2.bin of=build/mbr.img bs=512 seek=1 conv=notrunc status=none
dd if=build/header.bin of=build/mbr.img bs=512 seek=9 conv=notrunc status=none
dd if=build/kernel.pad of=build/mbr.img bs=512 seek=10 conv=notrunc status=none
cp build/mbr.img build/mbr-badsig.img
printf '\0\0' | dd of=build/mbr-badsig.img bs=1 seek=510 conv=notrunc status=none
cp build/mbr.img build/mbr-truncated.img
truncate -s $(( (10 + ($(wc -c < build/kernel.bin) + 511) / 512 - 1) * 512 )) build/mbr-truncated.img
cp build/mbr.img build/mbr-badmagic.img
dd if=build/header-badmagic.bin of=build/mbr-badmagic.img bs=512 seek=9 conv=notrunc status=none
cp build/mbr.img build/mbr-oversized-header.img
dd if=build/header-oversized.bin of=build/mbr-oversized-header.img bs=512 seek=9 conv=notrunc status=none
cp build/mbr.img build/mbr-oversized-memory.img
dd if=build/header-memory-oversized.bin of=build/mbr-oversized-memory.img bs=512 seek=9 conv=notrunc status=none
cp build/mbr.img build/mbr-corrupt.img
printf '\0' | dd of=build/mbr-corrupt.img bs=1 seek=$(( 10 * 512 )) conv=notrunc status=none
{ printf 'mbr_lba=0\n'; printf 'stage2_lba=1\n'; printf 'stage2_sectors=8\n'; printf 'header_lba=9\n'; printf 'payload_lba=10\n'; printf 'payload_bytes=%s\n' "$(wc -c < build/kernel.bin)"; printf 'payload_sectors=%s\n' "$(( ($(wc -c < build/kernel.bin) + 511) / 512 ))"; printf 'payload_reserved_sectors=128\n'; printf 'payload_load=0x10000\n'; printf 'fat16_start_lba=2048\n'; printf 'read_chunk_sectors=32\n'; } > build/payload-layout.txt
nasm -D BAD_GDT -f bin boot/stage2.asm -o build/stage2-badgdt.bin
cp build/mbr.img build/mbr-badgdt.img
dd if=build/stage2-badgdt.bin of=build/mbr-badgdt.img bs=512 seek=1 conv=notrunc status=none
nasm -D FORCE_A20_FAIL -f bin boot/stage2.asm -o build/stage2-a20fail.bin
cp build/mbr.img build/mbr-a20fail.img
dd if=build/stage2-a20fail.bin of=build/mbr-a20fail.img bs=512 seek=1 conv=notrunc status=none
nasm -D FORCE_A20_OFF -f bin boot/stage2.asm -o build/stage2-a20off.bin
cp build/mbr.img build/mbr-a20off.img
dd if=build/stage2-a20off.bin of=build/mbr-a20off.img bs=512 seek=1 conv=notrunc status=none
nasm -D E820_CAPACITY=1 -f bin boot/stage2.asm -o build/stage2-e820full.bin
cp build/mbr.img build/mbr-e820full.img
dd if=build/stage2-e820full.bin of=build/mbr-e820full.img bs=512 seek=1 conv=notrunc status=none
nasm -D SKIP_BSS_CLEAR -f elf32 -g -F dwarf kernel/entry.asm -o build/kernel-entry-badbss.o
i686-elf-ld -m elf_i386 --defsym=__kernel_file_max=65536 --defsym=__kernel_memory_max=131072 -z noexecstack -T kernel/linker.ld build/kernel-entry-badbss.o build/kernel-main.o build/kernel-runtime.o build/kernel-console.o build/kernel-exceptions.o build/kernel-isr.o build/kernel-timer.o build/kernel-keyboard.o build/kernel-memory.o build/kernel-paging.o build/kernel-paging-probes.o build/kernel-heap.o build/kernel-task.o build/kernel-switch.o build/kernel-user.o build/kernel-syscall.o build/kernel-elf.o build/kernel-user-entry.o build/kernel-day18-elf-blob.o build/kernel-day19-elf-blob.o -o build/kernel-badbss.elf
i686-elf-objcopy -O binary build/kernel-badbss.elf build/kernel-badbss.bin
sh tools/kernel-header.sh build/kernel-badbss 65536 131072 0x334f5342 1
cp build/mbr.img build/mbr-badbss.img
dd if=build/kernel-badbss-header.bin of=build/mbr-badbss.img bs=512 seek=9 conv=notrunc status=none
dd if=build/kernel-badbss.bin of=build/mbr-badbss.img bs=512 seek=10 conv=notrunc status=none
nasm -D ONE_SECTOR_READS -f bin boot/stage2.asm -o build/stage2-chunk1.bin
cp build/mbr.img build/mbr-chunk1.img
dd if=build/stage2-chunk1.bin of=build/mbr-chunk1.img bs=512 seek=1 conv=notrunc status=none
i686-elf-gcc -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Werror -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables -m32 -mno-sse -mno-sse2 -mno-mmx -msoft-float -fno-builtin -D TEST_PANIC -c kernel/main.c -o build/kernel-main-panic.o
i686-elf-ld -m elf_i386 --defsym=__kernel_file_max=65536 --defsym=__kernel_memory_max=131072 -z noexecstack -T kernel/linker.ld build/kernel-entry.o build/kernel-main-panic.o build/kernel-runtime.o build/kernel-console.o build/kernel-exceptions.o build/kernel-isr.o build/kernel-timer.o build/kernel-keyboard.o build/kernel-memory.o build/kernel-paging.o build/kernel-paging-probes.o build/kernel-heap.o build/kernel-task.o build/kernel-switch.o build/kernel-user.o build/kernel-syscall.o build/kernel-elf.o build/kernel-user-entry.o build/kernel-day18-elf-blob.o build/kernel-day19-elf-blob.o -o build/kernel-panic.elf
i686-elf-objcopy -O binary build/kernel-panic.elf build/kernel-panic.bin
sh tools/kernel-header.sh build/kernel-panic 65536 131072 0x334f5342 1
cp build/mbr.img build/mbr-panic.img
dd if=build/kernel-panic-header.bin of=build/mbr-panic.img bs=512 seek=9 conv=notrunc status=none
dd if=build/kernel-panic.bin of=build/mbr-panic.img bs=512 seek=10 conv=notrunc status=none
