WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] x86-64: reduce symbol table size

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] x86-64: reduce symbol table size
From: "Jan Beulich" <JBeulich@xxxxxxxxxx>
Date: Fri, 10 Jul 2009 15:26:30 +0100
Cc: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Fri, 10 Jul 2009 07:27:05 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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@xxxxxxxxxx>

--- 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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel