[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Move cpu0_stack out of Xen text section and into BSS. This



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID b21be984945a8b11698dc66ef6dde8a5babdf18f
# Parent  a9c35cd7e55943176d41882a2234f03ae9f3818e
Move cpu0_stack out of Xen text section and into BSS. This
avoids getting loads of bogus cpu0_stack lines in call
backtraces from non-debug builds.

Doing this requires greater alignment of the BSS section,
which reveals a bug in ld where the alignment padding is
not added to the program segment's memsz field. We get around
this by finding the address of the last symbol in the image,
and increasing our load image's memsz to include that symbol.

Also some cleanups to the linker scripts.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile     Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/Makefile     Fri Dec  2 17:00:49 2005
@@ -37,7 +37,8 @@
 default: $(TARGET)
 
 $(TARGET): $(TARGET)-syms boot/mkelf32
-       ./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000
+       ./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000 \
+       `nm $(TARGET)-syms | sort | tail -n 1 | sed -e 's/^\([^ ]*\).*/0x\1/'`
 
 $(CURDIR)/arch.o: $(OBJS)
        $(LD) $(LDFLAGS) -r -o $@ $(OBJS)
diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/boot/mkelf32.c
--- a/xen/arch/x86/boot/mkelf32.c       Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/boot/mkelf32.c       Fri Dec  2 17:00:49 2005
@@ -222,6 +222,7 @@
 
 int main(int argc, char **argv)
 {
+    u64        final_exec_addr;
     u32        loadbase, dat_siz, mem_siz;
     char      *inimage, *outimage;
     int        infd, outfd;
@@ -234,15 +235,17 @@
     Elf64_Ehdr in64_ehdr;
     Elf64_Phdr in64_phdr;
 
-    if ( argc != 4 )
-    {
-        fprintf(stderr, "Usage: mkelf32 <in-image> <out-image> <load-base>\n");
+    if ( argc != 5 )
+    {
+        fprintf(stderr, "Usage: mkelf32 <in-image> <out-image> "
+                "<load-base> <final-exec-addr>\n");
         return 1;
     }
 
     inimage  = argv[1];
     outimage = argv[2];
     loadbase = strtoul(argv[3], NULL, 16);
+    final_exec_addr = strtoul(argv[4], NULL, 16);
 
     infd = open(inimage, O_RDONLY);
     if ( infd == -1 )
@@ -286,7 +289,10 @@
 
         (void)lseek(infd, in32_phdr.p_offset, SEEK_SET);
         dat_siz = (u32)in32_phdr.p_filesz;
-        mem_siz = (u32)in32_phdr.p_memsz;
+
+        /* Do not use p_memsz: it does not include BSS alignment padding. */
+        /*mem_siz = (u32)in32_phdr.p_memsz;*/
+        mem_siz = (u32)(final_exec_addr - in32_phdr.p_vaddr);
         break;
 
     case ELFCLASS64:
@@ -314,7 +320,10 @@
 
         (void)lseek(infd, in64_phdr.p_offset, SEEK_SET);
         dat_siz = (u32)in64_phdr.p_filesz;
-        mem_siz = (u32)in64_phdr.p_memsz;
+
+        /* Do not use p_memsz: it does not include BSS alignment padding. */
+        /*mem_siz = (u32)in64_phdr.p_memsz;*/
+        mem_siz = (u32)(final_exec_addr - in64_phdr.p_vaddr);
         break;
 
     default:
diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/boot/x86_32.S
--- a/xen/arch/x86/boot/x86_32.S        Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/boot/x86_32.S        Fri Dec  2 17:00:49 2005
@@ -74,16 +74,16 @@
         cmp     $0x2BADB002,%eax
         jne     not_multiboot
 
-        /* Save the Multiboot info structure for later use. */
-       add     $__PAGE_OFFSET,%ebx
-        push    %ebx
-
         /* Initialize BSS (no nasty surprises!) */
         mov     $__bss_start-__PAGE_OFFSET,%edi
         mov     $_end-__PAGE_OFFSET,%ecx
         sub     %edi,%ecx
         xor     %eax,%eax
         rep     stosb
+
+        /* Save the Multiboot info structure for later use. */
+        add     $__PAGE_OFFSET,%ebx
+        push    %ebx
 
 #ifdef CONFIG_X86_PAE
         /* Initialize low and high mappings of all memory with 2MB pages */
@@ -238,27 +238,28 @@
         .fill 2*NR_CPUS,8,0          /* space for TSS and LDT per CPU    */
 
         .org 0x2000
-/* Maximum STACK_ORDER for x86/32 is 1. We must therefore ensure that the */
-/* CPU0 stack is aligned on an even page boundary!                        */
-ENTRY(cpu0_stack)
-        .org 0x2000 + STACK_SIZE
-
-#ifdef CONFIG_X86_PAE
-
+
+#ifdef CONFIG_X86_PAE
 ENTRY(idle_pg_table)
 ENTRY(idle_pg_table_l3)
         .quad 0x100000 + 0x2000 + STACK_SIZE + 1*PAGE_SIZE + 0x01
         .quad 0x100000 + 0x2000 + STACK_SIZE + 2*PAGE_SIZE + 0x01
         .quad 0x100000 + 0x2000 + STACK_SIZE + 3*PAGE_SIZE + 0x01
         .quad 0x100000 + 0x2000 + STACK_SIZE + 4*PAGE_SIZE + 0x01
-        .org 0x2000 + STACK_SIZE + 1*PAGE_SIZE
+.section ".bss.page_aligned","w"
 ENTRY(idle_pg_table_l2)
-        .org 0x2000 + STACK_SIZE + 5*PAGE_SIZE
-
-#else /* CONFIG_X86_PAE */
-
+        .fill 4*PAGE_SIZE,1,0
+#else
+.section ".bss.page_aligned","w"
 ENTRY(idle_pg_table)
-ENTRY(idle_pg_table_l2) # Initial page directory is 4kB
-        .org 0x2000 + STACK_SIZE + PAGE_SIZE
-
-#endif /* CONFIG_X86_PAE */
+ENTRY(idle_pg_table_l2)
+        .fill 1*PAGE_SIZE,1,0
+#endif
+
+#if (STACK_ORDER == 0)
+.section ".bss.page_aligned","w"
+#else
+.section ".bss.twopage_aligned","w"
+#endif
+ENTRY(cpu0_stack)
+        .fill STACK_SIZE,1,0
diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/boot/x86_64.S
--- a/xen/arch/x86/boot/x86_64.S        Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/boot/x86_64.S        Fri Dec  2 17:00:49 2005
@@ -249,13 +249,8 @@
 ENTRY(idle_pg_table_l3)
         .quad idle_pg_table_l2 - __PAGE_OFFSET + 7
 
+/* Initial PDE -- level-2 page table. Maps first 64MB physical memory. */
         .org 0x4000
-/* Maximum STACK_ORDER for x86/64 is 2. We must therefore ensure that the */
-/* CPU0 stack is aligned on a 4-page boundary.                            */
-ENTRY(cpu0_stack)
-
-/* Initial PDE -- level-2 page table. Maps first 64MB physical memory. */
-        .org 0x4000 + STACK_SIZE
 ENTRY(idle_pg_table_l2)
         .macro identmap from=0, count=32
         .if \count-1
@@ -265,7 +260,15 @@
         .quad 0x00000000000001e3 + \from
         .endif
         .endm
-        identmap /* Too orangey for crows :-) */
-
-        .org 0x4000 + STACK_SIZE + PAGE_SIZE
+        identmap
+
+        .org 0x4000 + PAGE_SIZE
         .code64
+
+#if (STACK_ORDER == 0)
+.section ".bss.page_aligned","w"
+#else
+.section ".bss.twopage_aligned","w"
+#endif
+ENTRY(cpu0_stack)
+        .fill STACK_SIZE,1,0
diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/x86_32/xen.lds
--- a/xen/arch/x86/x86_32/xen.lds       Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/x86_32/xen.lds       Fri Dec  2 17:00:49 2005
@@ -23,7 +23,6 @@
   _etext = .;                  /* End of text section */
 
   .rodata : { *(.rodata) *(.rodata.*) } :text
-  .kstrtab : { *(.kstrtab) } :text
 
   . = ALIGN(32);               /* Exception table */
   __start___ex_table = .;
@@ -35,23 +34,10 @@
   __pre_ex_table : { *(__pre_ex_table) } :text
   __stop___pre_ex_table = .;
 
-  __start___ksymtab = .;       /* Kernel symbol table */
-  __ksymtab : { *(__ksymtab) } :text
-  __stop___ksymtab = .;
-
-  __start___kallsyms = .;      /* All kernel symbols */
-  __kallsyms : { *(__kallsyms) } :text
-  __stop___kallsyms = .;
-
   .data : {                    /* Data */
        *(.data)
        CONSTRUCTORS
        } :text
-
-  _edata = .;                  /* End of data section */
-
-  . = ALIGN(8192);             /* init_task */
-  .data.init_task : { *(.data.init_task) } :text
 
   . = ALIGN(4096);             /* Init code and data */
   __init_begin = .;
@@ -64,10 +50,13 @@
   __initcall_start = .;
   .initcall.init : { *(.initcall.init) } :text
   __initcall_end = .;
+  . = ALIGN(8192);
   __init_end = .;
 
   __bss_start = .;             /* BSS */
   .bss : {
+       *(.bss.twopage_aligned)
+       *(.bss.page_aligned)
        *(.bss)
        } :text
   _end = . ;
diff -r a9c35cd7e559 -r b21be984945a xen/arch/x86/x86_64/xen.lds
--- a/xen/arch/x86/x86_64/xen.lds       Fri Dec  2 15:52:47 2005
+++ b/xen/arch/x86/x86_64/xen.lds       Fri Dec  2 17:00:49 2005
@@ -21,7 +21,6 @@
   _etext = .;                  /* End of text section */
 
   .rodata : { *(.rodata) *(.rodata.*) } :text
-  .kstrtab : { *(.kstrtab) } :text
 
   . = ALIGN(32);               /* Exception table */
   __start___ex_table = .;
@@ -33,23 +32,10 @@
   __pre_ex_table : { *(__pre_ex_table) } :text
   __stop___pre_ex_table = .;
 
-  __start___ksymtab = .;       /* Kernel symbol table */
-  __ksymtab : { *(__ksymtab) } :text
-  __stop___ksymtab = .;
-
-  __start___kallsyms = .;      /* All kernel symbols */
-  __kallsyms : { *(__kallsyms) } :text
-  __stop___kallsyms = .;
-
   .data : {                    /* Data */
        *(.data)
        CONSTRUCTORS
        } :text
-
-  _edata = .;                  /* End of data section */
-
-  . = ALIGN(8192);             /* init_task */
-  .data.init_task : { *(.data.init_task) } :text
 
   . = ALIGN(4096);             /* Init code and data */
   __init_begin = .;
@@ -62,10 +48,13 @@
   __initcall_start = .;
   .initcall.init : { *(.initcall.init) } :text
   __initcall_end = .;
+  . = ALIGN(8192);
   __init_end = .;
 
   __bss_start = .;             /* BSS */
   .bss : {
+       *(.bss.twopage_aligned)
+       *(.bss.page_aligned)
        *(.bss)
        } :text
   _end = . ;

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.