Don't use -fomit-frame-pointer when building VGA bios.
authorKevin O'Connor <kevin@koconnor.net>
Sun, 18 Dec 2011 15:51:19 +0000 (10:51 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Sun, 18 Dec 2011 15:57:39 +0000 (10:57 -0500)
The real-mode emulator that Windows 7 uses to execute the vga bios rom
becomes very confused when the code tries to dereference the stack
pointer instead of using the frame pointer, leading to corruption of
parameters passed on the stack from one function to another.

Signed-off-by: Julian Pidancet <julian.pidancet@gmail.com>
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Makefile

index e3cf384b04837333fc3637d48a5ad6e0803bf6a6..4f0e6ab86ed1749d1960b50d6f75cee09bda250f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -32,21 +32,20 @@ COMMONCFLAGS = -I$(OUT) -Os -MD \
     $(call cc-option,$(CC),-Wtype-limits,) \
     -m32 -march=i386 -mregparm=3 -mpreferred-stack-boundary=2 \
     -mrtd -minline-all-stringops \
-    -freg-struct-return -ffreestanding -fomit-frame-pointer \
-    -fno-delete-null-pointer-checks \
+    -freg-struct-return -ffreestanding -fno-delete-null-pointer-checks \
     -ffunction-sections -fdata-sections -fno-common
 COMMONCFLAGS += $(call cc-option,$(CC),-nopie,)
 COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
 COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
 
-CFLAGS32FLAT = $(COMMONCFLAGS) -g -DMODE16=0 -DMODESEGMENT=0
+CFLAGS32FLAT = $(COMMONCFLAGS) -DMODE16=0 -DMODESEGMENT=0 -g -fomit-frame-pointer
 CFLAGSSEG = $(COMMONCFLAGS) -DMODESEGMENT=1 -fno-defer-pop \
     $(call cc-option,$(CC),-fno-jump-tables,-DMANUAL_NO_JUMP_TABLE) \
     $(call cc-option,$(CC),-fno-tree-switch-conversion,)
-CFLAGS32SEG = $(CFLAGSSEG) -DMODE16=0 -g
+CFLAGS32SEG = $(CFLAGSSEG) -DMODE16=0 -g -fomit-frame-pointer
 CFLAGS16INC = $(CFLAGSSEG) -DMODE16=1 \
     $(call cc-option,$(CC),--param large-stack-frame=4,-fno-inline)
-CFLAGS16 = $(CFLAGS16INC) -g
+CFLAGS16 = $(CFLAGS16INC) -g -fomit-frame-pointer
 
 all: $(OUT) $(OUT)bios.bin
 
@@ -173,7 +172,9 @@ $(OUT)bios.bin.elf $(OUT)bios.bin: $(OUT)rom.o tools/checkrom.py
 SRCVGA=src/output.c src/util.c vgasrc/vga.c vgasrc/vgafb.c vgasrc/vgaio.c \
        vgasrc/vgatables.c vgasrc/vgafonts.c vgasrc/clext.c
 
-$(OUT)vgaccode.16.s: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16) -S -Isrc, $(SRCVGA),$@)
+CFLAGS16VGA = $(CFLAGS16INC) -g -Isrc
+
+$(OUT)vgaccode.16.s: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16VGA) -S, $(SRCVGA),$@)
 
 $(OUT)vgalayout16.o: vgaentry.S $(OUT)vgaccode.16.s $(OUT)asm-offsets.h
        @echo "  Compiling (16bit) $@"