# HG changeset patch
# User Jimi Xenidis <[EMAIL PROTECTED]>
# Node ID c759c733f77d5edaa21620f37206521399842023
# Parent  6a86727a3afe85751d916700c1c6db2c75e7bd27
[XEN][POWERPC] Update linker symbols and scripts

The following patch:
  - updates linker symbols and interfaces that use them
  - clean up of dynamically registered PAPR hcalls
  - Way simpler linker script

Signed-off-by: Jimi Xenidis <[EMAIL PROTECTED]>
---
 xen/arch/powerpc/Makefile        |    2 
 xen/arch/powerpc/boot_of.c       |    4 
 xen/arch/powerpc/hcalls.c        |    6 -
 xen/arch/powerpc/of-devtree.h    |    3 
 xen/arch/powerpc/xen.lds.S       |  206 ++++++++++-----------------------------
 xen/include/asm-powerpc/config.h |    5 
 xen/include/asm-powerpc/init.h   |   10 -
 7 files changed, 72 insertions(+), 164 deletions(-)

diff -r 6a86727a3afe -r c759c733f77d xen/arch/powerpc/Makefile
--- a/xen/arch/powerpc/Makefile Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/arch/powerpc/Makefile Wed Jan 17 14:12:08 2007 -0500
@@ -64,7 +64,7 @@ CFLAGS += $(PPC_C_WARNINGS)
 # objects into a single ELF segment and to not link in any additional
 # objects that gcc would normally like to
 #
-OMAGIC = -N -nodefaultlibs -nostartfiles
+OMAGIC = -nodefaultlibs -nostartfiles
 
 firmware: of_handler/built_in.o $(TARGET_SUBARCH)/memcpy.o of-devtree.o
        $(CC) $(CFLAGS) $(OMAGIC) -e __ofh_start -Wl,-Ttext,0x0 $^ -o $@
diff -r 6a86727a3afe -r c759c733f77d xen/arch/powerpc/boot_of.c
--- a/xen/arch/powerpc/boot_of.c        Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/arch/powerpc/boot_of.c        Wed Jan 17 14:12:08 2007 -0500
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005, 2006
+ * Copyright IBM Corp. 2005, 2006, 2007
  *
  * Authors: Jimi Xenidis <[EMAIL PROTECTED]>
  *          Hollis Blanchard <[EMAIL PROTECTED]>
@@ -1303,7 +1303,7 @@ multiboot_info_t __init *boot_of_init(
             __func__,
             r3, r4, vec, r6, r7, orig_msr);
 
-    if ((vec >= (ulong)_start) && (vec <= (ulong)_end)) {
+    if (is_kernel(vec)) {
         of_panic("Hmm.. OF[0x%lx] seems to have stepped on our image "
                 "that ranges: %p .. %p.\n",
                 vec, _start, _end);
diff -r 6a86727a3afe -r c759c733f77d xen/arch/powerpc/hcalls.c
--- a/xen/arch/powerpc/hcalls.c Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/arch/powerpc/hcalls.c Wed Jan 17 14:12:08 2007 -0500
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005
+ * Copyright IBM Corp. 2005, 2006, 2007
  *
  * Authors: Hollis Blanchard <[EMAIL PROTECTED]>
  */
@@ -130,7 +130,7 @@ static void register_papr_hcall(ulong nu
 
 static void init_papr_hcalls(void)
 {
-    inithcall_t *hcall;
+    init_hcall_t *hcall;
     int i;
 
     /* initialize PAPR hcall table */
@@ -140,7 +140,7 @@ static void init_papr_hcalls(void)
         register_papr_hcall(i, do_ni_papr_hypercall);
 
     /* register the PAPR hcalls */
-    for (hcall = &__inithcall_start; hcall < &__inithcall_end; hcall++) {
+    for (hcall = &__init_hcall_start; hcall < &__init_hcall_end; hcall++) {
         register_papr_hcall(hcall->number, hcall->handler);
     }
 }
diff -r 6a86727a3afe -r c759c733f77d xen/arch/powerpc/of-devtree.h
--- a/xen/arch/powerpc/of-devtree.h     Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/arch/powerpc/of-devtree.h     Wed Jan 17 14:12:08 2007 -0500
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005
+ * Copyright IBM Corp. 2005, 2006, 2007
  *
  * Authors: Jimi Xenidis <[EMAIL PROTECTED]>
  */
@@ -23,6 +23,7 @@
 
 #include <xen/types.h>
 #include <xen/string.h>
+#include <xen/kernel.h>
 #include <public/xen.h>
 
 enum {
diff -r 6a86727a3afe -r c759c733f77d xen/arch/powerpc/xen.lds.S
--- a/xen/arch/powerpc/xen.lds.S        Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/arch/powerpc/xen.lds.S        Wed Jan 17 14:12:08 2007 -0500
@@ -7,202 +7,112 @@ OUTPUT_FORMAT("elf64-powerpc", "elf64-po
              "elf64-powerpc")
 OUTPUT_ARCH(powerpc:common64)
 ENTRY(_start)
-SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); 
SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); 
SEARCH_DIR("=/usr/lib");
-/* Do we need any of these for elf?
-   __DYNAMIC = 0;    */
 PHDRS
 {
   text PT_LOAD;
 }   
 SECTIONS
 {
+  /* This is the address that we are linking at */     
   . = 0x00400000;
   PROVIDE(_text = .);
+  PROVIDE(_stext = .);
   /* Read-only sections, merged into text segment: */
-  .interp         : { *(.interp) } :text
-  .hash           : { *(.hash) }
-  .dynsym         : { *(.dynsym) }
-  .dynstr         : { *(.dynstr) }
-  .gnu.version    : { *(.gnu.version) }
-  .gnu.version_d  : { *(.gnu.version_d) }
-  .gnu.version_r  : { *(.gnu.version_r) }
-  .rel.dyn        :
-    {
-      *(.rel.init)
-      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
-      *(.rel.fini)
-      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
-      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
-      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
-      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
-      *(.rel.ctors)
-      *(.rel.dtors)
-      *(.rel.got)
-      *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
-      *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
-      *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
-      *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
-      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
-    }
-  .rela.dyn       :
-    {
-      *(.rela.init)
-      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
-      *(.rela.fini)
-      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
-      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
-      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
-      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
-      *(.rela.ctors)
-      *(.rela.dtors)
-      *(.rela.got)
-      *(.rela.toc)
-      *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
-      *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
-      *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
-      *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
-      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
-    }
-  .rel.plt        : { *(.rel.plt) }
-  .rela.plt       : { *(.rela.plt) }
-  .rela.tocbss   : { *(.rela.tocbss) }
-  .init           :
-  {
-    KEEP (*(.init))
-  } =0x60000000
   .text           :
   {
-    *(.text .stub .text.* .gnu.linkonce.t.*)
+    *(.text)
     /* .gnu.warning sections are handled specially by elf32.em.  */
     *(.gnu.warning)
-    *(.sfpr .glink)
-  } =0x60000000
-  .fini           :
-  {
-    KEEP (*(.fini))
-  } =0x60000000
+  } : text
+  /* end of text */
   PROVIDE (__etext = .);
   PROVIDE (_etext = .);
   PROVIDE (etext = .);
-  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
-  .rodata1        : { *(.rodata1) }
-  .sdata2         : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) }
-  .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
-  .eh_frame_hdr : { *(.eh_frame_hdr) }
-  /* Adjust the address for the data segment.  We want to adjust up to
-     the same address within the page on the next page up.  */
-  . = ALIGN (0x10000) - ((0x10000 - .) & (0x10000 - 1)); . = 
DATA_SEGMENT_ALIGN (0x10000, 0x1000);
-  /* Ensure the __preinit_array_start label is properly aligned.  We
-     could instead move the label definition inside the section, but
-     the linker would then create the section even if it turns out to
-     be empty, which isn't pretty.  */
-  . = ALIGN(64 / 8);
-  PROVIDE (__preinit_array_start = .);
-  .preinit_array     : { *(.preinit_array) }
-  PROVIDE (__preinit_array_end = .);
-  PROVIDE (__init_array_start = .);
-  .init_array     : { *(.init_array) }
-  PROVIDE (__init_array_end = .);
-  PROVIDE (__fini_array_start = .);
-  .fini_array     : { *(.fini_array) }
-  PROVIDE (__fini_array_end = .);
+
+  /* read only data */
+  .rodata         : { *(.rodata .rodata.*) } : text
+  .rodata1        : { *(.rodata1) } : text
+  .sdata2         : { *(.sdata2 .sdata2.*) } : text
+  .sbss2          : { *(.sbss2 .sbss2.*) } : text
+
+  . = ALIGN(64);
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) } : text
+  __stop___ex_table = .;
+  . = ALIGN(64);
+
   .data           :
   {
     *(.data .gnu.linkonce.d.*)
     SORT(CONSTRUCTORS)
-  }
-
-  . = ALIGN(32);
-  __setup_start = .;
-  .init.setup : { *(.init.setup) }
-  __setup_end = .;
-  __initcall_start = .;
-  .initcall.init : { *(.initcall1.init) }
-  __initcall_end = .;
-  __inithcall_start = .;
-  .inithcall.text : { *(.inithcall.text) }
-  __inithcall_end = .;
-
-  __per_cpu_start = .;
-  .data.percpu : { *(.data.percpu) }
-  __per_cpu_data_end = .;
-  . = __per_cpu_start + (NR_CPUS << PERCPU_SHIFT);
-  . = ALIGN(STACK_SIZE);
-  __per_cpu_end = .;
-
-  .data1          : { *(.data1) }
-  .tdata         : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
-  .tbss                  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
-  .eh_frame       : { KEEP (*(.eh_frame)) }
-  .gcc_except_table   : { *(.gcc_except_table) }
-  .toc1                 ALIGN(8) : { *(.toc1) }
-  .opd          ALIGN(8) : { KEEP (*(.opd)) }
-  .dynamic        : { *(.dynamic) }
-  .ctors          :
-  {
-    /* gcc uses crtbegin.o to find the start of
-       the constructors, so we make sure it is
-       first.  Because this is a wildcard, it
-       doesn't matter if the user does not
-       actually link against crtbegin.o; the
-       linker won't look for a file to match a
-       wildcard.  The wildcard also means that it
-       doesn't matter which directory crtbegin.o
-       is in.  */
-    KEEP (*crtbegin*.o(.ctors))
-    /* We don't want to include the .ctor section from
-       from the crtend.o file until after the sorted ctors.
-       The .ctor section from the crtend file contains the
-       end of ctors marker and it must be last */
-    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
-    KEEP (*(SORT(.ctors.*)))
-    KEEP (*(.ctors))
-  }
-  .dtors          :
-  {
-    KEEP (*crtbegin*.o(.dtors))
-    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
-    KEEP (*(SORT(.dtors.*)))
-    KEEP (*(.dtors))
-  }
-  .jcr            : { KEEP (*(.jcr)) }
-  .got         ALIGN(8) : { *(.got .toc) }
+  } : text
+  .data1          : { *(.data1) } : text
+  .tdata         : { *(.tdata .tdata.* .gnu.linkonce.td.*) } : text
+  .tbss                  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } 
: text
+  .toc1                 ALIGN(8) : { *(.toc1) } : text
+  .opd          ALIGN(8) : { KEEP (*(.opd)) } : text
+  .got         ALIGN(8) : { *(.got .toc) } : text
   /* We want the small data sections together, so single-instruction offsets
      can access them all, and initialized data all before uninitialized, so
      we can shorten the on-disk segment size.  */
   .sdata          :
   {
     *(.sdata .sdata.* .gnu.linkonce.s.*)
-  }
+  } : text
   _edata = .;
   PROVIDE (edata = .);
+
+  . = ALIGN(4096);             /* Init code and data */
+  __init_begin = .;
+  _sinittext = .;
+  .init.text : { *(.init.text) } : text
+  _einittext = .;
+  .init.data : { *(.init.data) } : text
+  . = ALIGN(32);
+  __setup_start = .;
+  .init.setup : { *(.init.setup) } : text
+  __setup_end = .;
+  __initcall_start = .;
+  .initcall.init : { *(.initcall1.init) } : text
+  __initcall_end = .;
+  __init_hcall_start = .;
+  .init_hcall.init : { *(.init_hcall.init) } : text
+  __init_hcall_end = .;
+  __builtin_cmdline : { *(__builtin_cmdline) } : text
+  . = ALIGN(4096);
+  __init_end = .;
+       
+  __per_cpu_start = .;
+  .data.percpu : { *(.data.percpu) } :text
+  __per_cpu_data_end = .;
+  . = __per_cpu_start + (NR_CPUS << PERCPU_SHIFT);
+  . = ALIGN(STACK_SIZE);
+  __per_cpu_end = .;
+       
   __bss_start = .;
-  .tocbss       ALIGN(8) : { *(.tocbss)}
+  .tocbss       ALIGN(8) : { *(.tocbss) } : text
   .sbss           :
   {
     PROVIDE (__sbss_start = .);
     PROVIDE (___sbss_start = .);
-    *(.dynsbss)
     *(.sbss .sbss.* .gnu.linkonce.sb.*)
     *(.scommon)
     PROVIDE (__sbss_end = .);
     PROVIDE (___sbss_end = .);
-  }
-  .plt            : { *(.plt) }
+  } : text
   .bss            :
   {
-   *(.dynbss)
    *(.bss .bss.* .gnu.linkonce.b.*)
    *(COMMON)
    /* Align here to ensure that the .bss section occupies space up to
       _end.  Align after .bss to ensure correct alignment even if the
       .bss section disappears because there are no input sections.  */
    . = ALIGN(64 / 8);
-  }
+  } : text
   . = ALIGN(64 / 8);
   _end = .;
   PROVIDE (end = .);
-  . = DATA_SEGMENT_END (.);
+
   /* Stabs debugging sections.  */
   .stab          0 : { *(.stab) }
   .stabstr       0 : { *(.stabstr) }
diff -r 6a86727a3afe -r c759c733f77d xen/include/asm-powerpc/config.h
--- a/xen/include/asm-powerpc/config.h  Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/include/asm-powerpc/config.h  Wed Jan 17 14:12:08 2007 -0500
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005
+ * Copyright IBM Corp. 2005, 2006, 2007
  *
  * Authors: Hollis Blanchard <[EMAIL PROTECTED]>
  */
@@ -34,9 +34,6 @@
 
 #define U(x) (x ## U)
 #define UL(x) (x ## UL)
-extern char _start[];
-extern char _end[];
-extern char _etext[];
 extern char __bss_start[];
 #endif
 
diff -r 6a86727a3afe -r c759c733f77d xen/include/asm-powerpc/init.h
--- a/xen/include/asm-powerpc/init.h    Wed Jan 17 13:18:02 2007 -0500
+++ b/xen/include/asm-powerpc/init.h    Wed Jan 17 14:12:08 2007 -0500
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2006
+ * Copyright IBM Corp. 2006, 2007
  *
  * Authors: Hollis Blanchard <[EMAIL PROTECTED]>
  */
@@ -27,14 +27,14 @@ typedef struct {
 typedef struct {
     unsigned long number;
     hcall_handler_t handler;
-} inithcall_t;
-extern inithcall_t __inithcall_start, __inithcall_end;
+} init_hcall_t;
+extern init_hcall_t __init_hcall_start, __init_hcall_end;
 
 #define __init_papr_hcall(nr, fn) \
-    static inithcall_t __inithcall_##fn __init_hcall \
+    static init_hcall_t __init_hcall_##fn __init_hcall \
     = { .number = nr, .handler = fn }
 
 #define __init_hcall  \
-    __attribute_used__ __attribute__ ((__section__ (".inithcall.text")))
+    __attribute_used__ __attribute__ ((__section__ (".init_hcall.init")))
 
 #endif /* _XEN_ASM_INIT_H */

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

Reply via email to