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.
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@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@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@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@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 \
$(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ $(obj)/linuxbios.initram$(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o
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 \
$(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ $(obj)/linuxbios.initram$(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o
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 \
$(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ $(obj)/linuxbios.initram$(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o
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 \
$(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.initram.o \ $(obj)/linuxbios.initram$(INITRAM_OBJ) -o $(obj)/linuxbios.initram.o
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@linuxbios.org http://www.linuxbios.org/mailman/listinfo/linuxbios
On 10/10/07, Jordan Crouse jordan.crouse@amd.com wrote:
Acked-by: Jordan Crouse jordan.crouse@amd.com
Now that this is place, can we figure out why stage2 goes into the weeds?
once committed, I will try it too.
ron
* ron minnich rminnich@gmail.com [071011 17:11]:
On 10/10/07, Jordan Crouse jordan.crouse@amd.com wrote:
Acked-by: Jordan Crouse jordan.crouse@amd.com
r505
Now that this is place, can we figure out why stage2 goes into the weeds?
What's wrong with stage2? Are you referring to initram or to the pci setup?
once committed, I will try it too.
please go ahead!
I'm thinking to drag out my FS2 -- I think the norwich takes that connection, right? It ought to be simpler with jtag in place.
ron
ron minnich wrote:
I'm thinking to drag out my FS2 -- I think the norwich takes that connection, right? It ought to be simpler with jtag in place.
ron
Yes, the fs2 header is on norwich and will probably help you a lot. It would be good to know if memory is really working and we fail somewhere inside stage2 or in the jump to it. Marc
will start setup tonight, esp. now that I have a workshop!
ron