Create shared symbols for stage0 functions.

This fixes for example printk calls from initram code.

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>



git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@505 f3766cd6-281f-0410-b1cd-43a5c92072e9
This commit is contained in:
Stefan Reinauer 2007-10-11 16:13:12 +00:00
commit a15933d861
9 changed files with 129 additions and 27 deletions

View file

@ -148,6 +148,11 @@ $(obj)/stage0.o $(obj)/stage0.init: $(STAGE0_OBJ)
$(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

View file

@ -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 @@ static void pci_conf2_write_config32(struct bus *pbus, int bus, int devfn, int w
#undef SET
#undef IOADDR
#undef FUNC
#undef DEVFUNC
struct pci_bus_operations pci_cf8_conf2 =
{

View file

@ -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 @@ struct console_driver {
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 */

View file

@ -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

73
include/shared.h Normal file
View file

@ -0,0 +1,73 @@
/*
* This file is part of the LinuxBIOS project
*
* Copyright(C) 2007 coresystems GmbH
* Written by Stefan Reinauer <stepan@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 */

View file

@ -32,14 +32,21 @@ INITRAM_OBJ = $(obj)/mainboard/$(MAINBOARDDIR)/initram.o \
$(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

View file

@ -26,8 +26,15 @@ INITRAM_OBJ = $(obj)/mainboard/$(MAINBOARDDIR)/initram.o \
$(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 @@ $(obj)/linuxbios.vpd:
$(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

View file

@ -30,14 +30,21 @@ $(obj)/linuxbios.vpd:
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

View file

@ -41,14 +41,15 @@ $(obj)/linuxbios.vpd:
#
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