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-changelog

[Xen-changelog] [xen-unstable] x86-64: reduce symbol table size

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86-64: reduce symbol table size
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 15 Jul 2009 05:35:09 -0700
Delivery-date: Wed, 15 Jul 2009 05:35:47 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1247500190 -3600
# Node ID 75e63b73075a7bb89db61219dd6cdd91b423ea2f
# Parent  c0cb307d927f7c9cd64a726c3e2124c4c1d7c970
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@xxxxxxxxxx>
---
 xen/common/symbols-dummy.c   |   16 +++++++++-----
 xen/common/symbols.c         |   34 ++++++++++++++++++-------------
 xen/include/asm-x86/config.h |   16 +++++++++-----
 xen/tools/symbols.c          |   47 ++++++++++++-------------------------------
 4 files changed, 54 insertions(+), 59 deletions(-)

diff -r c0cb307d927f -r 75e63b73075a xen/common/symbols-dummy.c
--- a/xen/common/symbols-dummy.c        Mon Jul 13 12:35:34 2009 +0100
+++ b/xen/common/symbols-dummy.c        Mon Jul 13 16:49:50 2009 +0100
@@ -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];
diff -r c0cb307d927f -r 75e63b73075a xen/common/symbols.c
--- a/xen/common/symbols.c      Mon Jul 13 12:35:34 2009 +0100
+++ b/xen/common/symbols.c      Mon Jul 13 16:49:50 2009 +0100
@@ -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;
 }
 
diff -r c0cb307d927f -r 75e63b73075a xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h      Mon Jul 13 12:35:34 2009 +0100
+++ b/xen/include/asm-x86/config.h      Mon Jul 13 16:49:50 2009 +0100
@@ -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)
@@ -258,6 +260,8 @@ extern unsigned int video_mode, video_fl
 #define __HYPERVISOR_DS64 0x0000
 #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 */
diff -r c0cb307d927f -r 75e63b73075a xen/tools/symbols.c
--- a/xen/tools/symbols.c       Mon Jul 13 12:35:34 2009 +0100
+++ b/xen/tools/symbols.c       Mon Jul 13 16:49:50 2009 +0100
@@ -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;
 
        }
@@ -134,24 +131,6 @@ 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.
-        */
-       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 */
-               NULL };
-       int i;
        int offset = 1;
 
        /* skip prefix char */
@@ -181,10 +160,6 @@ static int symbol_valid(struct sym_entry
        if (strstr((char *)s->sym + offset, "_compiled."))
                return 0;
 
-       for (i = 0; special_symbols[i]; i++)
-               if( strcmp((char *)s->sym + offset, special_symbols[i]) == 0 )
-                       return 0;
-
        return 1;
 }
 
@@ -251,8 +226,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 +236,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");
-       for (i = 0; i < table_cnt; i++) {
-               printf("\tPTR\t%#llx\n", table[i].addr);
+       printf("#else\n");
+       output_label("symbols_offsets");
+       printf("#endif\n");
+       for (i = 0; i < table_cnt; i++) {
+               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 +274,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-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86-64: reduce symbol table size, Xen patchbot-unstable <=