mep: C5 support II
Jeff Johnston
jjohnstn@redhat.com
Tue Apr 21 18:13:00 GMT 2009
Ok.
-- Jeff J.
DJ Delorie wrote:
> No response to my last post, had some more changes to add to it.
> Ok to commit?
>
> http://sources.redhat.com/ml/newlib/2009/msg00439.html
>
> * mep/Makefile.in (SCRIPTS): Update to new config.
> * mep/default.ld: New.
> * mep/gmap_default.ld: Change default endian to little.
> * mep/sim-crt0.S: Maintain 8-byte stack alignment.
> * mep/sim-crtn.S: Likewise.
>
> Index: mep/Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mep/Makefile.in,v
> retrieving revision 1.1
> diff -p -U3 -r1.1 mep/Makefile.in
> --- mep/Makefile.in 8 Feb 2007 21:22:05 -0000 1.1
> +++ mep/Makefile.in 21 Apr 2009 03:50:44 -0000
> @@ -57,7 +57,7 @@ OBJCOPY = `if [ -f ${objroot}/../binutil
> then echo ${objroot}/../binutils/objcopy ; \
> else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi`
>
> -SCRIPTS = min.ld simple.ld fmax.ld
> +SCRIPTS = min.ld default.ld
> CRT = crt0.o sdram-crt0.o sim-crt0.o simnovec-crt0.o simsdram-crt0.o crtn.o sim-crtn.o
> SIM_BSP = libsim.a
> LIBNOSYS = ../libnosys/libnosys.a
> Index: mep/default.ld
> ===================================================================
> RCS file: mep/default.ld
> diff -N mep/default.ld
> --- mep/default.ld 1 Jan 1970 00:00:00 -0000
> +++ mep/default.ld 21 Apr 2009 03:50:44 -0000
> @@ -0,0 +1,332 @@
> +/******************************************************************************
> +begin-header
> +
> + DO NOT EDIT. THIS FILE IS MACHINE-GENERATED
> + FROM THE TEMPLATE FILE gmap_default.ld.
> + ALL EDITS WILL BE ERASED WITH NEXT MeP-Integrator RUN.
> +
> + Custom linker script for the MeP Module default.
> +end-header
> +*******************************************************************************/
> +
> +OUTPUT_FORMAT("elf32-mep-little", "elf32-mep",
> + "elf32-mep-little")
> +OUTPUT_ARCH(mep)
> +ENTRY(_reset)
> +
> +MEMORY
> +{
> +/* begin-memory */
> + VEC (r) : ORIGIN = 0x00000000, LENGTH = 0x000000b8
> + VEC_WARM (w) : ORIGIN = 0x00200000, LENGTH = 0x000000b8
> + HWINIT (r) : ORIGIN = 0x000000b8, LENGTH = 0x00000148
> + RAM1 (r) : ORIGIN = 0x00000200, LENGTH = 0x001ffe00
> + RAM2 (w) : ORIGIN = 0x00800000, LENGTH = 0x00800000
> +/*RAM3 (w) : ORIGIN = 0x80000000, LENGTH = 0x00800000 */
> + IMEM0 (w) : ORIGIN = 0x002000b8, LENGTH = 0x00003f48
> + IMEM1 (w) : ORIGIN = 0x00204000, LENGTH = 0x00004000
> + DMEM0 (w) : ORIGIN = 0x00220000, LENGTH = 0x00008000
> + DMEM1 (w) : ORIGIN = 0x00228000, LENGTH = 0x00008000
> + DMEM2 (w) : ORIGIN = 0x00230000, LENGTH = 0x00008000
> + DMEM3 (w) : ORIGIN = 0x00238000, LENGTH = 0x00008000
> +/* end-memory */
> +}
> +
> +SECTIONS
> +{
> + /* Sections to be placed in the vec area. */
> + .vec : { *(.vec) } >VEC /* VEC-section */
> +
> + /* Sections to be placed in the HWINIT area. */
> + .hwinit : { *(.hwinit) } >HWINIT /* HWINIT-section */
> +
> + /* Sections to be placed in the ROM area. */
> + .gnu.version : { *(.gnu.version) } >RAM1 /* ROM-section */
> + .gnu.version_d : { *(.gnu.version_d) } >RAM1 /* ROM-section */
> + .gnu.version_r : { *(.gnu.version_r) } >RAM1 /* ROM-section */
> +
> + /* Sections to be placed in the romdata.s area. */
> + .srodata :
> + {
> + __sdabase = . + 0x8000;
> + *(.srodata) *(.srodata.*) *(.gnu.linkonce.srd.*)
> + } >RAM2 /* DATA-section */
> +
> + /* Sections to be placed in the data.s area. */
> + .sdata :
> + {
> + *(.sdata)
> + *(.sdata.*)
> + *(.gnu.linkonce.s.*)
> + } >RAM2 /* DATA-section */
> + .sbss :
> + {
> + PROVIDE (__sbss_start = .);
> + PROVIDE (___sbss_start = .);
> + *(.dynsbss)
> + *(.sbss)
> + *(.sbss.*)
> + *(.gnu.linkonce.sb.*)
> + *(.scommon)
> + PROVIDE (__sbss_end = .);
> + PROVIDE (___sbss_end = .);
> + /* Assert maximum size */
> + __assert_tiny_size = ASSERT ((. < __sdabase) || ((. - __sdabase) <= 0x8000),
> + "tiny section overflow");
> + } >RAM2 /* DATA-section */
> +
> + /* Sections to be placed in the data.m area. */
> + .data :
> + {
> + __data_start = . ;
> + *(.data)
> + *(.data.*)
> + *(.gnu.linkonce.d.*)
> + SORT(CONSTRUCTORS)
> + } >RAM2 /* DATA-section */
> + .data1 : { *(.data1) } >RAM2 /* DATA-section */
> + .eh_frame : { KEEP (*(.eh_frame))} >RAM2 /* DATA-section */
> + .gcc_except_table : { *(.gcc_except_table) *(.gcc_except_table.*) } >RAM2 /* DATA-section */
> + .dynamic : { *(.dynamic) } >RAM2 /* DATA-section */
> + .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))
> + } >RAM2 /* DATA-section */
> + .dtors :
> + {
> + KEEP (*crtbegin.o(.dtors))
> + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
> + KEEP (*(SORT(.dtors.*)))
> + KEEP (*(.dtors))
> + } >RAM2 /* DATA-section */
> + .jcr :
> + {
> + . = ALIGN(4);
> + *(.jcr)
> + } >RAM2 /* DATA-section */
> + .got :
> + {
> + *(.got.plt) *(.got)
> + _edata = .;
> + PROVIDE (edata = .);
> + } >RAM2 /* DATA-section */
> + .based :
> + {
> + __tpbase = .;
> + *(.based) *(.based.*) *(.gnu.linkonce.based.*)
> + /* Assert maximum size */
> + __assert_based_size = ASSERT ((. - __tpbase) <= 0x80,
> + "based section overflow");
> + } >RAM2 /* DATA-section */
> +
> + .bss :
> + {
> + __bss_start = .;
> + *(.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(32 / 8);
> + _end = .;
> + PROVIDE (end = .);
> + } >RAM2 /* DATA-section */
> +
> + /* Sections to be placed in the code.m area. */
> + .init :
> + {
> + KEEP (*(.init))
> + } >RAM2 /* CODE-section */
> + .plt : { *(.plt) } >RAM2 /* DATA-section */
> + .text :
> + {
> + *(.text)
> + *(.text.*)
> + *(.stub)
> + /* .gnu.warning sections are handled specially by elf32.em. */
> + *(.gnu.warning)
> + *(.gnu.linkonce.t.*)
> + } >RAM2 /* CODE-section */ =0
> + .vtext ALIGN(8) :
> + {
> + *(.vtext)
> + } >RAM2 /* CODE-section */
> + .fini :
> + {
> + KEEP (*(.fini))
> + PROVIDE (__etext = .);
> + PROVIDE (_etext = .);
> + PROVIDE (etext = .);
> + } >RAM2 /* CODE-section */ =0
> +
> + /* Sections to be placed in the romdata.m area. */
> + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } >RAM2 /* DATA-section */
> + .rodata1 : { *(.rodata1) } >RAM2 /* DATA-section */
> +
> + /* Sections to be placed in the code.l area. */
> + .ftext : { *(.ftext) *(.ftext.*) *(.gnu.linkonce.ft.*) } >RAM2 /* CODE-section */
> + .vftext ALIGN(8) :
> + {
> + *(.vftext) *(.vftext.*) *(.gnu.linkonce.vf.*)
> + } >RAM2 /* CODE-section */
> +
> + /* Sections to be placed in the romdata.l area. */
> + .frodata :
> + {
> + *(.frodata) *(.frodata.*) *(.gnu.linkonce.frd.*)
> + __assert_near_size = ASSERT (. <= 0x1000000, "near section overflow");
> + } >RAM2 /* DATA-section */
> +
> + /* Sections to be placed in the data.l area. */
> + .far : { *(.far) *(.far.*) *(.gnu.linkonce.far.*) } >RAM2 /* DATA-section */
> + .farbss :
> + { PROVIDE (__farbss_start = .);
> + *(.farbss) *(.farbss.*)
> + PROVIDE (__farbss_end = .);
> + } >RAM2 /* DATA-section */
> +
> + /* END-mep-sections */
> +
> + .vec_warm :
> + {
> + /* vec_warm is a place for the startup code to write the interrupt
> + vectors. Allow 0xb8 bytes of space aligned on a 4 byte boundary. */
> + . = ALIGN(4);
> + vec_warm = .;
> + . += 0xb8;
> + } >VEC_WARM
> +
> + /* begin-stack-table */
> + __stack50 = (__stack - (0 * (__stack_size / 1)) + 15) / 16 * 16;
> +
> + .rostacktab :
> + {
> + /* Emit a table describing the location of the different stacks. */
> + . = ALIGN(4);
> + __stack_table = .;
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + LONG (__stack50);
> + __stack_end = .;
> + } >RAM2
> + /* end-stack-table */
> +
> + /* begin-heap */
> + /* End of DATA is 0x00800000 + 0x00800000. That's where the heap will end. */
> + __heap_end = 0x00800000 + 0x00800000 - 1;
> + /* end-heap */
> +
> + /* Default stack size is 1M. That's where the heap will start if there's
> + room. If there's not enough room, allocate half of the remaining space
> + for stack and half for heap. Align the heap on a 16 byte boundary. */
> + __stack_size = (__stack_end + 0x100000 <= __heap_end + 1
> + ? 0x100000
> + : ((__heap_end + 1 - __stack_end) / 2));
> + __heap = (__stack_end + __stack_size + 15) / 16 * 16;
> +
> + /* Leave 16 bytes between the stack and the heap. */
> + __stack = __heap - 0x10;
> +
> + /* Stabs debugging sections. */
> + .stab 0 : { *(.stab) }
> + .stabstr 0 : { *(.stabstr) }
> + .stab.excl 0 : { *(.stab.excl) }
> + .stab.exclstr 0 : { *(.stab.exclstr) }
> + .stab.index 0 : { *(.stab.index) }
> + .stab.indexstr 0 : { *(.stab.indexstr) }
> + .comment 0 : { *(.comment) }
> + /* DWARF debug sections.
> + Symbols in the DWARF debugging sections are relative to the beginning
> + of the section so we begin them at 0. */
> + /* DWARF 1 */
> + .debug 0 : { *(.debug) }
> + .line 0 : { *(.line) }
> + /* GNU DWARF 1 extensions */
> + .debug_srcinfo 0 : { *(.debug_srcinfo) }
> + .debug_sfnames 0 : { *(.debug_sfnames) }
> + /* DWARF 1.1 and DWARF 2 */
> + .debug_aranges 0 : { *(.debug_aranges) }
> + .debug_pubnames 0 : { *(.debug_pubnames) }
> + /* DWARF 2 */
> + .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
> + .debug_abbrev 0 : { *(.debug_abbrev) }
> + .debug_line 0 : { *(.debug_line) }
> + .debug_frame 0 : { *(.debug_frame) }
> + .debug_str 0 : { *(.debug_str) }
> + .debug_loc 0 : { *(.debug_loc) }
> + .debug_macinfo 0 : { *(.debug_macinfo) }
> + .debug_ranges 0 : { *(.debug_ranges) }
> + /* SGI/MIPS DWARF 2 extensions */
> + .debug_weaknames 0 : { *(.debug_weaknames) }
> + .debug_funcnames 0 : { *(.debug_funcnames) }
> + .debug_typenames 0 : { *(.debug_typenames) }
> + .debug_varnames 0 : { *(.debug_varnames) }
> + /* These must appear regardless of . */
> +}
> Index: mep/gmap_default.ld
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mep/gmap_default.ld,v
> retrieving revision 1.2
> diff -p -U3 -r1.2 mep/gmap_default.ld
> --- mep/gmap_default.ld 13 Jul 2007 17:32:21 -0000 1.2
> +++ mep/gmap_default.ld 21 Apr 2009 03:50:44 -0000
> @@ -24,8 +24,8 @@ begin-header
> end-header
> *******************************************************************************/
>
> -OUTPUT_FORMAT("elf32-mep", "elf32-mep",
> - "elf32-mep")
> +OUTPUT_FORMAT("elf32-mep-little", "elf32-mep",
> + "elf32-mep-little")
> OUTPUT_ARCH(mep)
> ENTRY(_reset)
>
> Index: mep/sim-crt0.S
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mep/sim-crt0.S,v
> retrieving revision 1.1
> diff -p -U3 -r1.1 mep/sim-crt0.S
> --- mep/sim-crt0.S 8 Feb 2007 21:22:05 -0000 1.1
> +++ mep/sim-crt0.S 21 Apr 2009 03:50:44 -0000
> @@ -113,6 +113,17 @@ _start:
> movh $sp, %uhi(__stack_table)
> or3 $sp, $sp, %lo(__stack_table)
>
> + # initialize sp, gp, tp
> + # get CPU ID
> + ldc $0, $id
> + srl $0, 16
> +
> + # load ID-specific stack pointer
> + sl2ad3 $0, $0, $sp # $0 = ($0 << 2) + $sp
> + lw $sp,($0) # $sp = *($0)
> + mov $0,0xfff8
> + and $sp, $0
> +
> #ifndef NOVEC
> # copy exception vector table
>
> @@ -294,14 +305,6 @@ _start:
> .Lend_dc:
> # NOVEC
> #endif
> - # initialize sp, gp, tp
> - # get CPU ID
> - ldc $0, $id
> - srl $0, 16
> -
> - # load ID-specific stack pointer
> - sl2ad3 $0, $0, $sp # $0 = ($0 << 2) + $sp
> - lw $sp,($0) # $sp = *($0)
> mov $0, 0
>
> movh $gp, %uhi(__sdabase)
> @@ -385,13 +388,13 @@ _exit_in_progress: .word 0
>
> .section .init
> __invoke_init_section:
> - add $sp, -4
> + add $sp, -8
> ldc $0, $lp
> sw $0, ($sp)
>
> .section .fini
> __invoke_fini_section:
> - add $sp, -4
> + add $sp, -8
> ldc $0, $lp
> sw $0, ($sp)
>
> Index: mep/sim-crtn.S
> ===================================================================
> RCS file: /cvs/src/src/libgloss/mep/sim-crtn.S,v
> retrieving revision 1.1
> diff -p -U3 -r1.1 mep/sim-crtn.S
> --- mep/sim-crtn.S 8 Feb 2007 21:22:05 -0000 1.1
> +++ mep/sim-crtn.S 21 Apr 2009 03:50:44 -0000
> @@ -13,11 +13,11 @@
> .section .init
> lw $1, ($sp)
> stc $1, $lp
> - add $sp, 4
> + add $sp, 8
> ret
>
> .section .fini
> lw $1, ($sp)
> stc $1, $lp
> - add $sp, 4
> + add $sp, 8
> ret
>
More information about the Newlib
mailing list