On 10/10/07 20:23 +0200, Stefan Reinauer wrote: > Here's the cleaned up version of the XIP/initram patch. > > New since the last version: > * It uses the macro suggestion from Jordan > * SHARED-ify post_code() > * use -N during linking initram code to noticably reduce > initram size (drops ~8k of alignment) > * rename pci_ops FUNC to DEVFUNC to avoid name clash.
Acked-by: Jordan Crouse <[EMAIL PROTECTED]> Now that this is place, can we figure out why stage2 goes into the weeds? > -- > coresystems GmbH • Brahmsstr. 16 • D-79104 Freiburg i. Br. > Tel.: +49 761 7668825 • Fax: +49 761 7664613 > Email: [EMAIL PROTECTED] • http://www.coresystems.de/ > Registergericht: Amtsgericht Freiburg • HRB 7656 > Geschäftsführer: Stefan Reinauer • Ust-IdNr.: DE245674866 > Create shared symbols for stage0 functions. > This fixes for example printk calls from initram code. > > Signed-off-by: Stefan Reinauer <[EMAIL PROTECTED]> > > Index: include/console.h > =================================================================== > --- include/console.h (revision 504) > +++ include/console.h (working copy) > @@ -18,6 +18,7 @@ > #define CONSOLE_H > > #include <types.h> > +#include <shared.h> /* We share symbols from stage 0 */ > > #define BIOS_EMERG 0 /* system is unusable */ > #define BIOS_ALERT 1 /* action must be taken immediately */ > @@ -45,8 +46,7 @@ > int (*tst_byte)(void); > }; > > -// > -int printk(int msg_level, const char *fmt, ...) > - __attribute__((format (printf, 2, 3))); > +SHARED_WITH_ATTRIBUTES(printk, int, __attribute__((format (printf, 2, 3))), > + int msg_level, const char *fmt, ...); > > #endif /* CONSOLE_H */ > Index: include/shared.h > =================================================================== > --- include/shared.h (revision 0) > +++ include/shared.h (revision 0) > @@ -0,0 +1,73 @@ > +/* > + * This file is part of the LinuxBIOS project > + * > + * Copyright(C) 2007 coresystems GmbH > + * Written by Stefan Reinauer <[EMAIL PROTECTED]> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#ifndef SHARED_H > +#define SHARED_H > + > +#ifdef _SHARED > +/* _SHARED mode enforces some functions to be called with an > + * absolute address, even in PIE mode. This is required since > + * the relative distance between XIP code and stage 0 is not known > + */ > +#define FUNC(func, ret, attr, args...) \ > + ret stage0_##func(args) attr > +#define EXTERN(func, ret, attr, args...) \ > + ret (*func)(args) attr= stage0_##func > +#else > +#define FUNC(func, ret, attr, args...) \ > + ret func(args) attr > +#define EXTERN(func, ret, attr, args...) > +#endif > + > +/** > + * Use the SHARED macro to create a universally usable function > + * prototype. This will create a function prototype in stage 0 and > + * a function prototype plus a function pointer for all code compiled > + * with _SHARED defined (required for XIP code) > + * > + * @func function name > + * @ret return value > + * @args function arguments > + */ > + > +#define SHARED(func,ret,args...) \ > + FUNC(func,ret,,##args); \ > + EXTERN(func,ret,,##args) > + > + > +/** > + * Use the SHARED_WITH_ATTRIBUTES macro to create a universally usable > function > + * prototype for a function using GCC attributes. > + * This macro works identically to SHARED(), but it adds a GCC attribute to > the > + * function. So far we use this to have printk parameters tested with a > + * "format" attribute. > + * > + * @func function name > + * @ret return value > + * @attr function attributes > + * @args function arguments > + */ > + > +#define SHARED_WITH_ATTRIBUTES(func,ret,attr,args...) \ > + FUNC(func,ret,attr,##args); \ > + EXTERN(func,ret,attr,##args) > + > +#endif /* SHARED_H */ > Index: include/post_code.h > =================================================================== > --- include/post_code.h (revision 504) > +++ include/post_code.h (working copy) > @@ -18,7 +18,9 @@ > * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > */ > > -void post_code(u8 value); > +#include <shared.h> > > +SHARED(post_code, void, u8 value); > + > #define POST_START_OF_MAIN 0x01 > > Index: mainboard/adl/msm800sev/Makefile > =================================================================== > --- mainboard/adl/msm800sev/Makefile (revision 504) > +++ mainboard/adl/msm800sev/Makefile (working copy) > @@ -32,14 +32,21 @@ > $(obj)/southbridge/amd/cs5536/smbus_initram.o \ > $(obj)/arch/x86/geodelx/geodelx.o > > -# These are possibly not permanent > -INITRAM_OBJ += $(obj)/lib/console.o $(obj)/lib/vtxprintf.o > $(obj)/lib/uart8250.o $(obj)/arch/x86/post_code.o > +# Next Quest: Make a single rule out of those: > +$(obj)/mainboard/$(MAINBOARDDIR)/initram.o: > $(src)/mainboard/$(MAINBOARDDIR)/initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/northbridge/amd/geodelx/raminit.o: > $(src)/northbridge/amd/geodelx/raminit.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/southbridge/amd/cs5536/smbus_initram.o: > $(src)/southbridge/amd/cs5536/smbus_initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/arch/x86/geodelx/geodelx.o: $(src)/arch/x86/geodelx/geodelx.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > > -$(obj)/linuxbios.initram: $(obj)/stage0.init $(obj)/stage0.o $(INITRAM_OBJ) > +$(obj)/linuxbios.initram $(obj)/linuxbios.initram.map: $(obj)/stage0.init > $(obj)/stage0-prefixed.o $(INITRAM_OBJ) > $(Q)# initram links against stage0 > $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" > - $(Q)$(LD) -Ttext 0x80000 $(INITRAM_OBJ) \ > - --entry=main -o $(obj)/linuxbios.initram.o > + $(Q)$(LD) --entry main -N -R $(obj)/stage0-prefixed.o \ > + $(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o > $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" > $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ > $(obj)/linuxbios.initram > Index: mainboard/amd/norwich/Makefile > =================================================================== > --- mainboard/amd/norwich/Makefile (revision 504) > +++ mainboard/amd/norwich/Makefile (working copy) > @@ -26,8 +26,15 @@ > $(obj)/southbridge/amd/cs5536/smbus_initram.o \ > $(obj)/arch/x86/geodelx/geodelx.o > > -# These are possibly not permanent > -INITRAM_OBJ += $(obj)/lib/console.o $(obj)/lib/vtxprintf.o > $(obj)/lib/uart8250.o $(obj)/arch/x86/post_code.o > +# Next Quest: Make a single rule out of those: > +$(obj)/mainboard/$(MAINBOARDDIR)/initram.o: > $(src)/mainboard/$(MAINBOARDDIR)/initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/northbridge/amd/geodelx/raminit.o: > $(src)/northbridge/amd/geodelx/raminit.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/southbridge/amd/cs5536/smbus_initram.o: > $(src)/southbridge/amd/cs5536/smbus_initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/arch/x86/geodelx/geodelx.o: $(src)/arch/x86/geodelx/geodelx.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > > STAGE2_MAINBOARD_OBJ = > > @@ -35,11 +42,11 @@ > $(Q)printf " BUILD DUMMY VPD\n" > $(Q)dd if=/dev/zero of=$(obj)/linuxbios.vpd bs=256 count=1 $(SILENT) > > -$(obj)/linuxbios.initram $(obj)/linuxbios.initram.map: $(obj)/stage0.init > $(obj)/stage0.o $(INITRAM_OBJ) > +$(obj)/linuxbios.initram $(obj)/linuxbios.initram.map: $(obj)/stage0.init > $(obj)/stage0-prefixed.o $(INITRAM_OBJ) > $(Q)# initram links against stage0 > $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" > - $(Q)$(LD) -Ttext 0x80000 $(INITRAM_OBJ) \ > - --entry=main -o $(obj)/linuxbios.initram.o > + $(Q)$(LD) --entry main -N -R $(obj)/stage0-prefixed.o \ > + $(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o > $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" > $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ > $(obj)/linuxbios.initram > Index: mainboard/artecgroup/dbe61/Makefile > =================================================================== > --- mainboard/artecgroup/dbe61/Makefile (revision 504) > +++ mainboard/artecgroup/dbe61/Makefile (working copy) > @@ -30,14 +30,21 @@ > INITRAM_OBJ = $(obj)/mainboard/$(MAINBOARDDIR)/initram.o \ > $(obj)/arch/x86/geodelx/geodelx.o > > -# These are possibly not permanent > -INITRAM_OBJ += $(obj)/lib/console.o $(obj)/lib/vtxprintf.o > $(obj)/lib/uart8250.o $(obj)/arch/x86/post_code.o > +# Next Quest: Make a single rule out of those: > +$(obj)/mainboard/$(MAINBOARDDIR)/initram.o: > $(src)/mainboard/$(MAINBOARDDIR)/initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/northbridge/amd/geodelx/raminit.o: > $(src)/northbridge/amd/geodelx/raminit.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/southbridge/amd/cs5536/smbus_initram.o: > $(src)/southbridge/amd/cs5536/smbus_initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > +$(obj)/arch/x86/geodelx/geodelx.o: $(src)/arch/x86/geodelx/geodelx.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > > -$(obj)/linuxbios.initram: $(obj)/stage0.init $(obj)/stage0.o $(INITRAM_OBJ) > +$(obj)/linuxbios.initram $(obj)/linuxbios.initram.map: $(obj)/stage0.init > $(obj)/stage0-prefixed.o $(INITRAM_OBJ) > $(Q)# initram links against stage0 > $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" > - $(Q)$(LD) -Ttext 0x80000 $(INITRAM_OBJ) \ > - --entry=main -o $(obj)/linuxbios.initram.o > + $(Q)$(LD) --entry main -N -R $(obj)/stage0-prefixed.o \ > + $(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o > $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" > $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ > $(obj)/linuxbios.initram > Index: mainboard/emulation/qemu-x86/Makefile > =================================================================== > --- mainboard/emulation/qemu-x86/Makefile (revision 504) > +++ mainboard/emulation/qemu-x86/Makefile (working copy) > @@ -41,14 +41,15 @@ > # > > INITRAM_OBJ = $(obj)/mainboard/$(MAINBOARDDIR)/initram.o > -# These are possibly not permanent > -INITRAM_OBJ += $(obj)/lib/console.o $(obj)/lib/vtxprintf.o > $(obj)/lib/uart8250.o $(obj)/arch/x86/post_code.o > > -$(obj)/linuxbios.initram: $(obj)/stage0.init $(obj)/stage0.o $(INITRAM_OBJ) > +$(obj)/mainboard/$(MAINBOARDDIR)/initram.o: > $(src)/mainboard/$(MAINBOARDDIR)/initram.c > + $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c $< -o $@ > + > +$(obj)/linuxbios.initram $(obj)/linuxbios.initram.map: $(obj)/stage0.init > $(obj)/stage0-prefixed.o $(INITRAM_OBJ) > $(Q)# initram links against stage0 > $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" > - $(Q)$(LD) -Ttext 0x80000 $(INITRAM_OBJ) \ > - --entry=main -o $(obj)/linuxbios.initram.o > + $(Q)$(LD) --entry main -N -R $(obj)/stage0-prefixed.o \ > + $(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o > $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" > $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ > $(obj)/linuxbios.initram > Index: arch/x86/pci_ops_conf2.c > =================================================================== > --- arch/x86/pci_ops_conf2.c (revision 504) > +++ arch/x86/pci_ops_conf2.c (working copy) > @@ -12,8 +12,8 @@ > */ > > #define IOADDR(devfn, where) ((0xC000 | ((devfn & 0x78) << 5)) + where) > -#define FUNC(devfn) (((devfn & 7) << 1) | 0xf0) > -#define SET(bus,devfn) outb(FUNC(devfn), 0xCF8); outb(bus, > 0xCFA); > +#define DEVFUNC(devfn) (((devfn & 7) << 1) | 0xf0) > +#define SET(bus,devfn) outb(DEVFUNC(devfn), 0xCF8); outb(bus, > 0xCFA); > > static u8 pci_conf2_read_config8(struct bus *pbus, int bus, int devfn, int > where) > { > @@ -65,7 +65,7 @@ > > #undef SET > #undef IOADDR > -#undef FUNC > +#undef DEVFUNC > > struct pci_bus_operations pci_cf8_conf2 = > { > Index: arch/x86/Makefile > =================================================================== > --- arch/x86/Makefile (revision 504) > +++ arch/x86/Makefile (working copy) > @@ -148,6 +148,11 @@ > $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" > $(Q)$(OBJCOPY) -O binary $(obj)/stage0.o $(obj)/stage0.init > > + $(Q)# Do another OBJCOPY to get a copy with renamed symbols > + $(Q)# for XIP code. > + $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@)) (prefixing stage0)\n" > + $(Q)$(OBJCOPY) --prefix-symbols=stage0_ $(obj)/stage0.o > $(obj)/stage0-prefixed.o > + > $(Q)printf " TEST $(subst $(shell pwd)/,,$(@))\n" > $(Q)test `wc -c < $(obj)/stage0.init` -gt 16128 && \ > printf "Error. Bootblock got too big.\n" || true > -- > linuxbios mailing list > [email protected] > http://www.linuxbios.org/mailman/listinfo/linuxbios -- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc. -- linuxbios mailing list [email protected] http://www.linuxbios.org/mailman/listinfo/linuxbios
