This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA: xstormy16: Add sim support for data in ROM


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 at cambridge dot redhat dot 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 . */
+ }





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]