Jan Beulich
2009-Jul-13  12:08 UTC
[Xen-devel] [PATCH, v2] x86-64: reduce symbol table size
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-07-10.orig/xen/common/symbols.c	2009-07-13 13:56:07.000000000 +0200
+++ 2009-07-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-07-10.orig/xen/common/symbols-dummy.c	2009-07-13 13:56:07.000000000
+0200
+++ 2009-07-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-07-10.orig/xen/include/asm-x86/config.h	2009-07-13 13:56:07.000000000
+0200
+++ 2009-07-10/xen/include/asm-x86/config.h	2009-07-13 14:01:35.000000000 +0200
@@ -122,10 +122,12 @@ extern unsigned int video_mode, video_fl
 #define PML4_ADDR(_slot)                             \
     ((((_slot ## UL) >> 8) * 0xffff000000000000UL) | \
      (_slot ## UL << PML4_ENTRY_BITS))
+#define GB(_gb) (_gb ## UL << 30)
 #else
 #define PML4_ENTRY_BYTES (1 << PML4_ENTRY_BITS)
 #define PML4_ADDR(_slot)                             \
     (((_slot >> 8) * 0xffff000000000000) | (_slot <<
PML4_ENTRY_BITS))
+#define GB(_gb) (_gb << 30)
 #endif
 
 /*
@@ -210,22 +212,22 @@ extern unsigned int video_mode, video_fl
 #define PERDOMAIN_MBYTES        (PML4_ENTRY_BYTES >> (20 +
PAGETABLE_ORDER))
 /* Slot 261: machine-to-phys conversion table (16GB). */
 #define RDWR_MPT_VIRT_START     (PML4_ADDR(261))
-#define RDWR_MPT_VIRT_END       (RDWR_MPT_VIRT_START + (16UL<<30))
+#define RDWR_MPT_VIRT_END       (RDWR_MPT_VIRT_START + GB(16))
 /* Slot 261: page-frame information array (16GB). */
 #define FRAMETABLE_VIRT_START   (RDWR_MPT_VIRT_END)
-#define FRAMETABLE_VIRT_END     (FRAMETABLE_VIRT_START + (16UL<<30))
+#define FRAMETABLE_VIRT_END     (FRAMETABLE_VIRT_START + GB(16))
 /* Slot 261: ioremap()/fixmap area (16GB). */
 #define IOREMAP_VIRT_START      (FRAMETABLE_VIRT_END)
-#define IOREMAP_VIRT_END        (IOREMAP_VIRT_START + (16UL<<30))
+#define IOREMAP_VIRT_END        (IOREMAP_VIRT_START + GB(16))
 /* Slot 261: compatibility machine-to-phys conversion table (1GB). */
 #define RDWR_COMPAT_MPT_VIRT_START IOREMAP_VIRT_END
-#define RDWR_COMPAT_MPT_VIRT_END (RDWR_COMPAT_MPT_VIRT_START + (1UL <<
30))
+#define RDWR_COMPAT_MPT_VIRT_END (RDWR_COMPAT_MPT_VIRT_START + GB(1))
 /* Slot 261: high read-only compat machine-to-phys conversion table (1GB). */
 #define HIRO_COMPAT_MPT_VIRT_START RDWR_COMPAT_MPT_VIRT_END
-#define HIRO_COMPAT_MPT_VIRT_END (HIRO_COMPAT_MPT_VIRT_START + (1UL <<
30))
+#define HIRO_COMPAT_MPT_VIRT_END (HIRO_COMPAT_MPT_VIRT_START + GB(1))
 /* Slot 261: xen text, static data and bss (1GB). */
 #define XEN_VIRT_START          (HIRO_COMPAT_MPT_VIRT_END)
-#define XEN_VIRT_END            (XEN_VIRT_START + (1UL << 30))
+#define XEN_VIRT_END            (XEN_VIRT_START + GB(1))
 /* Slot 262-263: A direct 1:1 mapping of all of physical memory. */
 #define DIRECTMAP_VIRT_START    (PML4_ADDR(262))
 #define DIRECTMAP_VIRT_END      (DIRECTMAP_VIRT_START + PML4_ENTRY_BYTES*2)
@@ -259,6 +261,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-07-10.orig/xen/tools/symbols.c	2009-07-13 13:56:07.000000000 +0200
+++ 2009-07-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
Apparently Analagous Threads
- Bug#802870: xen: FTBFS: error: array subscript is above array bounds
- Bug#793132: xen: FTBFS with glibc 2.21 and gcc-5
- [PATCH] the address of ''symbols_addresses'' will always evaluate as ''true''
- [PATCH] x86: use single definitions for a few constants
- Experimental R_has_slot() utility
