From 9342d1be4ea2f49127ad451486101f8a0c43814e Mon Sep 17 00:00:00 2001 From: Carl-Daniel Hailfinger Date: Sun, 17 Aug 2008 21:51:13 +0000 Subject: [PATCH] The ABI wrapper from r775 made the SHARED definitions obsolete. They're not that readable anyway, so kill them and use standard definitions instead. Introduce EXPORT_SYMBOL for shared symbols. EXPORT_SYMBOL tells the compiler to use the standard calling conventions for a given symbol and not to optimize it away. Benefits: - We can later use gcc -combine -fwhole-program without problems. - It's a correctness fix for some optimizations. - We could check for duplicated exported functions at link time. - We could check whether exported functions are linked into initram or stage2 by accident. - We could generate usage statistics and possibly optimize away unused shared functions. - Through the above points, significant side reductions of 10-40% Build and boot tested on qemu. Build tested on all targets. Signed-off-by: Carl-Daniel Hailfinger Acked-by: Ronald G. Minnich git-svn-id: svn://coreboot.org/repository/coreboot-v3@780 f3766cd6-281f-0410-b1cd-43a5c92072e9 --- arch/x86/Makefile | 2 +- include/arch/x86/cpu.h | 12 ++++++++---- include/console.h | 13 ++++++++----- include/device/pci_ops.h | 24 ++++++++++++++++-------- include/lar.h | 27 ++++++++++++++++++--------- include/mc146818rtc.h | 3 ++- include/post_code.h | 3 ++- include/shared.h | 40 ++-------------------------------------- include/string.h | 12 ++++++++---- 9 files changed, 65 insertions(+), 71 deletions(-) diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 9254fd71fa..92fdebb9b6 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -260,7 +260,7 @@ $(obj)/arch/x86/amd/stage0.o: $(src)/arch/x86/amd/stage0.S $(obj)/coreboot.initram $(obj)/coreboot.initram.map: $(obj)/stage0.init $(obj)/stage0-prefixed.o $(INITRAM_SRC) $(Q)printf " CC $(subst $(shell pwd)/,,$(@)) (XIP)\n" - $(Q)$(CC) $(INITCFLAGS) -D_SHARED -fPIE -c -combine $(INITRAM_SRC) -o $(obj)/coreboot.initram_partiallylinked.o + $(Q)$(CC) $(INITCFLAGS) -fPIE -c -combine $(INITRAM_SRC) -o $(obj)/coreboot.initram_partiallylinked.o $(Q)printf " WRAP $(subst $(shell pwd)/,,$(@)) (PIC->non-PIC)\n" $(Q)$(NM) --undefined-only $(obj)/coreboot.initram_partiallylinked.o |\ grep -v _GLOBAL_OFFSET_TABLE_ | grep " U " | sed "s/^ *U //" |\ diff --git a/include/arch/x86/cpu.h b/include/arch/x86/cpu.h index 725a8ed3b2..5e202b2fff 100644 --- a/include/arch/x86/cpu.h +++ b/include/arch/x86/cpu.h @@ -201,8 +201,10 @@ static inline __attribute__((always_inline)) void hlt(void) __asm__ __volatile__("hlt" : : : "memory"); } -SHARED(bottom_of_stack, void *, void); -SHARED(global_vars, struct global_vars *, void); +void * bottom_of_stack(void); +EXPORT_SYMBOL(bottom_of_stack); +struct global_vars * global_vars(void); +EXPORT_SYMBOL(global_vars); #ifdef CONFIG_CONSOLE_BUFFER #define PRINTK_BUF_SIZE_CAR (CONFIG_CARSIZE / 2) @@ -251,9 +253,11 @@ struct rmap { }; }; -SHARED(setup_resource_map_x_offset, void, const struct rmap *rm, u32 max, +void setup_resource_map_x_offset(const struct rmap *rm, u32 max, u32 offset_dev, u32 offset_pciio, u32 offset_io); -SHARED(setup_resource_map, void, const struct rmap *rm, u32 max); +EXPORT_SYMBOL(setup_resource_map_x_offset); +void setup_resource_map(const struct rmap *rm, u32 max); +EXPORT_SYMBOL(setup_resource_map); #endif /* ARCH_X86_CPU_H */ diff --git a/include/console.h b/include/console.h index 920d7db653..dca1db9d3d 100644 --- a/include/console.h +++ b/include/console.h @@ -71,10 +71,13 @@ struct global_vars { #endif }; -SHARED_WITH_ATTRIBUTES(printk, int, __attribute__((format (printf, 2, 3))), - int msg_level, const char *fmt, ...); -SHARED(banner, void, int msg_level, const char *msg); -SHARED(dump_mem_range, void, int msg_level, unsigned char *buf, int size); -SHARED(die, void, const char *msg); +int printk(int msg_level, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +EXPORT_SYMBOL(printk); +void banner(int msg_level, const char *msg); +EXPORT_SYMBOL(banner); +void dump_mem_range(int msg_level, unsigned char *buf, int size); +EXPORT_SYMBOL(dump_mem_range); +void die(const char *msg); +EXPORT_SYMBOL(die); #endif /* CONSOLE_H */ diff --git a/include/device/pci_ops.h b/include/device/pci_ops.h index 516c94e4bf..bcc60e6d17 100644 --- a/include/device/pci_ops.h +++ b/include/device/pci_ops.h @@ -30,13 +30,21 @@ void pci_write_config8(struct device * dev, unsigned where, u8 val); void pci_write_config16(struct device * dev, unsigned where, u16 val); void pci_write_config32(struct device * dev, unsigned where, u32 val); -SHARED(pci_conf1_read_config8, u8, u32 bdf, int where); -SHARED(pci_conf1_read_config16, u16, u32 bdf, int where); -SHARED(pci_conf1_read_config32, u32, u32 bdf, int where); -SHARED(pci_conf1_write_config8, void , u32 bdf, int where, u8 value); -SHARED(pci_conf1_write_config16, void, u32 bdf, int where, u16 value); -SHARED(pci_conf1_write_config32, void, u32 bdf, int where, u32 value); -SHARED(pci_conf1_find_on_bus, int, u16 bus, u16 vid, u16 did, u32 *busdevfn); -SHARED(pci_conf1_find_device, int, u16 vid, u16 did, u32 * dev); +u8 pci_conf1_read_config8(u32 bdf, int where); +EXPORT_SYMBOL(pci_conf1_read_config8); +u16 pci_conf1_read_config16(u32 bdf, int where); +EXPORT_SYMBOL(pci_conf1_read_config16); +u32 pci_conf1_read_config32(u32 bdf, int where); +EXPORT_SYMBOL(pci_conf1_read_config32); +void pci_conf1_write_config8(u32 bdf, int where, u8 value); +EXPORT_SYMBOL(pci_conf1_write_config8); +void pci_conf1_write_config16(u32 bdf, int where, u16 value); +EXPORT_SYMBOL(pci_conf1_write_config16); +void pci_conf1_write_config32(u32 bdf, int where, u32 value); +EXPORT_SYMBOL(pci_conf1_write_config32); +int pci_conf1_find_on_bus(u16 bus, u16 vid, u16 did, u32 *busdevfn); +EXPORT_SYMBOL(pci_conf1_find_on_bus); +int pci_conf1_find_device(u16 vid, u16 did, u32 * dev); +EXPORT_SYMBOL(pci_conf1_find_device); #endif /* DEVICE_PCI_OPS_H */ diff --git a/include/lar.h b/include/lar.h index 1c15d79577..a6a5653163 100644 --- a/include/lar.h +++ b/include/lar.h @@ -94,14 +94,23 @@ struct mem_file { /* Prototypes. */ /* architecture-defined */ -SHARED(init_archive, void, struct mem_file *); +void init_archive(struct mem_file *); +EXPORT_SYMBOL(init_archive); /* architecture-independent */ -SHARED(find_file, int, const struct mem_file *archive, const char *filename, struct mem_file *result); -SHARED(copy_file, int, const struct mem_file *archive, const char *filename, void *where); -SHARED(run_file, int, const struct mem_file *archive, const char *filename, void *where); -SHARED(execute_in_place, int, const struct mem_file *archive, const char *filename); -SHARED(run_address, int, void *f); -SHARED(load_file, void *, const struct mem_file *archive, const char *filename); -SHARED(load_file_segments, void *, const struct mem_file *archive, const char *filename); -SHARED(process_file, int, const struct mem_file *archive, void *where); +int find_file(const struct mem_file *archive, const char *filename, struct mem_file *result); +EXPORT_SYMBOL(find_file); +int copy_file(const struct mem_file *archive, const char *filename, void *where); +EXPORT_SYMBOL(copy_file); +int run_file(const struct mem_file *archive, const char *filename, void *where); +EXPORT_SYMBOL(run_file); +int execute_in_place(const struct mem_file *archive, const char *filename); +EXPORT_SYMBOL(execute_in_place); +int run_address(void *f); +EXPORT_SYMBOL(run_address); +void * load_file(const struct mem_file *archive, const char *filename); +EXPORT_SYMBOL(load_file); +void * load_file_segments(const struct mem_file *archive, const char *filename); +EXPORT_SYMBOL(load_file_segments); +int process_file(const struct mem_file *archive, void *where); +EXPORT_SYMBOL(process_file); #endif /* LAR_H */ diff --git a/include/mc146818rtc.h b/include/mc146818rtc.h index e0fdee6e17..a5cd505f2e 100644 --- a/include/mc146818rtc.h +++ b/include/mc146818rtc.h @@ -122,7 +122,8 @@ int get_option(void *dest, char *name); #else #include -SHARED(get_option, int, void *dest, char *name); +int get_option(void *dest, char *name); +EXPORT_SYMBOL(get_option); #endif void rtc_init(int invalid); int last_boot_normal(void); diff --git a/include/post_code.h b/include/post_code.h index 5b186444f0..893ba16901 100644 --- a/include/post_code.h +++ b/include/post_code.h @@ -24,7 +24,8 @@ #include #include -SHARED(post_code, void, u8 value); +void post_code(u8 value); +EXPORT_SYMBOL(post_code); /* This is a collection of existing POST values used by post_code(). * port80_post() and Geode specific codes are not (yet?) listed here. diff --git a/include/shared.h b/include/shared.h index 23b5fcdd2b..36cd946498 100644 --- a/include/shared.h +++ b/include/shared.h @@ -1,8 +1,7 @@ /* * This file is part of the coreboot project * - * Copyright(C) 2007 coresystems GmbH - * Written by Stefan Reinauer + * Copyright(C) 2008 Carl-Daniel Hailfinger * * 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 @@ -22,41 +21,6 @@ #ifndef SHARED_H #define SHARED_H -#define FUNC(func, ret, attr, args...) \ - ret func(args) attr -#define EXTERN(func, ret, attr, args...) - -/** - * 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) +#define EXPORT_SYMBOL(sym) extern typeof(sym) sym __attribute__((externally_visible,used)) #endif /* SHARED_H */ diff --git a/include/string.h b/include/string.h index 5fdcd18bfc..e75951a0bc 100644 --- a/include/string.h +++ b/include/string.h @@ -31,10 +31,14 @@ int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, int maxlen); /* lib/mem.c */ -SHARED(memcpy, void *, void *dest, const void *src, size_t len); -SHARED(memmove, void *, void *dest, const void *src, size_t len); -SHARED(memset, void *, void *s, int c, size_t len); -SHARED(memcmp, int , const void *s1, const void *s2, size_t len); +void * memcpy(void *dest, const void *src, size_t len); +EXPORT_SYMBOL(memcpy); +void * memmove(void *dest, const void *src, size_t len); +EXPORT_SYMBOL(memmove); +void * memset(void *s, int c, size_t len); +EXPORT_SYMBOL(memset); +int memcmp(const void *s1, const void *s2, size_t len); +EXPORT_SYMBOL(memcmp); /* console/vsprintf.c */ int sprintf(char *buf, const char *fmt, ...);