[LinuxBIOS] shared symbols / initram
Jordan Crouse
jordan.crouse at amd.com
Wed Oct 10 23:48:27 CEST 2007
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 <jordan.crouse at amd.com>
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: info at coresystems.de • 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 <stepan at coresystems.de>
>
> 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 <stepan at coresystems.de>
> + *
> + * 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
> linuxbios at linuxbios.org
> http://www.linuxbios.org/mailman/listinfo/linuxbios
--
Jordan Crouse
Systems Software Development Engineer
Advanced Micro Devices, Inc.
More information about the coreboot
mailing list