From: Kevin O'Connor Date: Sat, 11 Feb 2012 15:49:45 +0000 (-0500) Subject: Direct compile 16bit C code instead of including via .S files. X-Git-Tag: rel-1.7.0~52 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=36feea9317b45abf3a540e9d82ad1723bebe3ebd;p=seabios.git Direct compile 16bit C code instead of including via .S files. 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 --- 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 +# Copyright (C) 2008-2012 Kevin O'Connor # # 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 +// Copyright (C) 2008-2012 Kevin O'Connor // 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 +// Copyright (C) 2009-2012 Kevin O'Connor // // 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