With all of Xen''s symbols sitting within a 2Gb range on x86-64, they
can be referred to by the kallsyms-like offset table using 4- instead
of 8-byte slots.
The marker table can use 4-byte slots in all cases, just like the table
entry counts can (though that''s only a minor improvement).
If ia64''s PERCPU_ADDR got moved down to (KERNEL_START + 2Gb -
PERCPU_PAGE_SIZE), it could also utilize the more compact form.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
--- 2009-06-10.orig/xen/common/symbols.c 2007-04-02 12:16:26.000000000 +0200
+++ 2009-06-10/xen/common/symbols.c 2009-06-30 16:58:32.000000000 +0200
@@ -18,21 +18,27 @@
#include <xen/string.h>
#include <xen/spinlock.h>
-extern unsigned long symbols_addresses[];
-extern unsigned long symbols_num_syms;
-extern u8 symbols_names[];
+#ifdef SYMBOLS_ORIGIN
+extern const unsigned int symbols_offsets[1];
+#define symbols_address(n) (SYMBOLS_ORIGIN + symbols_offsets[n])
+#else
+extern const unsigned long symbols_addresses[];
+#define symbols_address(n) symbols_addresses[n]
+#endif
+extern const unsigned int symbols_num_syms;
+extern const u8 symbols_names[];
-extern u8 symbols_token_table[];
-extern u16 symbols_token_index[];
+extern const u8 symbols_token_table[];
+extern const u16 symbols_token_index[];
-extern unsigned long symbols_markers[];
+extern const unsigned int symbols_markers[];
/* expand a compressed symbol data into the resulting uncompressed string,
given the offset to where the symbol is in the compressed stream */
static unsigned int symbols_expand_symbol(unsigned int off, char *result)
{
int len, skipped_first = 0;
- u8 *tptr, *data;
+ const u8 *tptr, *data;
/* get the compressed symbol length from the first symbol byte */
data = &symbols_names[off];
@@ -70,7 +76,7 @@ static unsigned int symbols_expand_symbo
* symbols array */
static unsigned int get_symbol_offset(unsigned long pos)
{
- u8 *name;
+ const u8 *name;
int i;
/* use the closest marker we have. We have markers every 256 positions,
@@ -107,13 +113,13 @@ const char *symbols_lookup(unsigned long
while (high-low > 1) {
mid = (low + high) / 2;
- if (symbols_addresses[mid] <= addr) low = mid;
+ if (symbols_address(mid) <= addr) low = mid;
else high = mid;
}
/* search for the first aliased symbol. Aliased symbols are
symbols with the same address */
- while (low && symbols_addresses[low - 1] == symbols_addresses[low])
+ while (low && symbols_address(low - 1) == symbols_address(low))
--low;
/* Grab name */
@@ -121,8 +127,8 @@ const char *symbols_lookup(unsigned long
/* Search for next non-aliased symbol */
for (i = low + 1; i < symbols_num_syms; i++) {
- if (symbols_addresses[i] > symbols_addresses[low]) {
- symbol_end = symbols_addresses[i];
+ if (symbols_address(i) > symbols_address(low)) {
+ symbol_end = symbols_address(i);
break;
}
}
@@ -132,8 +138,8 @@ const char *symbols_lookup(unsigned long
symbol_end = is_kernel_inittext(addr) ?
(unsigned long)_einittext : (unsigned long)_etext;
- *symbolsize = symbol_end - symbols_addresses[low];
- *offset = addr - symbols_addresses[low];
+ *symbolsize = symbol_end - symbols_address(low);
+ *offset = addr - symbols_address(low);
return namebuf;
}
--- 2009-06-10.orig/xen/common/symbols-dummy.c 2006-10-04 08:49:30.000000000
+0200
+++ 2009-06-10/xen/common/symbols-dummy.c 2009-06-30 16:55:43.000000000 +0200
@@ -6,11 +6,15 @@
#include <xen/config.h>
#include <xen/types.h>
-unsigned long symbols_addresses[1];
-unsigned long symbols_num_syms;
-u8 symbols_names[1];
+#ifdef SYMBOLS_ORIGIN
+const unsigned int symbols_offsets[1];
+#else
+const unsigned long symbols_addresses[1];
+#endif
+const unsigned int symbols_num_syms;
+const u8 symbols_names[1];
-u8 symbols_token_table[1];
-u16 symbols_token_index[1];
+const u8 symbols_token_table[1];
+const u16 symbols_token_index[1];
-unsigned long symbols_markers[1];
+const unsigned int symbols_markers[1];
--- 2009-06-10.orig/xen/include/asm-x86/config.h 2009-06-10 15:09:22.000000000
+0200
+++ 2009-06-10/xen/include/asm-x86/config.h 2009-06-30 16:52:22.000000000 +0200
@@ -259,6 +259,8 @@ extern unsigned int video_mode, video_fl
#define __HYPERVISOR_DS32 0xe010
#define __HYPERVISOR_DS __HYPERVISOR_DS64
+#define SYMBOLS_ORIGIN XEN_VIRT_START
+
/* For generic assembly code: use macros to define operation/operand sizes. */
#define __OS "q" /* Operation Suffix */
#define __OP "r" /* Operand Prefix */
--- 2009-06-10.orig/xen/tools/symbols.c 2008-12-03 10:55:25.000000000 +0100
+++ 2009-06-10/xen/tools/symbols.c 2009-07-01 09:53:36.000000000 +0200
@@ -108,10 +108,7 @@ static int read_symbol(FILE *in, struct
else if (toupper((uint8_t)stype) == ''A'')
{
/* Keep these useful absolute symbols */
- if (strcmp(sym, "__kernel_syscall_via_break") &&
- strcmp(sym, "__kernel_syscall_via_epc") &&
- strcmp(sym, "__kernel_sigtramp") &&
- strcmp(sym, "__gp"))
+ if (strcmp(sym, "__gp"))
return -1;
}
@@ -135,18 +132,9 @@ static int read_symbol(FILE *in, struct
static int symbol_valid(struct sym_entry *s)
{
/* Symbols which vary between passes. Passes 1 and 2 must have
- * identical symbol lists. The symbols_* symbols below are only added
- * after pass 1, they would be included in pass 2 when --all-symbols is
- * specified so exclude them to get a stable symbol list.
+ * identical symbol lists.
*/
static char *special_symbols[] = {
- "symbols_addresses",
- "symbols_num_syms",
- "symbols_names",
- "symbols_markers",
- "symbols_token_table",
- "symbols_token_index",
-
/* Exclude linker generated symbols which vary between passes */
"_SDA_BASE_", /* ppc */
"_SDA2_BASE_", /* ppc */
@@ -251,8 +239,9 @@ static void write_src(void)
unsigned int *markers;
char buf[KSYM_NAME_LEN+1];
+ printf("#include <xen/config.h>\n");
printf("#include <asm/types.h>\n");
- printf("#if BITS_PER_LONG == 64\n");
+ printf("#if BITS_PER_LONG == 64 &&
!defined(SYMBOLS_ORIGIN)\n");
printf("#define PTR .quad\n");
printf("#define ALGN .align 8\n");
printf("#else\n");
@@ -260,16 +249,21 @@ static void write_src(void)
printf("#define ALGN .align 4\n");
printf("#endif\n");
- printf(".data\n");
+ printf("\t.section .rodata, \"a\"\n");
+ printf("#ifndef SYMBOLS_ORIGIN\n");
+ printf("#define SYMBOLS_ORIGIN 0\n");
output_label("symbols_addresses");
+ printf("#else\n");
+ output_label("symbols_offsets");
+ printf("#endif\n");
for (i = 0; i < table_cnt; i++) {
- printf("\tPTR\t%#llx\n", table[i].addr);
+ printf("\tPTR\t%#llx - SYMBOLS_ORIGIN\n", table[i].addr);
}
printf("\n");
output_label("symbols_num_syms");
- printf("\tPTR\t%d\n", table_cnt);
+ printf("\t.long\t%d\n", table_cnt);
printf("\n");
/* table of offset markers, that give the offset in the compressed stream
@@ -293,7 +287,7 @@ static void write_src(void)
output_label("symbols_markers");
for (i = 0; i < ((table_cnt + 255) >> 8); i++)
- printf("\tPTR\t%d\n", markers[i]);
+ printf("\t.long\t%d\n", markers[i]);
printf("\n");
free(markers);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Keir Fraser
2009-Jul-10 14:57 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
On 10/07/2009 15:26, "Jan Beulich" <JBeulich@novell.com> wrote:> /* Keep these useful absolute symbols */ > - if (strcmp(sym, "__kernel_syscall_via_break") && > - strcmp(sym, "__kernel_syscall_via_epc") && > - strcmp(sym, "__kernel_sigtramp") && > - strcmp(sym, "__gp")) > + if (strcmp(sym, "__gp"))Is ''__gp'' useful? What is it?> static char *special_symbols[] = { > - "symbols_addresses", > - "symbols_num_syms", > - "symbols_names", > - "symbols_markers", > - "symbols_token_table", > - "symbols_token_index", > - > /* Exclude linker generated symbols which vary between passes */ > "_SDA_BASE_", /* ppc */ > "_SDA2_BASE_", /* ppc */Can we just kill the special_symbols[] thing altogether? Loosk like it only contains (unsupported) ppc stuff now? -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2009-Jul-10 15:04 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
>>> Keir Fraser <keir.fraser@eu.citrix.com> 10.07.09 16:57 >>> >On 10/07/2009 15:26, "Jan Beulich" <JBeulich@novell.com> wrote: > >> /* Keep these useful absolute symbols */ >> - if (strcmp(sym, "__kernel_syscall_via_break") && >> - strcmp(sym, "__kernel_syscall_via_epc") && >> - strcmp(sym, "__kernel_sigtramp") && >> - strcmp(sym, "__gp")) >> + if (strcmp(sym, "__gp")) > >Is ''__gp'' useful? What is it?For ia64 it is *very* important - it''s the base pointer to access short data.>> static char *special_symbols[] = { >> - "symbols_addresses", >> - "symbols_num_syms", >> - "symbols_names", >> - "symbols_markers", >> - "symbols_token_table", >> - "symbols_token_index", >> - >> /* Exclude linker generated symbols which vary between passes */ >> "_SDA_BASE_", /* ppc */ >> "_SDA2_BASE_", /* ppc */ > >Can we just kill the special_symbols[] thing altogether? Loosk like it only >contains (unsupported) ppc stuff now?Of course we could - I just didn''t dare to be more radical than I needed to be. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2009-Jul-10 15:52 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
On 10/07/2009 16:04, "Jan Beulich" <JBeulich@novell.com> wrote:>>> /* Exclude linker generated symbols which vary between passes */ >>> "_SDA_BASE_", /* ppc */ >>> "_SDA2_BASE_", /* ppc */ >> >> Can we just kill the special_symbols[] thing altogether? Loosk like it only >> contains (unsupported) ppc stuff now? > > Of course we could - I just didn''t dare to be more radical than I needed to > be.Okay. If we''re going to touch it I think we should be ruthless. I''ll kill the array entirely. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2009-Jul-13 10:28 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
This doesn''t build for me. Build host is Debian Etch running gcc 4.1.2 and binutils 2.17. Error snippet is attached -- it complains like this for every PTR line in .xen-syms.0.S. -- Keir On 10/07/2009 15:26, "Jan Beulich" <JBeulich@novell.com> wrote:> With all of Xen''s symbols sitting within a 2Gb range on x86-64, they > can be referred to by the kallsyms-like offset table using 4- instead > of 8-byte slots. > > The marker table can use 4-byte slots in all cases, just like the table > entry counts can (though that''s only a minor improvement). > > If ia64''s PERCPU_ADDR got moved down to (KERNEL_START + 2Gb - > PERCPU_PAGE_SIZE), it could also utilize the more compact form. > > Signed-off-by: Jan Beulich <jbeulich@novell.com> > > --- 2009-06-10.orig/xen/common/symbols.c 2007-04-02 12:16:26.000000000 +0200 > +++ 2009-06-10/xen/common/symbols.c 2009-06-30 16:58:32.000000000 +0200 > @@ -18,21 +18,27 @@ > #include <xen/string.h> > #include <xen/spinlock.h> > > -extern unsigned long symbols_addresses[]; > -extern unsigned long symbols_num_syms; > -extern u8 symbols_names[]; > +#ifdef SYMBOLS_ORIGIN > +extern const unsigned int symbols_offsets[1]; > +#define symbols_address(n) (SYMBOLS_ORIGIN + symbols_offsets[n]) > +#else > +extern const unsigned long symbols_addresses[]; > +#define symbols_address(n) symbols_addresses[n] > +#endif > +extern const unsigned int symbols_num_syms; > +extern const u8 symbols_names[]; > > -extern u8 symbols_token_table[]; > -extern u16 symbols_token_index[]; > +extern const u8 symbols_token_table[]; > +extern const u16 symbols_token_index[]; > > -extern unsigned long symbols_markers[]; > +extern const unsigned int symbols_markers[]; > > /* expand a compressed symbol data into the resulting uncompressed string, > given the offset to where the symbol is in the compressed stream */ > static unsigned int symbols_expand_symbol(unsigned int off, char *result) > { > int len, skipped_first = 0; > - u8 *tptr, *data; > + const u8 *tptr, *data; > > /* get the compressed symbol length from the first symbol byte */ > data = &symbols_names[off]; > @@ -70,7 +76,7 @@ static unsigned int symbols_expand_symbo > * symbols array */ > static unsigned int get_symbol_offset(unsigned long pos) > { > - u8 *name; > + const u8 *name; > int i; > > /* use the closest marker we have. We have markers every 256 positions, > @@ -107,13 +113,13 @@ const char *symbols_lookup(unsigned long > > while (high-low > 1) { > mid = (low + high) / 2; > - if (symbols_addresses[mid] <= addr) low = mid; > + if (symbols_address(mid) <= addr) low = mid; > else high = mid; > } > > /* search for the first aliased symbol. Aliased symbols are > symbols with the same address */ > - while (low && symbols_addresses[low - 1] == symbols_addresses[low]) > + while (low && symbols_address(low - 1) == symbols_address(low)) > --low; > > /* Grab name */ > @@ -121,8 +127,8 @@ const char *symbols_lookup(unsigned long > > /* Search for next non-aliased symbol */ > for (i = low + 1; i < symbols_num_syms; i++) { > - if (symbols_addresses[i] > symbols_addresses[low]) { > - symbol_end = symbols_addresses[i]; > + if (symbols_address(i) > symbols_address(low)) { > + symbol_end = symbols_address(i); > break; > } > } > @@ -132,8 +138,8 @@ const char *symbols_lookup(unsigned long > symbol_end = is_kernel_inittext(addr) ? > (unsigned long)_einittext : (unsigned long)_etext; > > - *symbolsize = symbol_end - symbols_addresses[low]; > - *offset = addr - symbols_addresses[low]; > + *symbolsize = symbol_end - symbols_address(low); > + *offset = addr - symbols_address(low); > return namebuf; > } > > --- 2009-06-10.orig/xen/common/symbols-dummy.c 2006-10-04 08:49:30.000000000 > +0200 > +++ 2009-06-10/xen/common/symbols-dummy.c 2009-06-30 16:55:43.000000000 +0200 > @@ -6,11 +6,15 @@ > #include <xen/config.h> > #include <xen/types.h> > > -unsigned long symbols_addresses[1]; > -unsigned long symbols_num_syms; > -u8 symbols_names[1]; > +#ifdef SYMBOLS_ORIGIN > +const unsigned int symbols_offsets[1]; > +#else > +const unsigned long symbols_addresses[1]; > +#endif > +const unsigned int symbols_num_syms; > +const u8 symbols_names[1]; > > -u8 symbols_token_table[1]; > -u16 symbols_token_index[1]; > +const u8 symbols_token_table[1]; > +const u16 symbols_token_index[1]; > > -unsigned long symbols_markers[1]; > +const unsigned int symbols_markers[1]; > --- 2009-06-10.orig/xen/include/asm-x86/config.h 2009-06-10 15:09:22.000000000 > +0200 > +++ 2009-06-10/xen/include/asm-x86/config.h 2009-06-30 16:52:22.000000000 > +0200 > @@ -259,6 +259,8 @@ extern unsigned int video_mode, video_fl > #define __HYPERVISOR_DS32 0xe010 > #define __HYPERVISOR_DS __HYPERVISOR_DS64 > > +#define SYMBOLS_ORIGIN XEN_VIRT_START > + > /* For generic assembly code: use macros to define operation/operand sizes. > */ > #define __OS "q" /* Operation Suffix */ > #define __OP "r" /* Operand Prefix */ > --- 2009-06-10.orig/xen/tools/symbols.c 2008-12-03 10:55:25.000000000 +0100 > +++ 2009-06-10/xen/tools/symbols.c 2009-07-01 09:53:36.000000000 +0200 > @@ -108,10 +108,7 @@ static int read_symbol(FILE *in, struct > else if (toupper((uint8_t)stype) == ''A'') > { > /* Keep these useful absolute symbols */ > - if (strcmp(sym, "__kernel_syscall_via_break") && > - strcmp(sym, "__kernel_syscall_via_epc") && > - strcmp(sym, "__kernel_sigtramp") && > - strcmp(sym, "__gp")) > + if (strcmp(sym, "__gp")) > return -1; > > } > @@ -135,18 +132,9 @@ static int read_symbol(FILE *in, struct > static int symbol_valid(struct sym_entry *s) > { > /* Symbols which vary between passes. Passes 1 and 2 must have > - * identical symbol lists. The symbols_* symbols below are only added > - * after pass 1, they would be included in pass 2 when --all-symbols is > - * specified so exclude them to get a stable symbol list. > + * identical symbol lists. > */ > static char *special_symbols[] = { > - "symbols_addresses", > - "symbols_num_syms", > - "symbols_names", > - "symbols_markers", > - "symbols_token_table", > - "symbols_token_index", > - > /* Exclude linker generated symbols which vary between passes */ > "_SDA_BASE_", /* ppc */ > "_SDA2_BASE_", /* ppc */ > @@ -251,8 +239,9 @@ static void write_src(void) > unsigned int *markers; > char buf[KSYM_NAME_LEN+1]; > > + printf("#include <xen/config.h>\n"); > printf("#include <asm/types.h>\n"); > - printf("#if BITS_PER_LONG == 64\n"); > + printf("#if BITS_PER_LONG == 64 && !defined(SYMBOLS_ORIGIN)\n"); > printf("#define PTR .quad\n"); > printf("#define ALGN .align 8\n"); > printf("#else\n"); > @@ -260,16 +249,21 @@ static void write_src(void) > printf("#define ALGN .align 4\n"); > printf("#endif\n"); > > - printf(".data\n"); > + printf("\t.section .rodata, \"a\"\n"); > > + printf("#ifndef SYMBOLS_ORIGIN\n"); > + printf("#define SYMBOLS_ORIGIN 0\n"); > output_label("symbols_addresses"); > + printf("#else\n"); > + output_label("symbols_offsets"); > + printf("#endif\n"); > for (i = 0; i < table_cnt; i++) { > - printf("\tPTR\t%#llx\n", table[i].addr); > + printf("\tPTR\t%#llx - SYMBOLS_ORIGIN\n", table[i].addr); > } > printf("\n"); > > output_label("symbols_num_syms"); > - printf("\tPTR\t%d\n", table_cnt); > + printf("\t.long\t%d\n", table_cnt); > printf("\n"); > > /* table of offset markers, that give the offset in the compressed stream > @@ -293,7 +287,7 @@ static void write_src(void) > > output_label("symbols_markers"); > for (i = 0; i < ((table_cnt + 255) >> 8); i++) > - printf("\tPTR\t%d\n", markers[i]); > + printf("\t.long\t%d\n", markers[i]); > printf("\n"); > > free(markers); > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2009-Jul-13 10:51 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
>>> Keir Fraser <keir.fraser@eu.citrix.com> 13.07.09 12:28 >>> >This doesn''t build for me. Build host is Debian Etch running gcc 4.1.2 and >binutils 2.17. Error snippet is attached -- it complains like this for every >PTR line in .xen-syms.0.S.Hmm, odd: I''m using binutils 2.16.91.<something> (gcc is 4.1.2 for me too). Could you attach your .xen-syms.0.S plus (ideally) also the pre-processed .xen-syms.0.s? (The warning and error at the end of your output also look bogus, as much as does them all getting reported against the same line.) Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2009-Jul-13 11:29 UTC
Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
>>> Keir Fraser <keir.fraser@eu.citrix.com> 13.07.09 13:09 >>> >On 13/07/2009 11:51, "Jan Beulich" <JBeulich@novell.com> wrote: > >>>>> Keir Fraser <keir.fraser@eu.citrix.com> 13.07.09 12:28 >>> >>> This doesn''t build for me. Build host is Debian Etch running gcc 4.1.2 and >>> binutils 2.17. Error snippet is attached -- it complains like this for every >>> PTR line in .xen-syms.0.S. >> >> Hmm, odd: I''m using binutils 2.16.91.<something> (gcc is 4.1.2 for me too). >> Could you attach your .xen-syms.0.S plus (ideally) also the pre-processed >> .xen-syms.0.s? (The warning and error at the end of your output also look >> bogus, as much as does them all getting reported against the same line.) > >Attached. Silly suffix names are because MacOS doesn''t seem to have >case-sensitive filename suffixes.That makes it obvious: I have another local patch that abstracts the ...<<30 operations in config.h to be asm-compatible, and thus things built fine for me. I''ll send an updated patch as soon as I sorted out which bits need moving over. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel