Date: Wed, 07 Jul 2010 11:35:52 +0300 From: Andriy Gapon <avg@freebsd.org> To: "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>, freebsd-hackers@freebsd.org Cc: Konstantin Belousov <kib@freebsd.org>, Navdeep Parhar <np@freebsd.org>, Peter Wemm <peter@freebsd.org> Subject: Re: elf obj load: skip zero-sized sections early Message-ID: <4C343C68.8010302@freebsd.org> In-Reply-To: <4C321409.2070500@freebsd.org> References: <4C246CD0.3020606@freebsd.org> <20100702082754.S14969@maildrop.int.zabbadoz.net> <4C320E6E.4040007@freebsd.org> <20100705171155.K14969@maildrop.int.zabbadoz.net> <4C321409.2070500@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
What do you think about something like the following?
diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h
index 1ee7717..ddfdefc 100644
--- a/sys/sys/pcpu.h
+++ b/sys/sys/pcpu.h
@@ -53,14 +53,17 @@
extern uintptr_t *__start_set_pcpu;
extern uintptr_t *__stop_set_pcpu;
-__asm__(
-#ifdef __arm__
- ".section set_pcpu, \"aw\", %progbits\n"
+#if defined(__arm__)
+#define _PROGBITS "%progbits"
#else
- ".section set_pcpu, \"aw\", @progbits\n"
+#define _PROGBITS "@progbits"
#endif
- "\t.p2align " __XSTRING(CACHE_LINE_SHIFT) "\n"
- "\t.previous");
+#define _CUSTOM_SECTION(name, flags, align) \
+ __asm__( \
+ ".section " __XSTRING(name) \
+ ",\"" __XSTRING(flags) "\"," _PROGBITS "\n" \
+ "\t.p2align " __XSTRING(align) "\n" \
+ "\t.previous")
/*
* Array of dynamic pcpu base offsets. Indexed by id.
@@ -82,7 +85,10 @@ extern uintptr_t dpcpu_off[];
*/
#define DPCPU_NAME(n) pcpu_entry_##n
#define DPCPU_DECLARE(t, n) extern t DPCPU_NAME(n)
-#define DPCPU_DEFINE(t, n) t DPCPU_NAME(n) __section("set_pcpu") __used
+
+#define DPCPU_DEFINE(t, n) \
+ _CUSTOM_SECTION(set_pcpu, aw, CACHE_LINE_SHIFT); \
+ t DPCPU_NAME(n) __section("set_pcpu") __used
/*
* Accessors with a given base.
The diff looks a little bit messier than the resulting macros :-)
So I am pasting them too, just for your convenience:
#if defined(__arm__)
#define _PROGBITS "%progbits"
#else
#define _PROGBITS "@progbits"
#endif
#define _CUSTOM_SECTION(name, flags, align) \
__asm__( \
".section " __XSTRING(name) \
",\"" __XSTRING(flags) "\"," _PROGBITS "\n" \
"\t.p2align " __XSTRING(align) "\n" \
"\t.previous")
...
#define DPCPU_DEFINE(t, n) \
_CUSTOM_SECTION(set_pcpu, aw, CACHE_LINE_SHIFT); \
t DPCPU_NAME(n) __section("set_pcpu") __used
Not sure if _CUSTOM_SECTION is an overkill here or a useful/reusable thing.
The idea is to tie '.section' directive to DPCPU_DEFINE macro, so that [empty]
set_pcpu section is not created by merely including pcpu.h.
Multiple DPCPU_DEFINE instances would cause multiple '.section' directives for
set_pcpu, but that doesn't cause any problem.
Here's an example of how this case looks in gcc-generated assembly (with two
DPCPU_DEFINE instances):
#APP
.section set_pcpu,"aw",@progbits
.p2align 7
.previous
.section set_pcpu,"aw",@progbits
.p2align 7
.previous
...
#NO_APP
...
.globl pcpu_entry_dpcpu_nvram1
.section set_pcpu,"aw",@progbits
.align 8
.type pcpu_entry_dpcpu_nvram1, @object
.size pcpu_entry_dpcpu_nvram1, 8
pcpu_entry_dpcpu_nvram1:
.zero 8
.globl pcpu_entry_dpcpu_nvram2
.align 8
.type pcpu_entry_dpcpu_nvram2, @object
.size pcpu_entry_dpcpu_nvram2, 8
pcpu_entry_dpcpu_nvram2:
.zero 8
.data
...
Here's objdump of the resulting module:
objdump -x -w nvram.ko | fgrep set_pcpu
5 set_pcpu 00000010 0000000000000000 0000000000000000 00000380 2**7
CONTENTS, ALLOC, LOAD, DATA
0000000000000000 l O set_pcpu 0000000000000008 pcpu_entry_dpcpu_nvram1
0000000000000008 l O set_pcpu 0000000000000008 pcpu_entry_dpcpu_nvram2
0000000000000000 l d set_pcpu 0000000000000000
Looks good to me.
--
Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C343C68.8010302>
