RFA: xstormy16: Add sim support for data in ROM

J. Johnston jjohnstn@redhat.com
Wed Apr 23 15:48:00 GMT 2003


Yes, please go ahead.

-- Jeff J.

Nick Clifton wrote:
> Hi Guys,
> 
>   May I have permission to apply the patch below please ?
> 
>   It adds support to the xstormy16 port in libgloss to handle the
>   simulation of programs that load with data in ROM which needs to be
>   copied into RAM before execution starts.  It was developed by Andrew
>   Haley here at Red Hat last year and I would like to contribute it
>   now.
> 
> Cheers
>         Nick
> 
> libgloss/ChangeLog
> 2003-04-18  Andrew Haley  <aph@cambridge.redhat.com>
> 
> 	* xstormy16/sim_rom.ld: New.
> 	* xstormy16/Makefile.in (SIM_SCRIPTS): Add sim_rom.ld.	
> 	* xstormy16/crt0.s (_int_reset): Copy ROM data to RAM.
> 	* xstormy16/eva_app.ld (_rdata, _data): New.
> 	* xstormy16/eva_stub.ld (_rdata, _data): New.
> 	* xstormy16/sim_high.ld (_rdata, _data): New.
> 
> Index: libgloss/xstormy16/Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/libgloss/xstormy16/Makefile.in,v
> retrieving revision 1.3
> diff -c -3 -p -w -r1.3 Makefile.in
> *** libgloss/xstormy16/Makefile.in	1 Feb 2002 18:00:41 -0000	1.3
> --- libgloss/xstormy16/Makefile.in	18 Apr 2003 08:57:51 -0000
> *************** SCRIPTS		= 
> *** 45,51 ****
>   CRT		= crt0.o crti.o crtn.o
>   
>   # Here is all of the simulator stuff
> ! SIM_SCRIPTS	= sim_high.ld
>   SIM_LDFLAGS	=
>   SIM_BSP		= libsim.a
>   SIM_OBJS	= syscalls.o sim_malloc_start.o
> --- 45,51 ----
>   CRT		= crt0.o crti.o crtn.o
>   
>   # Here is all of the simulator stuff
> ! SIM_SCRIPTS	= sim_high.ld sim_rom.ld
>   SIM_LDFLAGS	=
>   SIM_BSP		= libsim.a
>   SIM_OBJS	= syscalls.o sim_malloc_start.o
> 
> Index: libgloss/xstormy16/crt0.s
> ===================================================================
> RCS file: /cvs/src/src/libgloss/xstormy16/crt0.s,v
> retrieving revision 1.1
> diff -c -3 -p -w -r1.1 crt0.s
> *** libgloss/xstormy16/crt0.s	22 Dec 2001 22:47:58 -0000	1.1
> --- libgloss/xstormy16/crt0.s	18 Apr 2003 08:57:51 -0000
> *************** _start:
> *** 22,29 ****
>   	;; port1 interrupt
>   	jmpf _int_port1
>   
> - 	.text
>   # Reset code, set up memory and call main.
>   _int_reset:
>   	;; Set up the stack pointer.
>   	mov r0,#__stack
> --- 22,31 ----
>   	;; port1 interrupt
>   	jmpf _int_port1
>   
>   # Reset code, set up memory and call main.
> +         .section        .rodata
> + 2:	.word	__rdata
> + 	.text
>   _int_reset:
>   	;; Set up the stack pointer.
>   	mov r0,#__stack
> *************** _int_reset:
> *** 36,41 ****
> --- 38,61 ----
>   	mov r2,#0
>   0:	mov.w (r0++),r2
>   	blt r0,r1,0b
> + 
> + 	;; Copy data from ROM into RAM.  ROM area may be above 64k,
> + 	;; but RAM may not.
> + 	mov r1,#__data
> + 	mov r3,#_edata
> + 	mov r4,#2b
> + 	mov.w r0,(r4++)
> + 	mov.w r2,(r4) 
> + 	mov r8,r2
> + 	;; If _data == _rdata there's no need to copy anything.
> + 	bnz r0,r1,0f
> + 	bz r2,#0,1f
> + 0:	movf.w r2,(r0++)
> + 	bnz r0,#0,2f
> + 	add r8,#1
> + 2:	mov.w (r1++),r2
> + 	blt r1,r3,0b
> + 1:	
>   	;; Call hardware init routine
>   	callf _hwinit
>   	;; Call initialization routines
> 
> Index: libgloss/xstormy16/eva_app.ld
> ===================================================================
> RCS file: /cvs/src/src/libgloss/xstormy16/eva_app.ld,v
> retrieving revision 1.3
> diff -c -3 -p -w -r1.3 eva_app.ld
> *** libgloss/xstormy16/eva_app.ld	16 Apr 2003 11:53:46 -0000	1.3
> --- libgloss/xstormy16/eva_app.ld	18 Apr 2003 08:57:51 -0000
> *************** SECTIONS
> *** 16,21 ****
> --- 16,23 ----
>     __malloc_start = 0x800;
>     .data    :
>     {
> +     __rdata = .;
> +     __data = .;
>       *(.data)
>       *(.data.*)
>       *(.gnu.linkonce.d.*)
> 
> Index: libgloss/xstormy16/eva_stub.ld
> ===================================================================
> RCS file: /cvs/src/src/libgloss/xstormy16/eva_stub.ld,v
> retrieving revision 1.3
> diff -c -3 -p -w -r1.3 eva_stub.ld
> *** libgloss/xstormy16/eva_stub.ld	16 Apr 2003 11:53:46 -0000	1.3
> --- libgloss/xstormy16/eva_stub.ld	18 Apr 2003 08:57:51 -0000
> *************** SECTIONS
> *** 78,83 ****
> --- 78,85 ----
>     PROVIDE (etext = .);
>     .data    :
>     {
> +     __data = .;
> +     __rdata = .;
>       *(.data)
>       *(.data.*)
>       *(.gnu.linkonce.d.*)
> 
> Index: libgloss/xstormy16/sim_high.ld
> ===================================================================
> RCS file: /cvs/src/src/libgloss/xstormy16/sim_high.ld,v
> retrieving revision 1.3
> diff -c -3 -p -w -r1.3 sim_high.ld
> *** libgloss/xstormy16/sim_high.ld	16 Apr 2003 11:53:46 -0000	1.3
> --- libgloss/xstormy16/sim_high.ld	18 Apr 2003 08:57:51 -0000
> *************** SECTIONS
> *** 17,22 ****
> --- 17,24 ----
>   {
>     .data    :
>     {
> +     __data = .;
> +     __rdata = .;
>       *(.data)
>       *(.data.*)
>       *(.gnu.linkonce.d.*)
> 
> *** /dev/null	2003-01-30 10:24:37.000000000 +0000
> --- /home/nickc/work/sources/sourceware/libgloss/xstormy16/sim_rom.ld	2003-04-18 09:53:33.000000000 +0100
> ***************
> *** 0 ****
> --- 1,138 ----
> + /* Test xstormy16 programs that have initial data in ROM and copy it
> +    to RAM.  */
> + 
> + OUTPUT_FORMAT("elf32-xstormy16", "elf32-xstormy16",
> + 	      "elf32-xstormy16")
> + OUTPUT_ARCH(xstormy16)
> + ENTRY(_start)
> +  SEARCH_DIR(/cuddles/aph/sanyo-011113-branch/install/xstormy16-elf/lib);
> + /* There are two memory regions we care about, one from 0 through 0x7F00
> +    that is RAM and one from 0x8000 up which is ROM.  */
> + MEMORY
> + {
> +   RAM (w) : ORIGIN = 0, LENGTH = 0x7F00
> +   ROM (!w) : ORIGIN = 0x8000, LENGTH = 0xFF8000
> + }
> + SECTIONS
> + {
> +   /* Read-only sections in ROM.  */
> +   .int_vec       : { *(.int_vec)	} > ROM
> +   .rodata   : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } > ROM
> +   .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))
> +   } > ROM
> +    .dtors         :
> +   {
> +     KEEP (*crtbegin.o(.dtors))
> +     KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
> +     KEEP (*(SORT(.dtors.*)))
> +     KEEP (*(.dtors))
> +   } > ROM
> +   .jcr : { KEEP (*(.jcr)) } > ROM
> +   .eh_frame : { KEEP (*(.eh_frame)) } > ROM
> +   .gcc_except_table : { *(.gcc_except_table) } > ROM
> +   .plt : { *(.plt) } > ROM
> +   .text      :
> +   {
> +     *(.text)
> +     *(.text.*)
> +     *(.stub)
> +     /* .gnu.warning sections are handled specially by elf32.em.  */
> +     *(.gnu.warning)
> +     *(.gnu.linkonce.t.*)
> +   } > ROM =0
> +   .init          :
> +   {
> +     KEEP (*(.init))
> +   } > ROM =0
> +   .fini      :
> +   {
> +     KEEP (*(.fini))
> +   } > ROM =0
> +   PROVIDE (__etext = .);
> +   PROVIDE (_etext = .);
> +   PROVIDE (etext = .);
> +   . = ALIGN(2);
> +   __rdata = .;
> +   .data    : AT (__rdata)
> +   {
> +     __data = .;
> +     *(.data)
> +     *(.data.*)
> +     *(.gnu.linkonce.d.*)
> +     SORT(CONSTRUCTORS)
> +   } > RAM
> +   _edata = .;
> +   PROVIDE (edata = .);
> +   __bss_start = .;
> +   /* Why do we need to give bss an AT address at all?  Because if we
> +      don't, ld will generate another program header for it rather than
> +      using the one for .data.  */
> +   .bss       : AT (LOADADDR(.data) + SIZEOF(.data))
> +   {
> +    *(.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(2);
> +   } > RAM
> +   . = ALIGN(2);
> +   _end = .;
> +   __stack = .;
> +   PROVIDE (end = .);
> +   /* 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) }
> +   /* 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  .  */
> + }
> 




More information about the Newlib mailing list