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

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

To: Jan Beulich <JBeulich@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size
From: Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
Date: Mon, 13 Jul 2009 11:28:05 +0100
Cc: "xen-ia64-devel@xxxxxxxxxxxxxxxxxxx" <xen-ia64-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Mon, 13 Jul 2009 03:28:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4A576BB60200007800009E62@xxxxxxxxxxxxxxxxxx>
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
Thread-index: AcoBan+awbs1Dzy2StC+M4jZbhRkLACOhvIX
Thread-topic: [Xen-devel] [PATCH] x86-64: reduce symbol table size
User-agent: Microsoft-Entourage/12.19.0.090515
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@xxxxxxxxxx> 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@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

Attachment: error.txt
Description: Binary data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel