mirror of
https://github.com/memtest86plus/memtest86plus.git
synced 2025-02-25 18:55:23 -06:00
* Merge bootsect.S and setup.S into header.S Currently, Memtest86+ provides two (three counting mbr.S) different headers: bootsect.S and header.S that together with setup.S are used to build the final binaries: - bootsect.S for booting from the legacy BIOS, used in memtest.bin. - header.S for booting from the UEFI, used in memtest.efi. Both support loading by an intermediate bootloader. Also, both are derived from the Linux kernel, but from a very different chapter in its evolution. FDD loading was removed a very long time ago, many, many years before adding PE/COFF headers for UEFI. Also, the PE/COFF headers are large (even larger for x86-64) and take a lot of very limited space, leaving almost no headroom for the actual code. This commit merges bootsect.S and setup.S into header.S adding BIOS (FDD) loading support, which should eventually enable to maintain a single, all-in-one binary that can be booted either by an intermediate bootloader (such as GRUB or LILO), UEFI and BIOS. Easier and less confusing for users, as I have continued to see cases when people assume memtest.bin is needed for non-UEFI systems, even if never intended for FDD loading. To ensure we have enough space for both the boot code (limited to 512B including Linux boot header and address of the New EXE header) and UEFI headers, the PE/COFF headers got moved into the ".setup" section of the code where *currently* we have 1024B total and about 90B free. Should more space be needed in the future, we can grow that section or perhaps even better - move PE/COFF into its own section that will not even need to be loaded. Overall, the code got copied from bootsect.S and setup.S with very, very minimal changes, most importantly: - Dedicated routine for printing strings (print_string) got added and lives in the ".bootsect" section. - Print "Loading " message almost immediately after BIOS loads and calls code from the .bootsect" section, even before setting up the custom FDD parameter table. The sooner the better. - Set DX to 0x0000, as the code depends on its value. While the BIOS is expected to set DL register to the boot drive number which is 0 for FDD, to my knowledge there is no guarantee for DH to have any particular value. Also, when executing "MZ" signature as x86 instructions, the original value of DX becomes instantly and irrevocably lost. This is fine as we only support booting from FDD anyway. - Print "Memtest86+" and its version after loading the ".setup" section. We can get the string from mt86plus_version (kernel_version), no need to duplicate in the boot sector where we are very space limited and as a bonus we can provide the version information. As diffstat shows a lot of code changed and added, it may be easier use the following commands: diff -Nur bootsect.S header.S diff -Nur setup.S header.S While there are several more changes and fixes I would like to make in the boot code (some of them were already included in the earlier RFC version [1] before we got UEFI signing support added) for now I tried this to be as least disruptive as possible and avoid unnecessary code changes to make the review easier. [1] https://github.com/memtest86plus/memtest86plus/pull/136 * Bye bye memtest.bin and memtest.efi, long live mt86plus With the efi binary providing the BIOS floppy loading functionality, there is no need to support separate memtest.bin file any longer. Remove memtest.bin from {build32,build64}/Makefile, replace memtest.bin amd memtest.efi with mt86plus eveywhere to avoid confusion with other memtests. Also, unify build32/Makefile and build64/Makefile by removing unnecessary differences between them, like extra spaces or different OBJS order. Finally, update README.md, HOW_TO_DEBUG_WITH_GDB.md and other places that had a reference to memtest.{bin,efi}. Note that for debug_memtest.sh, mt86plus.efi is used.
263 lines
8.8 KiB
Makefile
263 lines
8.8 KiB
Makefile
AS = as -64
|
|
CC = gcc
|
|
OBJCOPY = objcopy
|
|
|
|
GIT = git
|
|
|
|
ifeq ($(GIT),none)
|
|
GIT_AVAILABLE = false
|
|
else
|
|
GIT_AVAILABLE = true
|
|
endif
|
|
|
|
CFLAGS = -std=gnu11 -Wall -Wextra -Wshadow -m64 -march=x86-64 -mno-mmx -mno-sse -mno-sse2 \
|
|
-fpic -fno-builtin -ffreestanding -fomit-frame-pointer -fno-stack-protector \
|
|
-fexcess-precision=standard -DARCH_BITS=64
|
|
|
|
ifeq ($(DEBUG), 1)
|
|
CFLAGS+=-ggdb3 -DDEBUG_GDB
|
|
OPT_SMALL=-Og
|
|
OPT_FAST=-Og
|
|
MS_LDS=memtest_shared_debug.lds
|
|
else
|
|
OPT_SMALL=-Os
|
|
OPT_FAST=-O3
|
|
MS_LDS=ldscripts/memtest_shared.lds
|
|
endif
|
|
|
|
INC_DIRS = -I../boot -I../system -I../lib -I../tests -I../app -Iapp
|
|
|
|
SYS_OBJS = system/acpi.o \
|
|
system/cpuid.o \
|
|
system/cpuinfo.o \
|
|
system/cpulocal.o \
|
|
system/ehci.o \
|
|
system/font.o \
|
|
system/heap.o \
|
|
system/hwctrl.o \
|
|
system/hwquirks.o \
|
|
system/keyboard.o \
|
|
system/ohci.o \
|
|
system/memctrl.o \
|
|
system/pci.o \
|
|
system/pmem.o \
|
|
system/reloc.o \
|
|
system/screen.o \
|
|
system/serial.o \
|
|
system/smbios.o \
|
|
system/i2c_x86.o \
|
|
system/spd.o \
|
|
system/smp.o \
|
|
system/temperature.o \
|
|
system/timers.o \
|
|
system/uhci.o \
|
|
system/usbhcd.o \
|
|
system/vmem.o \
|
|
system/xhci.o
|
|
|
|
IMC_SRCS = $(wildcard ../system/imc/*.c)
|
|
IMC_OBJS = $(subst ../,,$(IMC_SRCS:.c=.o))
|
|
|
|
LIB_OBJS = lib/barrier.o \
|
|
lib/print.o \
|
|
lib/read.o \
|
|
lib/string.o \
|
|
lib/unistd.o
|
|
|
|
TST_OBJS = tests/addr_walk1.o \
|
|
tests/bit_fade.o \
|
|
tests/block_move.o \
|
|
tests/modulo_n.o \
|
|
tests/mov_inv_fixed.o \
|
|
tests/mov_inv_random.o \
|
|
tests/mov_inv_walk1.o \
|
|
tests/own_addr.o \
|
|
tests/test_helper.o \
|
|
tests/tests.o
|
|
|
|
APP_OBJS = app/badram.o \
|
|
app/config.o \
|
|
app/display.o \
|
|
app/error.o \
|
|
app/interrupt.o \
|
|
app/main.o
|
|
|
|
OBJS = boot/startup.o boot/efisetup.o $(SYS_OBJS) $(IMC_OBJS) $(LIB_OBJS) $(TST_OBJS) $(APP_OBJS)
|
|
|
|
all: mt86plus
|
|
|
|
check:
|
|
@if [ -z ${DEBUG} ]; then\
|
|
echo "Macro DEBUG is not defined. Run debug_memtest.sh to invoke debug target";\
|
|
exit 1;\
|
|
fi
|
|
|
|
debug: check memtest.debug mt86plus
|
|
|
|
-include boot/efisetup.d
|
|
-include $(subst .o,.d,$(SYS_OBJS))
|
|
-include $(subst .o,.d,$(IMC_OBJS))
|
|
-include $(subst .o,.d,$(LIB_OBJS))
|
|
-include $(subst .o,.d,$(TST_OBJS))
|
|
-include $(subst .o,.d,$(APP_OBJS))
|
|
|
|
boot/header.o : | ../boot/sbat.csv
|
|
|
|
boot/startup.o: ../boot/startup64.S ../boot/boot.h
|
|
@mkdir -p boot
|
|
$(CC) -m64 -x assembler-with-cpp -c -I../boot -o $@ $<
|
|
|
|
boot/%.o: ../boot/%.S ../boot/boot.h app/build_version.h
|
|
@mkdir -p boot
|
|
$(CC) -m64 -x assembler-with-cpp -c -I../boot -Iapp -o $@ $<
|
|
|
|
boot/efisetup.o: ../boot/efisetup.c
|
|
@mkdir -p boot
|
|
$(CC) -c $(CFLAGS) $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
system/reloc.o: ../system/reloc64.c
|
|
@mkdir -p system
|
|
$(CC) -c $(CFLAGS) -fno-strict-aliasing $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
system/%.o: ../system/%.c
|
|
@mkdir -p system
|
|
$(CC) -c $(CFLAGS) $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
system/imc/%.o: ../system/imc/%.c
|
|
@mkdir -p system/imc
|
|
$(CC) -c $(CFLAGS) $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
lib/%.o: ../lib/%.c
|
|
@mkdir -p lib
|
|
$(CC) -c $(CFLAGS) $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
tests/%.o: ../tests/%.c
|
|
@mkdir -p tests
|
|
$(CC) -c $(CFLAGS) $(OPT_FAST) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
app/%.o: ../app/%.c app/build_version.h
|
|
@mkdir -p app
|
|
$(CC) -c $(CFLAGS) $(OPT_SMALL) $(INC_DIRS) -o $@ $< -MMD -MP -MT $@ -MF $(@:.o=.d)
|
|
|
|
app/build_version.h: FORCE
|
|
@mkdir -p app
|
|
@( \
|
|
cp -f ../app/version.h $@.tmp; \
|
|
if $(GIT_AVAILABLE) && test -d ../.git ; then \
|
|
hash=`git rev-parse HEAD | cut -c1-7`; \
|
|
sed -i 's/GIT_HASH\s\".*"/GIT_HASH "'$$hash'"/' $@.tmp; \
|
|
else \
|
|
sed -i 's/GIT_HASH\s\".*"/GIT_HASH "unknown"/' $@.tmp; \
|
|
fi; \
|
|
cmp $@ $@.tmp 2>/dev/null || cp -f $@.tmp $@; \
|
|
rm -f $@.tmp; \
|
|
)
|
|
|
|
FORCE:
|
|
|
|
# Link it statically once so I know I don't have undefined symbols and
|
|
# then link it dynamically so I have full relocation information.
|
|
|
|
memtest_shared: $(OBJS) $(MS_LDS) Makefile
|
|
$(LD) --warn-constructors --warn-common -static -T $(MS_LDS) -o $@ $(OBJS) && \
|
|
$(LD) -shared -Bsymbolic -T $(MS_LDS) -o $@ $(OBJS)
|
|
|
|
memtest_shared.bin: memtest_shared
|
|
$(OBJCOPY) -O binary $< memtest_shared.bin
|
|
|
|
memtest.debug: memtest_shared
|
|
objcopy --only-keep-debug memtest_shared memtest.debug
|
|
strip -R .eh_frame memtest_shared
|
|
strip -R .comment memtest_shared
|
|
|
|
mt86plus: memtest_shared.bin boot/header.o ldscripts/memtest_efi.lds
|
|
$(eval SIZES=$(shell size -B -d memtest_shared | grep memtest_shared))
|
|
$(LD) --defsym=_bss_size=$(word 3,$(SIZES)) -T ldscripts/memtest_efi.lds boot/header.o -b binary memtest_shared.bin -o mt86plus
|
|
|
|
memtest.mbr: memtest_shared.bin boot/mbr.o ldscripts/memtest_mbr.lds
|
|
$(LD) -T ldscripts/memtest_mbr.lds boot/mbr.o -b binary memtest_shared.bin -o memtest.mbr
|
|
|
|
floppy.img: mt86plus
|
|
dd if=/dev/zero of=floppy.img bs=1474560 count=1
|
|
dd if=mt86plus of=floppy.img bs=1474560 conv=notrunc
|
|
|
|
esp.img: mt86plus
|
|
@mkdir -p iso/EFI/BOOT
|
|
cp mt86plus iso/EFI/BOOT/bootx64.efi
|
|
@rm -f esp.img
|
|
/sbin/mkdosfs -n MEMTEST-ESP -F12 -C esp.img 4096
|
|
mcopy -s -i esp.img iso/EFI ::
|
|
|
|
memtest.iso: memtest.mbr floppy.img esp.img
|
|
@mkdir -p iso/boot
|
|
cp floppy.img iso/boot/floppy.img
|
|
xorrisofs -pad -R -J -volid MT86PLUS_64 -graft-points -hide-rr-moved --grub2-mbr memtest.mbr \
|
|
-b /boot/floppy.img --efi-boot --interval:appended_partition_2:all:: \
|
|
-part_like_isohybrid -iso_mbr_part_type 0x00 -append_partition 2 0xef ./esp.img \
|
|
-o ./memtest.iso /boot=./iso/boot /EFI=./iso/EFI
|
|
|
|
iso: memtest.iso
|
|
|
|
clean:
|
|
rm -rf boot system lib tests app *.img *.iso memtest* mt86plus iso grub-*
|
|
|
|
# grub-memtest.iso uses GRUB as an intermediate bootloader to allow Memtest86+
|
|
# to be started with the native USB keyboard drivers either enabled or disabled,
|
|
# or to be started in a fail-safe mode with SMP and memory identification &
|
|
# speed testing disabled.
|
|
#
|
|
# By setting GRUB_CFG to "grub-test", grub-memtest.iso can instead be used for
|
|
# testing the various different boot modes. Upstream GRUB only supports the
|
|
# 16-bit and 32-bit boot protocols, via the "linux16" and "linux" commands.
|
|
# Fedora add support for the EFI handover boot protocols, via the "linuxefi"
|
|
# command, and, since 2019, remove support for the 32-bit protocol, aliasing
|
|
# the "linux" command to either "linux16" or "linuxefi", depending on whether
|
|
# you boot in legacy or EFI mode. Mageia follows Fedora, but restores support
|
|
# for the 32-bit protocol, via the "linux32" command. Other distributions no
|
|
# doubt do their own thing. The boot menu on grub-memtest.iso attempts to
|
|
# support all these options.
|
|
|
|
GRUB_CFG ?= grub
|
|
|
|
GRUB_FONT_DIR ?= /usr/share/grub
|
|
|
|
GRUB_LIB_DIR ?= /usr/lib/grub
|
|
|
|
GRUB_MKIMAGE := $(shell command -v grub2-mkimage || command -v grub-mkimage)
|
|
|
|
GRUB_MODULES = iso9660 fat part_msdos part_gpt all_video font gfxterm gfxmenu \
|
|
boot chain configfile echo ls
|
|
|
|
grub-eltorito.img:
|
|
$(GRUB_MKIMAGE) --output $@ --prefix /boot/grub --format i386-pc-eltorito biosdisk $(GRUB_MODULES)
|
|
|
|
grub-bootx64.efi:
|
|
$(GRUB_MKIMAGE) --output $@ --prefix /EFI/BOOT/grub --format x86_64-efi $(GRUB_MODULES)
|
|
|
|
grub-esp.img: mt86plus grub-bootx64.efi ../grub/${GRUB_CFG}-efi.cfg
|
|
@mkdir -p grub-iso/EFI/BOOT/grub/x86_64-efi grub-iso/EFI/BOOT/grub/fonts
|
|
cp mt86plus grub-iso/EFI/BOOT/memtest
|
|
cp grub-bootx64.efi grub-iso/EFI/BOOT/bootx64.efi
|
|
cp ../grub/${GRUB_CFG}-efi.cfg grub-iso/EFI/BOOT/grub/grub.cfg
|
|
cp $(GRUB_FONT_DIR)/unicode.pf2 grub-iso/EFI/BOOT/grub/fonts/
|
|
cp $(GRUB_LIB_DIR)/x86_64-efi/*.mod grub-iso/EFI/BOOT/grub/x86_64-efi/
|
|
@rm -f grub-esp.img
|
|
/sbin/mkdosfs -n MT86P_ESP -F12 -C grub-esp.img 8192
|
|
mcopy -s -i grub-esp.img grub-iso/EFI ::
|
|
|
|
grub-memtest.iso: mt86plus grub-eltorito.img ../grub/${GRUB_CFG}-legacy.cfg grub-esp.img
|
|
@mkdir -p grub-iso/boot/grub/i386-pc grub-iso/boot/grub/fonts
|
|
cp mt86plus grub-iso/boot/memtest
|
|
cp grub-eltorito.img grub-iso/boot/eltorito.img
|
|
cp ../grub/${GRUB_CFG}-legacy.cfg grub-iso/boot/grub/grub.cfg
|
|
cp $(GRUB_FONT_DIR)/unicode.pf2 grub-iso/boot/grub/fonts/
|
|
cp $(GRUB_LIB_DIR)/i386-pc/*.mod grub-iso/boot/grub/i386-pc/
|
|
xorrisofs -pad -R -J -volid MT86PLUS_64 -graft-points -hide-rr-moved \
|
|
--grub2-mbr $(GRUB_LIB_DIR)/i386-pc/boot_hybrid.img \
|
|
-b /boot/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
|
|
--efi-boot --interval:appended_partition_2:all:: \
|
|
-part_like_isohybrid -iso_mbr_part_type 0x00 -append_partition 2 0xef ./grub-esp.img \
|
|
-o ./grub-memtest.iso /boot=./grub-iso/boot /EFI=./grub-iso/EFI
|
|
|
|
grub-iso: grub-memtest.iso
|