Create a ".code16gcc" directive in src/code16gcc.s and use -Wa,src/code16gcc.s to tell gcc to compile directly to 16bit code. This eliminates the need to compile the C code to assembler and include in romlayout.S and vgaentry.S. This also allows those two assembler files to be compiled with debugging (-g) enabled.
Also, includes some Makefile cleanups.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- Makefile | 58 ++++++++++++++++++++++++++++++---------------------- src/code16gcc.s | 1 + src/romlayout.S | 11 +-------- vgasrc/vgaentry.S | 10 +------- 4 files changed, 38 insertions(+), 42 deletions(-) create mode 100644 src/code16gcc.s
diff --git a/Makefile b/Makefile index 513e8f1..07a1174 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # SeaBIOS build system # -# Copyright (C) 2008-2010 Kevin O'Connor kevin@koconnor.net +# Copyright (C) 2008-2012 Kevin O'Connor kevin@koconnor.net # # This file may be distributed under the terms of the GNU LGPLv3 license.
@@ -23,11 +23,11 @@ SRC32FLAT=$(SRCBOTH) post.c shadow.c memmap.c coreboot.c boot.c \ biostables.c xen.c bmp.c SRC32SEG=util.c output.c pci.c pcibios.c apm.c stacks.c
+# Default compiler flags cc-option=$(shell if test -z "`$(1) $(2) -S -o /dev/null -xc /dev/null 2>&1`" \ ; then echo "$(2)"; else echo "$(3)"; fi ;)
-# Default compiler flags -COMMONCFLAGS = -I$(OUT) -Os -MD \ +COMMONCFLAGS = -I$(OUT) -Os -MD -g \ -Wall -Wno-strict-aliasing -Wold-style-definition \ $(call cc-option,$(CC),-Wtype-limits,) \ -m32 -march=i386 -mregparm=3 -mpreferred-stack-boundary=2 \ @@ -38,14 +38,14 @@ 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) -DMODE16=0 -DMODESEGMENT=0 -g -fomit-frame-pointer +CFLAGS32FLAT = $(COMMONCFLAGS) -DMODE16=0 -DMODESEGMENT=0 -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 -fomit-frame-pointer -CFLAGS16INC = $(CFLAGSSEG) -DMODE16=1 \ +CFLAGS32SEG = $(CFLAGSSEG) -DMODE16=0 -fomit-frame-pointer +CFLAGS16INC = $(CFLAGSSEG) -DMODE16=1 -Wa,src/code16gcc.s \ $(call cc-option,$(CC),--param large-stack-frame=4,-fno-inline) -CFLAGS16 = $(CFLAGS16INC) -g -fomit-frame-pointer +CFLAGS16 = $(CFLAGS16INC) -fomit-frame-pointer
# Run with "make V=1" to see the actual compile commands ifdef V @@ -79,7 +79,8 @@ all: $(target-y) vpath %.c src vgasrc vpath %.S src vgasrc
-################ Build rules + +################ Common build rules
# Verify the gcc configuration and test if -fwhole-program works. TESTGCC:=$(shell CC="$(CC)" LD="$(LD)" tools/test-gcc.sh) @@ -122,34 +123,37 @@ endif
$(OUT)%.s: %.c @echo " Compiling to assembler $@" - $(Q)$(CC) $(CFLAGS16INC) -S -c $< -o $@ + $(Q)$(CC) $(CFLAGS16) -S -c $< -o $@
$(OUT)%.lds: %.lds.S @echo " Precompiling $@" $(Q)$(CPP) -P -D__ASSEMBLY__ $< -o $@
+ +################ Main BIOS build rules + $(OUT)asm-offsets.s: $(OUT)autoconf.h
$(OUT)asm-offsets.h: $(OUT)asm-offsets.s @echo " Generating offset file $@" $(Q)./tools/gen-offsets.sh $< $@
- -$(OUT)ccode.16.s: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16) -S, $(addprefix src/, $(SRC16)),$@) +$(OUT)ccode16.o: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16), $(addprefix src/, $(SRC16)),$@)
$(OUT)code32seg.o: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS32SEG), $(addprefix src/, $(SRC32SEG)),$@)
$(OUT)ccode32flat.o: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS32FLAT), $(addprefix src/, $(SRC32FLAT)),$@)
-$(OUT)code16.o: romlayout.S $(OUT)ccode.16.s $(OUT)asm-offsets.h +$(OUT)romlayout.o: romlayout.S $(OUT)asm-offsets.h @echo " Compiling (16bit) $@" - $(Q)$(CC) $(CFLAGS16INC) -c -D__ASSEMBLY__ $< -o $@ + $(Q)$(CC) $(CFLAGS16) -c -D__ASSEMBLY__ $< -o $@
-$(OUT)romlayout16.lds: $(OUT)ccode32flat.o $(OUT)code32seg.o $(OUT)code16.o tools/layoutrom.py +$(OUT)romlayout16.lds: $(OUT)ccode32flat.o $(OUT)code32seg.o $(OUT)ccode16.o $(OUT)romlayout.o tools/layoutrom.py @echo " Building ld scripts (version "$(VERSION)")" $(Q)echo 'const char VERSION[] = "$(VERSION)";' > $(OUT)version.c $(Q)$(CC) $(CFLAGS32FLAT) -c $(OUT)version.c -o $(OUT)version.o $(Q)$(LD) -melf_i386 -r $(OUT)ccode32flat.o $(OUT)version.o -o $(OUT)code32flat.o + $(Q)$(LD) -melf_i386 -r $(OUT)ccode16.o $(OUT)romlayout.o -o $(OUT)code16.o $(Q)$(OBJDUMP) -thr $(OUT)code32flat.o > $(OUT)code32flat.o.objdump $(Q)$(OBJDUMP) -thr $(OUT)code32seg.o > $(OUT)code32seg.o.objdump $(Q)$(OBJDUMP) -thr $(OUT)code16.o > $(OUT)code16.o.objdump @@ -157,7 +161,7 @@ $(OUT)romlayout16.lds: $(OUT)ccode32flat.o $(OUT)code32seg.o $(OUT)code16.o tool
# These are actually built by tools/layoutrom.py above, but by pulling them # into an extra rule we prevent make -j from spawning layoutrom.py 4 times. -$(OUT)romlayout32seg.lds $(OUT)romlayout32flat.lds $(OUT)code32flat.o: $(OUT)romlayout16.lds +$(OUT)romlayout32seg.lds $(OUT)romlayout32flat.lds $(OUT)code32flat.o $(OUT)code16.o: $(OUT)romlayout16.lds
$(OUT)rom16.o: $(OUT)code16.o $(OUT)romlayout16.lds @echo " Linking $@" @@ -187,17 +191,17 @@ SRCVGA=src/output.c src/util.c src/pci.c \ vgasrc/stdvga.c vgasrc/stdvgamodes.c vgasrc/stdvgaio.c \ vgasrc/clext.c vgasrc/bochsvga.c vgasrc/geodevga.c
-CFLAGS16VGA = $(CFLAGS16INC) -g -Isrc +CFLAGS16VGA = $(CFLAGS16INC) -Isrc
-$(OUT)vgaccode.16.s: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16VGA) -S, $(SRCVGA),$@) +$(OUT)vgaccode16.o: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16VGA), $(SRCVGA),$@)
-$(OUT)vgalayout16.o: vgaentry.S $(OUT)vgaccode.16.s $(OUT)asm-offsets.h +$(OUT)vgaentry.o: vgaentry.S $(OUT)autoconf.h @echo " Compiling (16bit) $@" - $(Q)$(CC) $(CFLAGS16INC) -c -D__ASSEMBLY__ -Isrc $< -o $@ + $(Q)$(CC) $(CFLAGS16VGA) -c -D__ASSEMBLY__ $< -o $@
-$(OUT)vgarom.o: $(OUT)vgalayout16.o $(OUT)vgalayout.lds +$(OUT)vgarom.o: $(OUT)vgaccode16.o $(OUT)vgaentry.o $(OUT)vgalayout.lds @echo " Linking $@" - $(Q)$(LD) --gc-sections -T $(OUT)vgalayout.lds $(OUT)vgalayout16.o -o $@ + $(Q)$(LD) --gc-sections -T $(OUT)vgalayout.lds $(OUT)vgaccode16.o $(OUT)vgaentry.o -o $@
$(OUT)vgabios.bin.raw: $(OUT)vgarom.o @echo " Extracting binary $@" @@ -207,7 +211,9 @@ $(OUT)vgabios.bin: $(OUT)vgabios.bin.raw tools/buildrom.py @echo " Finalizing rom $@" $(Q)$(PYTHON) ./tools/buildrom.py $< $@
-####### dsdt build rules + +################ DSDT build rules + src/%.hex: src/%.dsl ./tools/acpi_extract_preprocess.py ./tools/acpi_extract.py @echo "Compiling DSDT" $(Q)cpp -P $< > $(OUT)$*.dsl.i.orig @@ -216,9 +222,9 @@ src/%.hex: src/%.dsl ./tools/acpi_extract_preprocess.py ./tools/acpi_extract.py $(Q)$(PYTHON) ./tools/acpi_extract.py $(OUT)$*.lst > $(OUT)$*.off $(Q)cat $(OUT)$*.off > $@
-$(OUT)ccode32flat.o: src/acpi-dsdt.hex src/ssdt-proc.hex src/ssdt-pcihp.hex
-####### Kconfig rules +################ Kconfig rules + define do-kconfig $(Q)mkdir -p $(OUT)/tools/kconfig/lxdialog $(Q)mkdir -p $(OUT)/include/config @@ -230,7 +236,9 @@ $(KCONFIG_CONFIG): ; $(call do-kconfig, defconfig) %onfig: ; $(call do-kconfig, $@) help: ; $(call do-kconfig, $@)
-####### Generic rules + +################ Generic rules + clean: $(Q)rm -rf $(OUT)
diff --git a/src/code16gcc.s b/src/code16gcc.s new file mode 100644 index 0000000..8f7121b --- /dev/null +++ b/src/code16gcc.s @@ -0,0 +1 @@ +.code16gcc diff --git a/src/romlayout.S b/src/romlayout.S index 5983a4a..c4b2ef1 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -1,18 +1,10 @@ // Rom layout and bios assembler to C interface. // -// Copyright (C) 2008,2009 Kevin O'Connor kevin@koconnor.net +// Copyright (C) 2008-2012 Kevin O'Connor kevin@koconnor.net // Copyright (C) 2002 MandrakeSoft S.A. // // This file may be distributed under the terms of the GNU LGPLv3 license.
- -/**************************************************************** - * Include of 16bit C code - ****************************************************************/ - - .code16gcc -#include "ccode.16.s" - #include "config.h" // CONFIG_* #include "ioport.h" // PORT_A20 #include "bregs.h" // CR0_* @@ -29,6 +21,7 @@ // %edx = return location (in 32bit mode) // Clobbers: ecx, flags, segment registers, cr0, idt/gdt DECLFUNC transition32 + .code16gcc transition32: movl %eax, %ecx
diff --git a/vgasrc/vgaentry.S b/vgasrc/vgaentry.S index 785d91f..d9fe05b 100644 --- a/vgasrc/vgaentry.S +++ b/vgasrc/vgaentry.S @@ -1,17 +1,10 @@ // Rom layout and bios assembler to C interface. // -// Copyright (C) 2009 Kevin O'Connor kevin@koconnor.net +// Copyright (C) 2009-2012 Kevin O'Connor kevin@koconnor.net // // This file may be distributed under the terms of the GNU LGPLv3 license.
-/**************************************************************** - * Include of 16bit C code - ****************************************************************/ - - .code16gcc -#include "vgaccode.16.s" - #include "config.h" // CONFIG_* #include "entryfuncs.S" // ENTRY_*
@@ -21,6 +14,7 @@ ****************************************************************/
.section .rom.header + .code16gcc .global _rom_header, _rom_header_size, _rom_header_checksum _rom_header: .word 0xaa55