* rl78/rl78-sim.ld: Add .saddr/.frodata section. * rl78/rl78.ld: Likewise. * rl78/rl78-sim.ld: Make room for virtual register banks. * rl78/rl78.ld: Likewise. * rl78/vregs.h: New. * rl78-sys.h: Use it. * rl78/swrite.S: New. * rl78/Makefile.in: Build it. * rl78/write.c: Use it.
		
			
				
	
	
		
			322 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* Copyright (c) 2011 Red Hat Incorporated.
 | |
|    All rights reserved.
 | |
| 
 | |
|    Redistribution and use in source and binary forms, with or without
 | |
|    modification, are permitted provided that the following conditions
 | |
|    are met: 
 | |
| 
 | |
|      Redistributions of source code must retain the above copyright 
 | |
|      notice, this list of conditions and the following disclaimer.
 | |
| 
 | |
|      Redistributions in binary form must reproduce the above copyright
 | |
|      notice, this list of conditions and the following disclaimer in the
 | |
|      documentation and/or other materials provided with the distribution.
 | |
| 
 | |
|      The name of Red Hat Incorporated may not be used to endorse 
 | |
|      or promote products derived from this software without specific 
 | |
|      prior written permission.
 | |
| 
 | |
|    This software is provided by the copyright holders and contributors
 | |
|    "AS IS" and any express or implied warranties, including, but not
 | |
|    limited to, the implied warranties of merchantability and fitness for
 | |
|    a particular purpose are disclaimed.  In no event shall Red Hat
 | |
|    incorporated be liable for any direct, indirect, incidental, special,
 | |
|    exemplary, or consequential damages (including, but not limited to,
 | |
|    procurement of substitute goods or services; loss of use, data, or
 | |
|    profits; or business interruption) however caused and on any theory of
 | |
|    liability, whether in contract, strict liability, or tort (including
 | |
|    negligence or otherwise) arising in any way out of the use of this
 | |
|    software, even if advised of the possibility of such damage.  */
 | |
| 
 | |
| #include "rl78-sys.h"
 | |
| 
 | |
| 	.section ".vec","a"
 | |
| 	.short	_start
 | |
| 
 | |
| 	.section ".ivec","a"
 | |
| 	.macro	_iv	x
 | |
| 	.weak	\x
 | |
| 	.short	\x
 | |
| 	.endm
 | |
| #define IV(x) _iv _##x##_handler
 | |
| #define IVx() .short 0
 | |
| 
 | |
| 	/* To use a vector, simply define a global function named foo_handler()
 | |
| 	   for any IV(foo) listed below (i.e. tm05_handler) */
 | |
| 
 | |
| 	.global	_interrupt_vector_table
 | |
| _interrupt_vector_table:
 | |
| 	IV(wdti)
 | |
| 	IV(lvi)
 | |
| 	IV(p0)
 | |
| 	IV(p1)
 | |
| 	IV(p2)
 | |
| 	IV(p3)
 | |
| 	IV(p4)
 | |
| 	IV(p5)
 | |
| 
 | |
| 	IV(st2)
 | |
| 	IV(sr2)
 | |
| 	IV(sre2)
 | |
| 	IV(dma0)
 | |
| 	IV(dma1)
 | |
| 	IV(st0)
 | |
| 	IV(sr0)
 | |
| 	IV(tm01h)
 | |
| 
 | |
| 	IV(st1)
 | |
| 	IV(sr1)
 | |
| 	IV(sre1)
 | |
| 	IV(iica0)
 | |
| 	IV(tm00)
 | |
| 	IV(tm01)
 | |
| 	IV(tm02)
 | |
| 	IV(tm03)
 | |
| 
 | |
| 	IV(ad)
 | |
| 	IV(rtc)
 | |
| 	IV(it)
 | |
| 	IV(kr)
 | |
| 	IV(st3)
 | |
| 	IV(sr3)
 | |
| 	IV(tm13)
 | |
| 	IV(tm04)
 | |
| 
 | |
| 	IV(tm05)
 | |
| 	IV(tm06)
 | |
| 	IV(tm07)
 | |
| 	IV(p6)
 | |
| 	IV(p7)
 | |
| 	IV(p8)
 | |
| 	IV(p9)
 | |
| 	IV(p10)
 | |
| 
 | |
| 	IV(p11)
 | |
| 	IV(tm10)
 | |
| 	IV(tm12)
 | |
| 	IV(sre3)
 | |
| 	IV(tm13h)
 | |
| 	IV(md)
 | |
| 	IV(iica1)
 | |
| 	IV(fl)
 | |
| 
 | |
| 	IV(dma2)
 | |
| 	IV(dma3)
 | |
| 	IV(tm14)
 | |
| 	IV(tm15)
 | |
| 	IV(tm16)
 | |
| 	IV(tm17)
 | |
| 	IVx()
 | |
| 	IVx()
 | |
| 
 | |
| 	IVx()
 | |
| 	IVx()
 | |
| 	IVx()
 | |
| 	IVx()
 | |
| 	IVx()
 | |
| 	IV(brk)
 | |
| 	/* Note: 126 vectors */
 | |
| 
 | |
| 	.section ".csstart", "ax"
 | |
| 	.global __csstart
 | |
| __csstart:	
 | |
| 	br	!!_start
 | |
| 
 | |
| 	.weak	__rl78_option_byte_0
 | |
| 	.weak	__rl78_option_byte_1
 | |
| 	.weak	__rl78_option_byte_2
 | |
| 	.weak	__rl78_option_byte_3
 | |
| __rl78_option_byte_0 = 0x6e
 | |
| __rl78_option_byte_1 = 0xff
 | |
| __rl78_option_byte_2 = 0xe8
 | |
| __rl78_option_byte_3 = 0x85
 | |
| 
 | |
| 	.section ".opt", "a"
 | |
| 	.byte	__rl78_option_byte_0
 | |
| 	.byte	__rl78_option_byte_1
 | |
| 	.byte	__rl78_option_byte_2
 | |
| 	.byte	__rl78_option_byte_3
 | |
| 
 | |
| 	.text
 | |
| 
 | |
| 	.global _start
 | |
| 	.type	_start, @function
 | |
| _start:
 | |
| 	movw	sp, #__stack
 | |
| 
 | |
| 
 | |
| ;; block move to initialize .data
 | |
| 
 | |
| 	mov	es, #0
 | |
| 	movw	bc, #__romdatacopysize
 | |
| 1:	
 | |
| 	movw	ax, bc
 | |
| 	cmpw	ax, #0
 | |
| 	bz	$1f
 | |
| 	decw	bc
 | |
| 	decw	bc
 | |
| 	movw	ax, es:__romdatastart[bc]
 | |
| 	movw	__datastart[bc], ax
 | |
| 	br	$1b
 | |
| 1:	
 | |
| 	
 | |
| 	mov	es, #0
 | |
| 	movw	bc, #__romsaddrcopysize
 | |
| 1:	
 | |
| 	movw	ax, bc
 | |
| 	cmpw	ax, #0
 | |
| 	bz	$1f
 | |
| 	decw	bc
 | |
| 	decw	bc
 | |
| 	movw	ax, es:__romsaddrstart[bc]
 | |
| 	movw	__saddrstart[bc], ax
 | |
| 	br	$1b
 | |
| 1:	
 | |
| 
 | |
| 
 | |
| ;; block fill to .bss
 | |
| 
 | |
| 	movw	bc, #__bsssize
 | |
| 	movw	ax, #0
 | |
| 1:	
 | |
| 	cmpw	ax, bc
 | |
| 	bz	$1f
 | |
| 	movw	__bssstart[bc], ax
 | |
| 	decw	bc
 | |
| 	decw	bc
 | |
| 	br	$1b
 | |
| 1:	
 | |
| 
 | |
| 	call	!!__rl78_init
 | |
| 
 | |
| #ifdef PROFILE_SUPPORT	/* Defined in gcrt0.S.  */
 | |
| 	movw	ax, # _start
 | |
| 	push	ax
 | |
| 	movw	ax, # _etext
 | |
| 	push	ax
 | |
| 	call	!!__monstartup
 | |
| #endif
 | |
| 
 | |
| 	movw	ax, #0
 | |
| 	push	ax	/* envp */
 | |
| 	push	ax	/* argv */
 | |
| 	push	ax	/* argc */
 | |
| 	call	!!_main
 | |
| .LFE2:
 | |
| 	
 | |
|         movw	ax, r8       ; Save return code.
 | |
| 	push	ax
 | |
| 
 | |
| #ifdef PROFILE_SUPPORT
 | |
| 	call	!!__mcleanup
 | |
| #endif
 | |
| 
 | |
| 	call	!!_exit
 | |
| 
 | |
| 	.size	_start, . - _start
 | |
| 
 | |
| 	.global	_rl78_run_preinit_array
 | |
| 	.type	_rl78_run_preinit_array,@function
 | |
| _rl78_run_preinit_array:
 | |
| 	movw	hl, #__preinit_array_start
 | |
| 	movw	de, #__preinit_array_end
 | |
| 	movw	bc, #-2
 | |
| 	br	$_rl78_run_inilist
 | |
| 
 | |
| 	.global	_rl78_run_init_array
 | |
| 	.type	_rl78_run_init_array,@function
 | |
| _rl78_run_init_array:
 | |
| 	movw	hl, #__init_array_start
 | |
| 	movw	de, #__init_array_end
 | |
| 	movw	bc, #2
 | |
| 	br	$_rl78_run_inilist
 | |
| 
 | |
| 	.global	_rl78_run_fini_array
 | |
| 	.type	_rl78_run_fini_array,@function
 | |
| _rl78_run_fini_array:
 | |
| 	movw	hl, #__fini_array_start
 | |
| 	movw	de, #__fini_array_end
 | |
| 	movw	bc, #-2
 | |
| 	/* fall through */
 | |
| 
 | |
| 	;; HL = start of list
 | |
| 	;; DE = end of list
 | |
| 	;; BC = step direction (+2 or -2)
 | |
| _rl78_run_inilist:
 | |
| next_inilist:
 | |
| 	movw	ax, hl
 | |
| 	cmpw	ax, de
 | |
| 	bz	$done_inilist
 | |
| 	movw	ax, [hl]
 | |
| 	cmpw	ax, #-1
 | |
| 	bz	$skip_inilist
 | |
| 	cmpw	ax, #0
 | |
| 	bz	$skip_inilist
 | |
| 	push	ax
 | |
| 	push	bc
 | |
| 	push	de
 | |
| 	push	hl
 | |
| 	call	ax
 | |
| 	pop	hl
 | |
| 	pop	de
 | |
| 	pop	bc
 | |
| 	pop	ax
 | |
| skip_inilist:
 | |
| 	movw	ax, hl
 | |
| 	addw	ax, bc
 | |
| 	movw	hl, ax
 | |
| 	br	$next_inilist
 | |
| done_inilist:
 | |
| 	ret
 | |
| 
 | |
| 	.section	.init,"ax"
 | |
| 
 | |
| 	.global __rl78_init
 | |
| __rl78_init:
 | |
| 
 | |
| 	.section	.fini,"ax"
 | |
| 
 | |
| 	.global __rl78_fini
 | |
| __rl78_fini:
 | |
| 	call	!!_rl78_run_fini_array
 | |
| 
 | |
| 	.section .data
 | |
| 	.global ___dso_handle
 | |
| 	.weak   ___dso_handle
 | |
| ___dso_handle:
 | |
| 	.long	0
 | |
| 
 | |
| ;;; Provide Dwarf unwinding information that will help GDB stop
 | |
| ;;; backtraces at the right place.  This is stolen from assembly
 | |
| ;;; code generated by GCC with -dA.
 | |
| 	.section	.debug_frame,"",@progbits
 | |
| .Lframe0:
 | |
| 	.4byte	.LECIE0-.LSCIE0	; Length of Common Information Entry
 | |
| .LSCIE0:
 | |
| 	.4byte	0xffffffff	; CIE Identifier Tag
 | |
| 	.byte	0x1	; CIE Version
 | |
| 	.ascii "\0"	; CIE Augmentation
 | |
| 	.uleb128 0x1	; CIE Code Alignment Factor
 | |
| 	.sleb128 -1	; CIE Data Alignment Factor
 | |
| 	.byte	0xd	; CIE RA Column
 | |
| 	.byte	0xc	; DW_CFA_def_cfa
 | |
| 	.uleb128 0xc
 | |
| 	.uleb128 0x3
 | |
| 	.byte	0x8d	; DW_CFA_offset, column 0xd
 | |
| 	.uleb128 0x3
 | |
| 	.p2align 2
 | |
| .LECIE0:
 | |
| .LSFDE0:
 | |
| 	.4byte	.LEFDE0-.LASFDE0	; FDE Length
 | |
| .LASFDE0:
 | |
| 	.4byte	.Lframe0	; FDE CIE offset
 | |
| 	.4byte	_start		; FDE initial location
 | |
| 	.4byte	.LFE2 - _start	; FDE address range
 | |
| 	.byte   0xf     	; DW_CFA_def_cfa_expression
 | |
| 	.uleb128 1		; length of expression
 | |
| 	.byte 	0x30		; DW_OP_lit0
 | |
| 	.p2align 2
 | |
| .LEFDE0:
 | |
| 
 | |
| 	.text
 |