Home | History | Annotate | Line # | Download | only in sh
crt1.S revision 1.1
      1  1.1  mrg /* Copyright (C) 2000-2013 Free Software Foundation, Inc.
      2  1.1  mrg    This file was pretty much copied from newlib.
      3  1.1  mrg 
      4  1.1  mrg This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg GCC is free software; you can redistribute it and/or modify it
      7  1.1  mrg under the terms of the GNU General Public License as published by the
      8  1.1  mrg Free Software Foundation; either version 3, or (at your option) any
      9  1.1  mrg later version.
     10  1.1  mrg 
     11  1.1  mrg GCC is distributed in the hope that it will be useful,
     12  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  1.1  mrg General Public License for more details.
     15  1.1  mrg 
     16  1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     17  1.1  mrg permissions described in the GCC Runtime Library Exception, version
     18  1.1  mrg 3.1, as published by the Free Software Foundation.
     19  1.1  mrg 
     20  1.1  mrg You should have received a copy of the GNU General Public License and
     21  1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     22  1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23  1.1  mrg <http://www.gnu.org/licenses/>.  */
     24  1.1  mrg 
     25  1.1  mrg 
     26  1.1  mrg #ifdef MMU_SUPPORT
     27  1.1  mrg 	/* Section used for exception/timer interrupt stack area */
     28  1.1  mrg 	.section .data.vbr.stack,"aw"
     29  1.1  mrg 	.align 4
     30  1.1  mrg 	.global __ST_VBR
     31  1.1  mrg __ST_VBR:
     32  1.1  mrg 	.zero 1024 * 2          /* ; 2k for VBR handlers */
     33  1.1  mrg /* Label at the highest stack address where the stack grows from */
     34  1.1  mrg __timer_stack:
     35  1.1  mrg #endif /* MMU_SUPPORT */
     36  1.1  mrg 
     37  1.1  mrg 	/* ;----------------------------------------
     38  1.1  mrg 	Normal newlib crt1.S */
     39  1.1  mrg 
     40  1.1  mrg #ifdef __SH5__
     41  1.1  mrg 	.section .data,"aw"
     42  1.1  mrg 	.global ___data
     43  1.1  mrg ___data:
     44  1.1  mrg 
     45  1.1  mrg 	.section .rodata,"a"
     46  1.1  mrg 	.global ___rodata
     47  1.1  mrg ___rodata:
     48  1.1  mrg 
     49  1.1  mrg #define ICCR_BASE  0x01600000
     50  1.1  mrg #define OCCR_BASE  0x01e00000
     51  1.1  mrg #define MMUIR_BASE 0x00000000
     52  1.1  mrg #define MMUDR_BASE 0x00800000
     53  1.1  mrg 
     54  1.1  mrg #define PTE_ENABLED     1
     55  1.1  mrg #define PTE_DISABLED    0
     56  1.1  mrg 
     57  1.1  mrg #define PTE_SHARED (1 << 1)
     58  1.1  mrg #define PTE_NOT_SHARED  0
     59  1.1  mrg 
     60  1.1  mrg #define PTE_CB_UNCACHEABLE  0
     61  1.1  mrg #define PTE_CB_DEVICE       1
     62  1.1  mrg #define PTE_CB_CACHEABLE_WB 2
     63  1.1  mrg #define PTE_CB_CACHEABLE_WT 3
     64  1.1  mrg 
     65  1.1  mrg #define PTE_SZ_4KB   (0 << 3)
     66  1.1  mrg #define PTE_SZ_64KB  (1 << 3)
     67  1.1  mrg #define PTE_SZ_1MB   (2 << 3)
     68  1.1  mrg #define PTE_SZ_512MB (3 << 3)
     69  1.1  mrg 
     70  1.1  mrg #define PTE_PRR      (1 << 6)
     71  1.1  mrg #define PTE_PRX      (1 << 7)
     72  1.1  mrg #define PTE_PRW      (1 << 8)
     73  1.1  mrg #define PTE_PRU      (1 << 9)
     74  1.1  mrg 
     75  1.1  mrg #define SR_MMU_BIT          31
     76  1.1  mrg #define SR_BL_BIT           28
     77  1.1  mrg 
     78  1.1  mrg #define ALIGN_4KB  (0xfff)
     79  1.1  mrg #define ALIGN_1MB  (0xfffff)
     80  1.1  mrg #define ALIGN_512MB (0x1fffffff)
     81  1.1  mrg 
     82  1.1  mrg #define DYNACON_BASE               0x0f000000
     83  1.1  mrg #define DM_CB_DLINK_BASE           0x0c000000
     84  1.1  mrg #define DM_DB_DLINK_BASE           0x0b000000
     85  1.1  mrg 
     86  1.1  mrg #define FEMI_AREA_0                0x00000000
     87  1.1  mrg #define FEMI_AREA_1                0x04000000
     88  1.1  mrg #define FEMI_AREA_2                0x05000000
     89  1.1  mrg #define FEMI_AREA_3                0x06000000
     90  1.1  mrg #define FEMI_AREA_4                0x07000000
     91  1.1  mrg #define FEMI_CB                    0x08000000
     92  1.1  mrg 
     93  1.1  mrg #define EMI_BASE                   0X80000000
     94  1.1  mrg 
     95  1.1  mrg #define DMA_BASE                   0X0e000000
     96  1.1  mrg 
     97  1.1  mrg #define CPU_BASE                   0X0d000000
     98  1.1  mrg 
     99  1.1  mrg #define PERIPH_BASE                0X09000000
    100  1.1  mrg #define DMAC_BASE                  0x0e000000
    101  1.1  mrg #define INTC_BASE                  0x0a000000
    102  1.1  mrg #define CPRC_BASE                  0x0a010000
    103  1.1  mrg #define TMU_BASE                   0x0a020000
    104  1.1  mrg #define SCIF_BASE                  0x0a030000
    105  1.1  mrg #define RTC_BASE                   0x0a040000
    106  1.1  mrg 
    107  1.1  mrg 
    108  1.1  mrg 
    109  1.1  mrg #define LOAD_CONST32(val, reg) \
    110  1.1  mrg 	movi	((val) >> 16) & 65535, reg; \
    111  1.1  mrg 	shori	(val) & 65535, reg
    112  1.1  mrg 
    113  1.1  mrg #define LOAD_PTEH_VAL(sym, align, bits, scratch_reg, reg) \
    114  1.1  mrg 	LOAD_ADDR (sym, reg); \
    115  1.1  mrg 	LOAD_CONST32 ((align), scratch_reg); \
    116  1.1  mrg 	andc	reg, scratch_reg, reg; \
    117  1.1  mrg 	LOAD_CONST32 ((bits), scratch_reg); \
    118  1.1  mrg 	or	reg, scratch_reg, reg
    119  1.1  mrg 
    120  1.1  mrg #define LOAD_PTEL_VAL(sym, align, bits, scratch_reg, reg) \
    121  1.1  mrg 	LOAD_ADDR (sym, reg); \
    122  1.1  mrg 	LOAD_CONST32 ((align), scratch_reg); \
    123  1.1  mrg 	andc	reg, scratch_reg, reg; \
    124  1.1  mrg 	LOAD_CONST32 ((bits), scratch_reg); \
    125  1.1  mrg 	or	reg, scratch_reg, reg
    126  1.1  mrg 
    127  1.1  mrg #define SET_PTE(pte_addr_reg, pteh_val_reg, ptel_val_reg) \
    128  1.1  mrg 	putcfg  pte_addr_reg, 0, r63; \
    129  1.1  mrg 	putcfg  pte_addr_reg, 1, ptel_val_reg; \
    130  1.1  mrg 	putcfg  pte_addr_reg, 0, pteh_val_reg
    131  1.1  mrg 
    132  1.1  mrg #if __SH5__ == 64
    133  1.1  mrg 	.section .text,"ax"
    134  1.1  mrg #define LOAD_ADDR(sym, reg) \
    135  1.1  mrg 	movi	(sym >> 48) & 65535, reg; \
    136  1.1  mrg 	shori	(sym >> 32) & 65535, reg; \
    137  1.1  mrg 	shori	(sym >> 16) & 65535, reg; \
    138  1.1  mrg 	shori	sym & 65535, reg
    139  1.1  mrg #else
    140  1.1  mrg 	.mode	SHmedia
    141  1.1  mrg 	.section .text..SHmedia32,"ax"
    142  1.1  mrg #define LOAD_ADDR(sym, reg) \
    143  1.1  mrg 	movi	(sym >> 16) & 65535, reg; \
    144  1.1  mrg 	shori	sym & 65535, reg
    145  1.1  mrg #endif
    146  1.1  mrg 	.global start
    147  1.1  mrg start:
    148  1.1  mrg 	LOAD_ADDR (_stack, r15)
    149  1.1  mrg 
    150  1.1  mrg #ifdef MMU_SUPPORT
    151  1.1  mrg 	! Set up the VM using the MMU and caches
    152  1.1  mrg 
    153  1.1  mrg 	! .vm_ep is first instruction to execute
    154  1.1  mrg 	! after VM initialization
    155  1.1  mrg 	pt/l	.vm_ep, tr1
    156  1.1  mrg 
    157  1.1  mrg 	! Configure instruction cache (ICCR)
    158  1.1  mrg 	movi	3, r2
    159  1.1  mrg 	movi	0, r3
    160  1.1  mrg 	LOAD_ADDR (ICCR_BASE, r1)
    161  1.1  mrg 	putcfg	r1, 0, r2
    162  1.1  mrg 	putcfg	r1, 1, r3
    163  1.1  mrg 
    164  1.1  mrg 	! movi	7, r2 ! write through
    165  1.1  mrg 	! Configure operand cache (OCCR)
    166  1.1  mrg 	LOAD_ADDR (OCCR_BASE, r1)
    167  1.1  mrg 	putcfg	r1, 0, r2
    168  1.1  mrg 	putcfg	r1, 1, r3
    169  1.1  mrg 
    170  1.1  mrg 	! Disable all PTE translations
    171  1.1  mrg 	LOAD_ADDR (MMUIR_BASE, r1)
    172  1.1  mrg 	LOAD_ADDR (MMUDR_BASE, r2)
    173  1.1  mrg 	movi	64, r3
    174  1.1  mrg 	pt/l	.disable_ptes_loop, tr0
    175  1.1  mrg .disable_ptes_loop:
    176  1.1  mrg 	putcfg	r1, 0, r63
    177  1.1  mrg 	putcfg	r2, 0, r63
    178  1.1  mrg 	addi	r1, 16, r1
    179  1.1  mrg 	addi	r2, 16, r2
    180  1.1  mrg 	addi	r3, -1, r3
    181  1.1  mrg 	bgt	r3, r63, tr0
    182  1.1  mrg 
    183  1.1  mrg 	LOAD_ADDR (MMUIR_BASE, r1)
    184  1.1  mrg 
    185  1.1  mrg 	! FEMI instruction mappings
    186  1.1  mrg 	!   Area 0 - 1Mb cacheable at 0x00000000
    187  1.1  mrg 	!   Area 1 - None
    188  1.1  mrg 	!   Area 2 - 1Mb cacheable at 0x05000000
    189  1.1  mrg 	!          - 1Mb cacheable at 0x05100000
    190  1.1  mrg 	!   Area 3 - None
    191  1.1  mrg 	!   Area 4 - None
    192  1.1  mrg 
    193  1.1  mrg 	! Map a 1Mb page for instructions at 0x00000000
    194  1.1  mrg 	LOAD_PTEH_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    195  1.1  mrg 	LOAD_PTEL_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
    196  1.1  mrg 	SET_PTE (r1, r2, r3)
    197  1.1  mrg 
    198  1.1  mrg 	! Map a 1Mb page for instructions at 0x05000000
    199  1.1  mrg 	addi	r1, 16, r1
    200  1.1  mrg 	LOAD_PTEH_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    201  1.1  mrg 	LOAD_PTEL_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
    202  1.1  mrg 	SET_PTE (r1, r2, r3)
    203  1.1  mrg 
    204  1.1  mrg 	! Map a 1Mb page for instructions at 0x05100000
    205  1.1  mrg 	addi	r1, 16, r1
    206  1.1  mrg 	LOAD_PTEH_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    207  1.1  mrg 	LOAD_PTEL_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRX | PTE_PRU, r25, r3)
    208  1.1  mrg 	SET_PTE (r1, r2, r3)
    209  1.1  mrg 
    210  1.1  mrg 	! Map a 512M page for instructions at EMI base
    211  1.1  mrg 	addi	r1, 16, r1
    212  1.1  mrg 	LOAD_PTEH_VAL (EMI_BASE, ALIGN_512MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    213  1.1  mrg 	LOAD_PTEL_VAL (EMI_BASE, ALIGN_512MB, PTE_CB_CACHEABLE_WB | PTE_SZ_512MB | PTE_PRX | PTE_PRU, r25, r3)
    214  1.1  mrg 	SET_PTE (r1, r2, r3)
    215  1.1  mrg 
    216  1.1  mrg 	! Map a 4K page for instructions at DM_DB_DLINK_BASE
    217  1.1  mrg 	addi	r1, 16, r1
    218  1.1  mrg 	LOAD_PTEH_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    219  1.1  mrg 	LOAD_PTEL_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRX | PTE_PRU, r25, r3)
    220  1.1  mrg 	SET_PTE (r1, r2, r3)
    221  1.1  mrg 
    222  1.1  mrg 	LOAD_ADDR (MMUDR_BASE, r1)
    223  1.1  mrg 
    224  1.1  mrg 	! FEMI data mappings
    225  1.1  mrg 	!   Area 0 - 1Mb cacheable at 0x00000000
    226  1.1  mrg 	!   Area 1 - 1Mb device at 0x04000000
    227  1.1  mrg 	!   Area 2 - 1Mb cacheable at 0x05000000
    228  1.1  mrg 	!          - 1Mb cacheable at 0x05100000
    229  1.1  mrg 	!   Area 3 - None
    230  1.1  mrg 	!   Area 4 - None
    231  1.1  mrg 	!   CB     - 1Mb device at 0x08000000
    232  1.1  mrg 
    233  1.1  mrg 	! Map a 1Mb page for data at 0x00000000
    234  1.1  mrg 	LOAD_PTEH_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    235  1.1  mrg 	LOAD_PTEL_VAL (FEMI_AREA_0, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    236  1.1  mrg 	SET_PTE (r1, r2, r3)
    237  1.1  mrg 
    238  1.1  mrg 	! Map a 1Mb page for data at 0x04000000
    239  1.1  mrg 	addi	r1, 16, r1
    240  1.1  mrg 	LOAD_PTEH_VAL (FEMI_AREA_1, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    241  1.1  mrg 	LOAD_PTEL_VAL (FEMI_AREA_1, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    242  1.1  mrg 	SET_PTE (r1, r2, r3)
    243  1.1  mrg 
    244  1.1  mrg 	! Map a 1Mb page for data at 0x05000000
    245  1.1  mrg 	addi	r1, 16, r1
    246  1.1  mrg 	LOAD_PTEH_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    247  1.1  mrg 	LOAD_PTEL_VAL (FEMI_AREA_2, ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    248  1.1  mrg 	SET_PTE (r1, r2, r3)
    249  1.1  mrg 
    250  1.1  mrg 	! Map a 1Mb page for data at 0x05100000
    251  1.1  mrg 	addi	r1, 16, r1
    252  1.1  mrg 	LOAD_PTEH_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    253  1.1  mrg 	LOAD_PTEL_VAL ((FEMI_AREA_2+0x100000), ALIGN_1MB, PTE_CB_CACHEABLE_WB | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    254  1.1  mrg 	SET_PTE (r1, r2, r3)
    255  1.1  mrg 
    256  1.1  mrg 	! Map a 4K page for registers at 0x08000000
    257  1.1  mrg 	addi	r1, 16, r1
    258  1.1  mrg 	LOAD_PTEH_VAL (FEMI_CB, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    259  1.1  mrg 	LOAD_PTEL_VAL (FEMI_CB, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    260  1.1  mrg 	SET_PTE (r1, r2, r3)
    261  1.1  mrg 
    262  1.1  mrg 	! Map a 512M page for data at EMI
    263  1.1  mrg 	addi	r1, 16, r1
    264  1.1  mrg 	LOAD_PTEH_VAL (EMI_BASE, ALIGN_512MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    265  1.1  mrg 	LOAD_PTEL_VAL (EMI_BASE, ALIGN_512MB, PTE_CB_CACHEABLE_WB | PTE_SZ_512MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    266  1.1  mrg 	SET_PTE (r1, r2, r3)
    267  1.1  mrg 
    268  1.1  mrg 	! Map a 4K page for DYNACON at DYNACON_BASE
    269  1.1  mrg 	addi	r1, 16, r1
    270  1.1  mrg 	LOAD_PTEH_VAL (DYNACON_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    271  1.1  mrg 	LOAD_PTEL_VAL (DYNACON_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    272  1.1  mrg 	SET_PTE (r1, r2, r3)
    273  1.1  mrg 
    274  1.1  mrg 	! Map a 4K page for instructions at DM_DB_DLINK_BASE
    275  1.1  mrg 	addi	r1, 16, r1
    276  1.1  mrg 	LOAD_PTEH_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    277  1.1  mrg 	LOAD_PTEL_VAL (DM_DB_DLINK_BASE, ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    278  1.1  mrg 	SET_PTE (r1, r2, r3)
    279  1.1  mrg 
    280  1.1  mrg 	! Map a 4K page for data at DM_DB_DLINK_BASE+0x1000
    281  1.1  mrg 	addi	r1, 16, r1
    282  1.1  mrg 	LOAD_PTEH_VAL ((DM_DB_DLINK_BASE+0x1000), ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    283  1.1  mrg 	LOAD_PTEL_VAL ((DM_DB_DLINK_BASE+0x1000), ALIGN_4KB, PTE_CB_UNCACHEABLE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    284  1.1  mrg 	SET_PTE (r1, r2, r3)
    285  1.1  mrg 
    286  1.1  mrg 	! Map a 4K page for stack DM_DB_DLINK_BASE+0x2000
    287  1.1  mrg 	addi	r1, 16, r1
    288  1.1  mrg 	LOAD_PTEH_VAL ((DM_DB_DLINK_BASE+0x2000), ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    289  1.1  mrg 	LOAD_PTEL_VAL ((DM_DB_DLINK_BASE+0x2000), ALIGN_4KB, PTE_CB_CACHEABLE_WB | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    290  1.1  mrg 	SET_PTE (r1, r2, r3)
    291  1.1  mrg 
    292  1.1  mrg 	! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
    293  1.1  mrg 	! 0x0c000000 - 0x0c0fffff
    294  1.1  mrg 	addi	r1, 16, r1
    295  1.1  mrg 	LOAD_PTEH_VAL (DM_CB_DLINK_BASE, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    296  1.1  mrg 	LOAD_PTEL_VAL (DM_CB_DLINK_BASE, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    297  1.1  mrg 	SET_PTE (r1, r2, r3)
    298  1.1  mrg 
    299  1.1  mrg 	! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
    300  1.1  mrg 	! 0x0c100000 - 0x0c1fffff
    301  1.1  mrg 	addi	r1, 16, r1
    302  1.1  mrg 	LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    303  1.1  mrg 	LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x100000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    304  1.1  mrg 	SET_PTE (r1, r2, r3)
    305  1.1  mrg 
    306  1.1  mrg 	! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
    307  1.1  mrg 	! 0x0c200000 - 0x0c2fffff
    308  1.1  mrg 	addi	r1, 16, r1
    309  1.1  mrg 	LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x200000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    310  1.1  mrg 	LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x200000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    311  1.1  mrg 	SET_PTE (r1, r2, r3)
    312  1.1  mrg 
    313  1.1  mrg 	! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
    314  1.1  mrg 	! 0x0c400000 - 0x0c4fffff
    315  1.1  mrg 	addi	r1, 16, r1
    316  1.1  mrg 	LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x400000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    317  1.1  mrg 	LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x400000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    318  1.1  mrg 	SET_PTE (r1, r2, r3)
    319  1.1  mrg 
    320  1.1  mrg 	! Map a 1M page for DM_CB_BASE2 at DM_CB_DLINK
    321  1.1  mrg 	! 0x0c800000 - 0x0c8fffff
    322  1.1  mrg 	addi	r1, 16, r1
    323  1.1  mrg 	LOAD_PTEH_VAL ((DM_CB_DLINK_BASE+0x800000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    324  1.1  mrg 	LOAD_PTEL_VAL ((DM_CB_DLINK_BASE+0x800000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    325  1.1  mrg 	SET_PTE (r1, r2, r3)
    326  1.1  mrg 
    327  1.1  mrg 	! Map a 4K page for DMA control registers
    328  1.1  mrg 	addi	r1, 16, r1
    329  1.1  mrg 	LOAD_PTEH_VAL (DMA_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    330  1.1  mrg 	LOAD_PTEL_VAL (DMA_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    331  1.1  mrg 	SET_PTE (r1, r2, r3)
    332  1.1  mrg 
    333  1.1  mrg 	! Map lots of 4K pages for peripherals
    334  1.1  mrg 
    335  1.1  mrg 	! /* peripheral */
    336  1.1  mrg 	addi	r1, 16, r1
    337  1.1  mrg 	LOAD_PTEH_VAL (PERIPH_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    338  1.1  mrg 	LOAD_PTEL_VAL (PERIPH_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    339  1.1  mrg 	SET_PTE (r1, r2, r3)
    340  1.1  mrg 	! /* dmac */
    341  1.1  mrg 	addi	r1, 16, r1
    342  1.1  mrg 	LOAD_PTEH_VAL (DMAC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    343  1.1  mrg 	LOAD_PTEL_VAL (DMAC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    344  1.1  mrg 	SET_PTE (r1, r2, r3)
    345  1.1  mrg 	! /* intc */
    346  1.1  mrg 	addi	r1, 16, r1
    347  1.1  mrg 	LOAD_PTEH_VAL (INTC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    348  1.1  mrg 	LOAD_PTEL_VAL (INTC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    349  1.1  mrg 	SET_PTE (r1, r2, r3)
    350  1.1  mrg 	! /* rtc */
    351  1.1  mrg 	addi	r1, 16, r1
    352  1.1  mrg 	LOAD_PTEH_VAL (RTC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    353  1.1  mrg 	LOAD_PTEL_VAL (RTC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    354  1.1  mrg 	SET_PTE (r1, r2, r3)
    355  1.1  mrg 	! /* dmac */
    356  1.1  mrg 	addi	r1, 16, r1
    357  1.1  mrg 	LOAD_PTEH_VAL (TMU_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    358  1.1  mrg 	LOAD_PTEL_VAL (TMU_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    359  1.1  mrg 	SET_PTE (r1, r2, r3)
    360  1.1  mrg 	! /* scif */
    361  1.1  mrg 	addi	r1, 16, r1
    362  1.1  mrg 	LOAD_PTEH_VAL (SCIF_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    363  1.1  mrg 	LOAD_PTEL_VAL (SCIF_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    364  1.1  mrg 	SET_PTE (r1, r2, r3)
    365  1.1  mrg 	! /* cprc */
    366  1.1  mrg 	addi	r1, 16, r1
    367  1.1  mrg 	LOAD_PTEH_VAL (CPRC_BASE, ALIGN_4KB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    368  1.1  mrg 	LOAD_PTEL_VAL (CPRC_BASE, ALIGN_4KB, PTE_CB_DEVICE | PTE_SZ_4KB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    369  1.1  mrg 	SET_PTE (r1, r2, r3)
    370  1.1  mrg 
    371  1.1  mrg 	! Map CPU WPC registers
    372  1.1  mrg 	addi	r1, 16, r1
    373  1.1  mrg 	LOAD_PTEH_VAL (CPU_BASE, ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    374  1.1  mrg 	LOAD_PTEL_VAL (CPU_BASE, ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    375  1.1  mrg 	SET_PTE (r1, r2, r3)
    376  1.1  mrg 	addi	r1, 16, r1
    377  1.1  mrg 
    378  1.1  mrg 	LOAD_PTEH_VAL ((CPU_BASE+0x100000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    379  1.1  mrg 	LOAD_PTEL_VAL ((CPU_BASE+0x100000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    380  1.1  mrg 	SET_PTE (r1, r2, r3)
    381  1.1  mrg 
    382  1.1  mrg 	addi	r1, 16, r1
    383  1.1  mrg 	LOAD_PTEH_VAL ((CPU_BASE+0x200000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    384  1.1  mrg 	LOAD_PTEL_VAL ((CPU_BASE+0x200000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    385  1.1  mrg 	SET_PTE (r1, r2, r3)
    386  1.1  mrg 
    387  1.1  mrg 	addi	r1, 16, r1
    388  1.1  mrg 	LOAD_PTEH_VAL ((CPU_BASE+0x400000), ALIGN_1MB, PTE_ENABLED | PTE_NOT_SHARED, r25, r2)
    389  1.1  mrg 	LOAD_PTEL_VAL ((CPU_BASE+0x400000), ALIGN_1MB, PTE_CB_DEVICE | PTE_SZ_1MB | PTE_PRR | PTE_PRW | PTE_PRU, r25, r3)
    390  1.1  mrg 	SET_PTE (r1, r2, r3)
    391  1.1  mrg 
    392  1.1  mrg 	! Switch over to virtual addressing and enabled cache
    393  1.1  mrg 	getcon	sr, r1
    394  1.1  mrg 	movi	1, r2
    395  1.1  mrg 	shlli	r2, SR_BL_BIT, r2
    396  1.1  mrg 	or	r1, r2, r1
    397  1.1  mrg 	putcon	r1, ssr
    398  1.1  mrg 	getcon	sr, r1
    399  1.1  mrg 	movi	1, r2
    400  1.1  mrg 	shlli	r2, SR_MMU_BIT, r2
    401  1.1  mrg 	or	r1, r2, r1
    402  1.1  mrg 	putcon	r1, ssr
    403  1.1  mrg 	gettr	tr1, r1
    404  1.1  mrg 	putcon	r1, spc
    405  1.1  mrg 	synco
    406  1.1  mrg 	rte
    407  1.1  mrg 
    408  1.1  mrg 	! VM entry point.  From now on, we are in VM mode.
    409  1.1  mrg .vm_ep:
    410  1.1  mrg 
    411  1.1  mrg 	! Install the trap handler, by seeding vbr with the
    412  1.1  mrg 	! correct value, and by assigning sr.bl = 0.
    413  1.1  mrg 
    414  1.1  mrg 	LOAD_ADDR (vbr_start, r1)
    415  1.1  mrg 	putcon	r1, vbr
    416  1.1  mrg 	movi	~(1<<28), r1
    417  1.1  mrg 	getcon	sr, r2
    418  1.1  mrg 	and     r1, r2, r2
    419  1.1  mrg 	putcon	r2, sr
    420  1.1  mrg #endif /* MMU_SUPPORT */
    421  1.1  mrg 
    422  1.1  mrg 	pt/l	.Lzero_bss_loop, tr0
    423  1.1  mrg 	pt/l	_init, tr5
    424  1.1  mrg 	pt/l	___setup_argv_and_call_main, tr6
    425  1.1  mrg 	pt/l	_exit, tr7
    426  1.1  mrg 
    427  1.1  mrg 	! zero out bss
    428  1.1  mrg 	LOAD_ADDR (_edata, r0)
    429  1.1  mrg 	LOAD_ADDR (_end, r1)
    430  1.1  mrg .Lzero_bss_loop:
    431  1.1  mrg 	stx.q	r0, r63, r63
    432  1.1  mrg 	addi	r0, 8, r0
    433  1.1  mrg 	bgt/l	r1, r0, tr0
    434  1.1  mrg 
    435  1.1  mrg 	LOAD_ADDR (___data, r26)
    436  1.1  mrg 	LOAD_ADDR (___rodata, r27)
    437  1.1  mrg 
    438  1.1  mrg #ifdef __SH_FPU_ANY__
    439  1.1  mrg 	getcon	sr, r0
    440  1.1  mrg 	! enable the FP unit, by resetting SR.FD
    441  1.1  mrg 	! also zero out SR.FR, SR.SZ and SR.PR, as mandated by the ABI
    442  1.1  mrg 	movi	0, r1
    443  1.1  mrg 	shori	0xf000, r1
    444  1.1  mrg 	andc	r0, r1, r0
    445  1.1  mrg 	putcon	r0, sr
    446  1.1  mrg #if __SH5__ == 32
    447  1.1  mrg 	pt/l ___set_fpscr, tr0
    448  1.1  mrg 	movi	0, r4
    449  1.1  mrg 	blink	tr0, r18
    450  1.1  mrg #endif
    451  1.1  mrg #endif
    452  1.1  mrg 
    453  1.1  mrg 	! arrange for exit to call fini
    454  1.1  mrg 	pt/l	_atexit, tr1
    455  1.1  mrg 	LOAD_ADDR (_fini, r2)
    456  1.1  mrg 	blink	tr1, r18
    457  1.1  mrg 
    458  1.1  mrg 	! call init
    459  1.1  mrg 	blink	tr5, r18
    460  1.1  mrg 
    461  1.1  mrg 	! call the mainline
    462  1.1  mrg 	blink	tr6, r18
    463  1.1  mrg 
    464  1.1  mrg 	! call exit
    465  1.1  mrg 	blink	tr7, r18
    466  1.1  mrg 	! We should never return from _exit but in case we do we would enter the
    467  1.1  mrg 	! the following tight loop. This avoids executing any data that might follow.
    468  1.1  mrg limbo:
    469  1.1  mrg 	pt/l limbo, tr0
    470  1.1  mrg 	blink tr0, r63
    471  1.1  mrg 
    472  1.1  mrg #ifdef MMU_SUPPORT
    473  1.1  mrg 	! All these traps are handled in the same place.
    474  1.1  mrg 	.balign 256
    475  1.1  mrg vbr_start:
    476  1.1  mrg 	pt/l handler, tr0	! tr0 trashed.
    477  1.1  mrg 	blink tr0, r63
    478  1.1  mrg 	.balign 256
    479  1.1  mrg vbr_100:
    480  1.1  mrg 	pt/l handler, tr0	! tr0 trashed.
    481  1.1  mrg 	blink tr0, r63
    482  1.1  mrg vbr_100_end:
    483  1.1  mrg 	.balign 256
    484  1.1  mrg vbr_200:
    485  1.1  mrg 	pt/l handler, tr0	! tr0 trashed.
    486  1.1  mrg 	blink tr0, r63
    487  1.1  mrg 	.balign 256
    488  1.1  mrg vbr_300:
    489  1.1  mrg 	pt/l handler, tr0	! tr0 trashed.
    490  1.1  mrg 	blink tr0, r63
    491  1.1  mrg 	.balign 256
    492  1.1  mrg vbr_400:	! Should be at vbr+0x400
    493  1.1  mrg handler:
    494  1.1  mrg 	/* If the trap handler is there call it */
    495  1.1  mrg 	LOAD_ADDR (__superh_trap_handler, r2)
    496  1.1  mrg 	pta chandler,tr2
    497  1.1  mrg 	beq r2, r63, tr2 /* If zero, ie not present branch around to chandler */
    498  1.1  mrg 	/* Now call the trap handler with as much of the context unchanged as possible.
    499  1.1  mrg 	   Move trapping address into R18 to make it look like the trap point */
    500  1.1  mrg 	getcon spc, r18
    501  1.1  mrg 	pt/l __superh_trap_handler, tr0
    502  1.1  mrg 	blink tr0, r7
    503  1.1  mrg chandler:
    504  1.1  mrg 	getcon	spc, r62
    505  1.1  mrg 	getcon expevt, r2
    506  1.1  mrg 	pt/l	_exit, tr0
    507  1.1  mrg 	blink	tr0, r63
    508  1.1  mrg 
    509  1.1  mrg 	/* Simulated trap handler */
    510  1.1  mrg 	.section	.text..SHmedia32,"ax"
    511  1.1  mrg gcc2_compiled.:
    512  1.1  mrg 	.section	.debug_abbrev
    513  1.1  mrg .Ldebug_abbrev0:
    514  1.1  mrg 	.section	.text..SHmedia32
    515  1.1  mrg .Ltext0:
    516  1.1  mrg 	.section	.debug_info
    517  1.1  mrg .Ldebug_info0:
    518  1.1  mrg 	.section	.debug_line
    519  1.1  mrg .Ldebug_line0:
    520  1.1  mrg 	.section	.text..SHmedia32,"ax"
    521  1.1  mrg 	.align 5
    522  1.1  mrg 	.global	__superh_trap_handler
    523  1.1  mrg 	.type	__superh_trap_handler,@function
    524  1.1  mrg __superh_trap_handler:
    525  1.1  mrg .LFB1:
    526  1.1  mrg 	ptabs	r18, tr0
    527  1.1  mrg 	addi.l	r15, -8, r15
    528  1.1  mrg 	st.l	r15, 4, r14
    529  1.1  mrg 	addi.l	r15, -8, r15
    530  1.1  mrg 	add.l	r15, r63, r14
    531  1.1  mrg 	st.l	r14, 0, r2
    532  1.1  mrg 	 ptabs r7, tr0
    533  1.1  mrg 	addi.l	r14, 8, r14
    534  1.1  mrg 	add.l	r14, r63, r15
    535  1.1  mrg 	ld.l	r15, 4, r14
    536  1.1  mrg 	addi.l	r15, 8, r15
    537  1.1  mrg 	blink	tr0, r63
    538  1.1  mrg .LFE1:
    539  1.1  mrg .Lfe1:
    540  1.1  mrg 	.size	__superh_trap_handler,.Lfe1-__superh_trap_handler
    541  1.1  mrg 
    542  1.1  mrg 	.section	.text..SHmedia32
    543  1.1  mrg .Letext0:
    544  1.1  mrg 
    545  1.1  mrg 	.section	.debug_info
    546  1.1  mrg 	.ualong	0xa7
    547  1.1  mrg 	.uaword	0x2
    548  1.1  mrg 	.ualong	.Ldebug_abbrev0
    549  1.1  mrg 	.byte	0x4
    550  1.1  mrg 	.byte	0x1
    551  1.1  mrg 	.ualong	.Ldebug_line0
    552  1.1  mrg 	.ualong	.Letext0
    553  1.1  mrg 	.ualong	.Ltext0
    554  1.1  mrg 	.string	"trap_handler.c"
    555  1.1  mrg 
    556  1.1  mrg 	.string	"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    557  1.1  mrg 
    558  1.1  mrg 	.string	"GNU C 2.97-sh5-010522"
    559  1.1  mrg 
    560  1.1  mrg 	.byte	0x1
    561  1.1  mrg 	.byte	0x2
    562  1.1  mrg 	.ualong	0x9a
    563  1.1  mrg 	.byte	0x1
    564  1.1  mrg 	.string	"_superh_trap_handler"
    565  1.1  mrg 
    566  1.1  mrg 	.byte	0x1
    567  1.1  mrg 	.byte	0x2
    568  1.1  mrg 	.byte	0x1
    569  1.1  mrg 	.ualong	.LFB1
    570  1.1  mrg 	.ualong	.LFE1
    571  1.1  mrg 	.byte	0x1
    572  1.1  mrg 	.byte	0x5e
    573  1.1  mrg 	.byte	0x3
    574  1.1  mrg 	.string	"trap_reason"
    575  1.1  mrg 
    576  1.1  mrg 	.byte	0x1
    577  1.1  mrg 	.byte	0x1
    578  1.1  mrg 	.ualong	0x9a
    579  1.1  mrg 	.byte	0x2
    580  1.1  mrg 	.byte	0x91
    581  1.1  mrg 	.byte	0x0
    582  1.1  mrg 	.byte	0x0
    583  1.1  mrg 	.byte	0x4
    584  1.1  mrg 	.string	"unsigned int"
    585  1.1  mrg 
    586  1.1  mrg 	.byte	0x4
    587  1.1  mrg 	.byte	0x7
    588  1.1  mrg 	.byte	0x0
    589  1.1  mrg 
    590  1.1  mrg 	.section	.debug_abbrev
    591  1.1  mrg 	.byte	0x1
    592  1.1  mrg 	.byte	0x11
    593  1.1  mrg 	.byte	0x1
    594  1.1  mrg 	.byte	0x10
    595  1.1  mrg 	.byte	0x6
    596  1.1  mrg 	.byte	0x12
    597  1.1  mrg 	.byte	0x1
    598  1.1  mrg 	.byte	0x11
    599  1.1  mrg 	.byte	0x1
    600  1.1  mrg 	.byte	0x3
    601  1.1  mrg 	.byte	0x8
    602  1.1  mrg 	.byte	0x1b
    603  1.1  mrg 	.byte	0x8
    604  1.1  mrg 	.byte	0x25
    605  1.1  mrg 	.byte	0x8
    606  1.1  mrg 	.byte	0x13
    607  1.1  mrg 	.byte	0xb
    608  1.1  mrg 	.byte	0,0
    609  1.1  mrg 	.byte	0x2
    610  1.1  mrg 	.byte	0x2e
    611  1.1  mrg 	.byte	0x1
    612  1.1  mrg 	.byte	0x1
    613  1.1  mrg 	.byte	0x13
    614  1.1  mrg 	.byte	0x3f
    615  1.1  mrg 	.byte	0xc
    616  1.1  mrg 	.byte	0x3
    617  1.1  mrg 	.byte	0x8
    618  1.1  mrg 	.byte	0x3a
    619  1.1  mrg 	.byte	0xb
    620  1.1  mrg 	.byte	0x3b
    621  1.1  mrg 	.byte	0xb
    622  1.1  mrg 	.byte	0x27
    623  1.1  mrg 	.byte	0xc
    624  1.1  mrg 	.byte	0x11
    625  1.1  mrg 	.byte	0x1
    626  1.1  mrg 	.byte	0x12
    627  1.1  mrg 	.byte	0x1
    628  1.1  mrg 	.byte	0x40
    629  1.1  mrg 	.byte	0xa
    630  1.1  mrg 	.byte	0,0
    631  1.1  mrg 	.byte	0x3
    632  1.1  mrg 	.byte	0x5
    633  1.1  mrg 	.byte	0x0
    634  1.1  mrg 	.byte	0x3
    635  1.1  mrg 	.byte	0x8
    636  1.1  mrg 	.byte	0x3a
    637  1.1  mrg 	.byte	0xb
    638  1.1  mrg 	.byte	0x3b
    639  1.1  mrg 	.byte	0xb
    640  1.1  mrg 	.byte	0x49
    641  1.1  mrg 	.byte	0x13
    642  1.1  mrg 	.byte	0x2
    643  1.1  mrg 	.byte	0xa
    644  1.1  mrg 	.byte	0,0
    645  1.1  mrg 	.byte	0x4
    646  1.1  mrg 	.byte	0x24
    647  1.1  mrg 	.byte	0x0
    648  1.1  mrg 	.byte	0x3
    649  1.1  mrg 	.byte	0x8
    650  1.1  mrg 	.byte	0xb
    651  1.1  mrg 	.byte	0xb
    652  1.1  mrg 	.byte	0x3e
    653  1.1  mrg 	.byte	0xb
    654  1.1  mrg 	.byte	0,0
    655  1.1  mrg 	.byte	0
    656  1.1  mrg 
    657  1.1  mrg 	.section	.debug_pubnames
    658  1.1  mrg 	.ualong	0x27
    659  1.1  mrg 	.uaword	0x2
    660  1.1  mrg 	.ualong	.Ldebug_info0
    661  1.1  mrg 	.ualong	0xab
    662  1.1  mrg 	.ualong	0x5b
    663  1.1  mrg 	.string	"_superh_trap_handler"
    664  1.1  mrg 
    665  1.1  mrg 	.ualong	0x0
    666  1.1  mrg 
    667  1.1  mrg 	.section	.debug_aranges
    668  1.1  mrg 	.ualong	0x1c
    669  1.1  mrg 	.uaword	0x2
    670  1.1  mrg 	.ualong	.Ldebug_info0
    671  1.1  mrg 	.byte	0x4
    672  1.1  mrg 	.byte	0x0
    673  1.1  mrg 	.uaword	0x0,0
    674  1.1  mrg 	.ualong	.Ltext0
    675  1.1  mrg 	.ualong	.Letext0-.Ltext0
    676  1.1  mrg 	.ualong	0x0
    677  1.1  mrg 	.ualong	0x0
    678  1.1  mrg 	.ident	"GCC: (GNU) 2.97-sh5-010522"
    679  1.1  mrg #endif /* MMU_SUPPORT */
    680  1.1  mrg #else /* ! __SH5__ */
    681  1.1  mrg 
    682  1.1  mrg 	! make a place to keep any previous value of the vbr register
    683  1.1  mrg 	! this will only have a value if it has been set by redboot (for example)
    684  1.1  mrg 	.section .bss
    685  1.1  mrg old_vbr:
    686  1.1  mrg 	.long 0
    687  1.1  mrg #ifdef PROFILE
    688  1.1  mrg profiling_enabled:
    689  1.1  mrg 	.long 0
    690  1.1  mrg #endif
    691  1.1  mrg 
    692  1.1  mrg 
    693  1.1  mrg 	.section .text
    694  1.1  mrg 	.global	start
    695  1.1  mrg 	.import ___rtos_profiler_start_timer
    696  1.1  mrg 	.weak   ___rtos_profiler_start_timer
    697  1.1  mrg start:
    698  1.1  mrg 	mov.l	stack_k,r15
    699  1.1  mrg 
    700  1.1  mrg #if defined (__SH3__) || (defined (__SH_FPU_ANY__) && ! defined (__SH2A__)) || defined (__SH4_NOFPU__)
    701  1.1  mrg #define VBR_SETUP
    702  1.1  mrg 	! before zeroing the bss ...
    703  1.1  mrg 	! if the vbr is already set to vbr_start then the program has been restarted
    704  1.1  mrg 	! (i.e. it is not the first time the program has been run since reset)
    705  1.1  mrg 	! reset the vbr to its old value before old_vbr (in bss) is wiped
    706  1.1  mrg 	! this ensures that the later code does not create a circular vbr chain
    707  1.1  mrg 	stc	vbr, r1
    708  1.1  mrg 	mov.l	vbr_start_k, r2
    709  1.1  mrg 	cmp/eq	r1, r2
    710  1.1  mrg 	bf	0f
    711  1.1  mrg 	! reset the old vbr value
    712  1.1  mrg 	mov.l	old_vbr_k, r1
    713  1.1  mrg 	mov.l	@r1, r2
    714  1.1  mrg 	ldc	r2, vbr
    715  1.1  mrg 0:
    716  1.1  mrg #endif /* VBR_SETUP */
    717  1.1  mrg 
    718  1.1  mrg 	! zero out bss
    719  1.1  mrg 	mov.l	edata_k,r0
    720  1.1  mrg 	mov.l	end_k,r1
    721  1.1  mrg 	mov	#0,r2
    722  1.1  mrg start_l:
    723  1.1  mrg 	mov.l	r2,@r0
    724  1.1  mrg 	add	#4,r0
    725  1.1  mrg 	cmp/ge	r0,r1
    726  1.1  mrg 	bt	start_l
    727  1.1  mrg 
    728  1.1  mrg #if defined (__SH_FPU_ANY__)
    729  1.1  mrg 	mov.l set_fpscr_k, r1
    730  1.1  mrg 	mov #4,r4
    731  1.1  mrg 	jsr @r1
    732  1.1  mrg 	shll16 r4	! Set DN bit (flush denormal inputs to zero)
    733  1.1  mrg 	lds r3,fpscr	! Switch to default precision
    734  1.1  mrg #endif /* defined (__SH_FPU_ANY__) */
    735  1.1  mrg 
    736  1.1  mrg #ifdef VBR_SETUP
    737  1.1  mrg 	! save the existing contents of the vbr
    738  1.1  mrg 	! there will only be a prior value when using something like redboot
    739  1.1  mrg 	! otherwise it will be zero
    740  1.1  mrg 	stc	vbr, r1
    741  1.1  mrg 	mov.l	old_vbr_k, r2
    742  1.1  mrg 	mov.l	r1, @r2
    743  1.1  mrg 	! setup vbr
    744  1.1  mrg 	mov.l	vbr_start_k, r1
    745  1.1  mrg 	ldc	r1,vbr
    746  1.1  mrg #endif /* VBR_SETUP */
    747  1.1  mrg 
    748  1.1  mrg 	! if an rtos is exporting a timer start fn,
    749  1.1  mrg 	! then pick up an SR which does not enable ints
    750  1.1  mrg 	! (the rtos will take care of this)
    751  1.1  mrg 	mov.l rtos_start_fn, r0
    752  1.1  mrg 	mov.l sr_initial_bare, r1
    753  1.1  mrg 	tst	r0, r0
    754  1.1  mrg 	bt	set_sr
    755  1.1  mrg 
    756  1.1  mrg 	mov.l sr_initial_rtos, r1
    757  1.1  mrg 
    758  1.1  mrg set_sr:
    759  1.1  mrg 	! Set status register (sr)
    760  1.1  mrg 	ldc	r1, sr
    761  1.1  mrg 
    762  1.1  mrg 	! arrange for exit to call fini
    763  1.1  mrg 	mov.l	atexit_k,r0
    764  1.1  mrg 	mov.l	fini_k,r4
    765  1.1  mrg 	jsr	@r0
    766  1.1  mrg 	nop
    767  1.1  mrg 
    768  1.1  mrg #ifdef PROFILE
    769  1.1  mrg 	! arrange for exit to call _mcleanup (via stop_profiling)
    770  1.1  mrg 	mova    stop_profiling,r0
    771  1.1  mrg 	mov.l   atexit_k,r1
    772  1.1  mrg 	jsr     @r1
    773  1.1  mrg 	mov	r0, r4
    774  1.1  mrg 
    775  1.1  mrg 	! Call profiler startup code
    776  1.1  mrg 	mov.l monstartup_k, r0
    777  1.1  mrg 	mov.l start_k, r4
    778  1.1  mrg 	mov.l etext_k, r5
    779  1.1  mrg 	jsr @r0
    780  1.1  mrg 	nop
    781  1.1  mrg 
    782  1.1  mrg 	! enable profiling trap
    783  1.1  mrg 	! until now any trap 33s will have been ignored
    784  1.1  mrg 	! This means that all library functions called before this point
    785  1.1  mrg 	! (directly or indirectly) may have the profiling trap at the start.
    786  1.1  mrg 	! Therefore, only mcount itself may not have the extra header.
    787  1.1  mrg 	mov.l	profiling_enabled_k2, r0
    788  1.1  mrg 	mov	#1, r1
    789  1.1  mrg 	mov.l	r1, @r0
    790  1.1  mrg #endif /* PROFILE */
    791  1.1  mrg 
    792  1.1  mrg 	! call init
    793  1.1  mrg 	mov.l	init_k,r0
    794  1.1  mrg 	jsr	@r0
    795  1.1  mrg 	nop
    796  1.1  mrg 
    797  1.1  mrg 	! call the mainline
    798  1.1  mrg 	mov.l	main_k,r0
    799  1.1  mrg 	jsr	@r0
    800  1.1  mrg 	nop
    801  1.1  mrg 
    802  1.1  mrg 	! call exit
    803  1.1  mrg 	mov	r0,r4
    804  1.1  mrg 	mov.l	exit_k,r0
    805  1.1  mrg 	jsr	@r0
    806  1.1  mrg 	nop
    807  1.1  mrg 
    808  1.1  mrg 		.balign 4
    809  1.1  mrg #ifdef PROFILE
    810  1.1  mrg stop_profiling:
    811  1.1  mrg 	# stop mcount counting
    812  1.1  mrg 	mov.l	profiling_enabled_k2, r0
    813  1.1  mrg 	mov	#0, r1
    814  1.1  mrg 	mov.l	r1, @r0
    815  1.1  mrg 
    816  1.1  mrg 	# call mcleanup
    817  1.1  mrg 	mov.l	mcleanup_k, r0
    818  1.1  mrg 	jmp	@r0
    819  1.1  mrg 	nop
    820  1.1  mrg 
    821  1.1  mrg 		.balign 4
    822  1.1  mrg mcleanup_k:
    823  1.1  mrg 	.long __mcleanup
    824  1.1  mrg monstartup_k:
    825  1.1  mrg 	.long ___monstartup
    826  1.1  mrg profiling_enabled_k2:
    827  1.1  mrg 	.long profiling_enabled
    828  1.1  mrg start_k:
    829  1.1  mrg 	.long _start
    830  1.1  mrg etext_k:
    831  1.1  mrg 	.long __etext
    832  1.1  mrg #endif /* PROFILE */
    833  1.1  mrg 
    834  1.1  mrg 	.align 2
    835  1.1  mrg #if defined (__SH_FPU_ANY__)
    836  1.1  mrg set_fpscr_k:
    837  1.1  mrg 	.long	___set_fpscr
    838  1.1  mrg #endif /*  defined (__SH_FPU_ANY__) */
    839  1.1  mrg 
    840  1.1  mrg stack_k:
    841  1.1  mrg 	.long	_stack
    842  1.1  mrg edata_k:
    843  1.1  mrg 	.long	_edata
    844  1.1  mrg end_k:
    845  1.1  mrg 	.long	_end
    846  1.1  mrg main_k:
    847  1.1  mrg 	.long	___setup_argv_and_call_main
    848  1.1  mrg exit_k:
    849  1.1  mrg 	.long	_exit
    850  1.1  mrg atexit_k:
    851  1.1  mrg 	.long	_atexit
    852  1.1  mrg init_k:
    853  1.1  mrg 	.long	_init
    854  1.1  mrg fini_k:
    855  1.1  mrg 	.long	_fini
    856  1.1  mrg #ifdef VBR_SETUP
    857  1.1  mrg old_vbr_k:
    858  1.1  mrg 	.long	old_vbr
    859  1.1  mrg vbr_start_k:
    860  1.1  mrg 	.long	vbr_start
    861  1.1  mrg #endif /* VBR_SETUP */
    862  1.1  mrg 
    863  1.1  mrg sr_initial_rtos:
    864  1.1  mrg 	! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
    865  1.1  mrg 	! Whether profiling or not, keep interrupts masked,
    866  1.1  mrg 	! the RTOS will enable these if required.
    867  1.1  mrg 	.long 0x600000f1
    868  1.1  mrg 
    869  1.1  mrg rtos_start_fn:
    870  1.1  mrg 	.long ___rtos_profiler_start_timer
    871  1.1  mrg 
    872  1.1  mrg #ifdef PROFILE
    873  1.1  mrg sr_initial_bare:
    874  1.1  mrg 	! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
    875  1.1  mrg 	! For bare machine, we need to enable interrupts to get profiling working
    876  1.1  mrg 	.long 0x60000001
    877  1.1  mrg #else
    878  1.1  mrg 
    879  1.1  mrg sr_initial_bare:
    880  1.1  mrg 	! Privileged mode RB 1 BL 0. Keep BL 0 to allow default trap handlers to work.
    881  1.1  mrg 	! Keep interrupts disabled - the application will enable as required.
    882  1.1  mrg 	.long 0x600000f1
    883  1.1  mrg #endif
    884  1.1  mrg 
    885  1.1  mrg 	! supplied for backward compatibility only, in case of linking
    886  1.1  mrg 	! code whose main() was compiled with an older version of GCC.
    887  1.1  mrg 	.global ___main
    888  1.1  mrg ___main:
    889  1.1  mrg 	rts
    890  1.1  mrg 	nop
    891  1.1  mrg #ifdef VBR_SETUP
    892  1.1  mrg ! Exception handlers
    893  1.1  mrg 	.section .text.vbr, "ax"
    894  1.1  mrg vbr_start:
    895  1.1  mrg 
    896  1.1  mrg 	.org 0x100
    897  1.1  mrg vbr_100:
    898  1.1  mrg #ifdef PROFILE
    899  1.1  mrg 	! Note on register usage.
    900  1.1  mrg 	! we use r0..r3 as scratch in this code. If we are here due to a trapa for profiling
    901  1.1  mrg 	! then this is OK as we are just before executing any function code.
    902  1.1  mrg 	! The other r4..r7 we save explicityl on the stack
    903  1.1  mrg 	! Remaining registers are saved by normal ABI conventions and we assert we do not
    904  1.1  mrg 	! use floating point registers.
    905  1.1  mrg 	mov.l expevt_k1, r1
    906  1.1  mrg 	mov.l @r1, r1
    907  1.1  mrg 	mov.l event_mask, r0
    908  1.1  mrg 	and r0,r1
    909  1.1  mrg 	mov.l trapcode_k, r2
    910  1.1  mrg 	cmp/eq r1,r2
    911  1.1  mrg 	bt 1f
    912  1.1  mrg 	bra handler_100   ! if not a trapa, go to default handler
    913  1.1  mrg 	nop
    914  1.1  mrg 1:
    915  1.1  mrg 	mov.l trapa_k, r0
    916  1.1  mrg 	mov.l @r0, r0
    917  1.1  mrg 	shlr2 r0      ! trapa code is shifted by 2.
    918  1.1  mrg 	cmp/eq #33, r0
    919  1.1  mrg 	bt 2f
    920  1.1  mrg 	bra handler_100
    921  1.1  mrg 	nop
    922  1.1  mrg 2:
    923  1.1  mrg 
    924  1.1  mrg 	! If here then it looks like we have trap #33
    925  1.1  mrg 	! Now we need to call mcount with the following convention
    926  1.1  mrg 	! Save and restore r4..r7
    927  1.1  mrg 	mov.l	r4,@-r15
    928  1.1  mrg 	mov.l	r5,@-r15
    929  1.1  mrg 	mov.l	r6,@-r15
    930  1.1  mrg 	mov.l	r7,@-r15
    931  1.1  mrg 	sts.l	pr,@-r15
    932  1.1  mrg 
    933  1.1  mrg 	! r4 is frompc.
    934  1.1  mrg 	! r5 is selfpc
    935  1.1  mrg 	! r0 is the branch back address.
    936  1.1  mrg 	! The code sequence emitted by gcc for the profiling trap is
    937  1.1  mrg 	! .align 2
    938  1.1  mrg 	! trapa #33
    939  1.1  mrg 	! .align 2
    940  1.1  mrg 	! .long lab Where lab is planted by the compiler. This is the address
    941  1.1  mrg 	! of a datum that needs to be incremented.
    942  1.1  mrg 	sts pr,  r4     ! frompc
    943  1.1  mrg 	stc spc, r5	! selfpc
    944  1.1  mrg 	mov #2, r2
    945  1.1  mrg 	not r2, r2      ! pattern to align to 4
    946  1.1  mrg 	and r2, r5      ! r5 now has aligned address
    947  1.1  mrg !	add #4, r5      ! r5 now has address of address
    948  1.1  mrg 	mov r5, r2      ! Remember it.
    949  1.1  mrg !	mov.l @r5, r5   ! r5 has value of lable (lab in above example)
    950  1.1  mrg 	add #8, r2
    951  1.1  mrg 	ldc r2, spc     ! our return address avoiding address word
    952  1.1  mrg 
    953  1.1  mrg 	! only call mcount if profiling is enabled
    954  1.1  mrg 	mov.l profiling_enabled_k, r0
    955  1.1  mrg 	mov.l @r0, r0
    956  1.1  mrg 	cmp/eq #0, r0
    957  1.1  mrg 	bt 3f
    958  1.1  mrg 	! call mcount
    959  1.1  mrg 	mov.l mcount_k, r2
    960  1.1  mrg 	jsr @r2
    961  1.1  mrg 	nop
    962  1.1  mrg 3:
    963  1.1  mrg 	lds.l @r15+,pr
    964  1.1  mrg 	mov.l @r15+,r7
    965  1.1  mrg 	mov.l @r15+,r6
    966  1.1  mrg 	mov.l @r15+,r5
    967  1.1  mrg 	mov.l @r15+,r4
    968  1.1  mrg 	rte
    969  1.1  mrg 	nop
    970  1.1  mrg 	.balign 4
    971  1.1  mrg event_mask:
    972  1.1  mrg 	.long 0xfff
    973  1.1  mrg trapcode_k:
    974  1.1  mrg 	.long 0x160
    975  1.1  mrg expevt_k1:
    976  1.1  mrg 	.long 0xff000024 ! Address of expevt
    977  1.1  mrg trapa_k:
    978  1.1  mrg 	.long 0xff000020
    979  1.1  mrg mcount_k:
    980  1.1  mrg 	.long __call_mcount
    981  1.1  mrg profiling_enabled_k:
    982  1.1  mrg 	.long profiling_enabled
    983  1.1  mrg #endif
    984  1.1  mrg 	! Non profiling case.
    985  1.1  mrg handler_100:
    986  1.1  mrg 	mov.l 2f, r0     ! load the old vbr setting (if any)
    987  1.1  mrg 	mov.l @r0, r0
    988  1.1  mrg 	cmp/eq #0, r0
    989  1.1  mrg 	bf 1f
    990  1.1  mrg 	! no previous vbr - jump to own generic handler
    991  1.1  mrg 	bra handler
    992  1.1  mrg 	nop
    993  1.1  mrg 1:	! there was a previous handler - chain them
    994  1.1  mrg 	add #0x7f, r0	 ! 0x7f
    995  1.1  mrg 	add #0x7f, r0	 ! 0xfe
    996  1.1  mrg 	add #0x2, r0     ! add 0x100 without corrupting another register
    997  1.1  mrg 	jmp @r0
    998  1.1  mrg 	nop
    999  1.1  mrg 	.balign 4
   1000  1.1  mrg 2:
   1001  1.1  mrg 	.long old_vbr
   1002  1.1  mrg 
   1003  1.1  mrg 	.org 0x400
   1004  1.1  mrg vbr_400:	! Should be at vbr+0x400
   1005  1.1  mrg 	mov.l 2f, r0     ! load the old vbr setting (if any)
   1006  1.1  mrg 	mov.l @r0, r0
   1007  1.1  mrg 	cmp/eq #0, r0
   1008  1.1  mrg 	! no previous vbr - jump to own generic handler
   1009  1.1  mrg 	bt handler
   1010  1.1  mrg 	! there was a previous handler - chain them
   1011  1.1  mrg 	rotcr r0
   1012  1.1  mrg 	rotcr r0
   1013  1.1  mrg 	add #0x7f, r0	 ! 0x1fc
   1014  1.1  mrg 	add #0x7f, r0	 ! 0x3f8
   1015  1.1  mrg 	add #0x02, r0	 ! 0x400
   1016  1.1  mrg 	rotcl r0
   1017  1.1  mrg 	rotcl r0	 ! Add 0x400 without corrupting another register
   1018  1.1  mrg 	jmp @r0
   1019  1.1  mrg 	nop
   1020  1.1  mrg 	.balign 4
   1021  1.1  mrg 2:
   1022  1.1  mrg 	.long old_vbr
   1023  1.1  mrg handler:
   1024  1.1  mrg 	/* If the trap handler is there call it */
   1025  1.1  mrg 	mov.l	superh_trap_handler_k, r0
   1026  1.1  mrg 	cmp/eq	#0, r0       ! True if zero.
   1027  1.1  mrg 	bf 3f
   1028  1.1  mrg 	bra   chandler
   1029  1.1  mrg 	nop
   1030  1.1  mrg 3:
   1031  1.1  mrg 	! Here handler available, call it.
   1032  1.1  mrg 	/* Now call the trap handler with as much of the context unchanged as possible.
   1033  1.1  mrg 	   Move trapping address into PR to make it look like the trap point */
   1034  1.1  mrg 	stc spc, r1
   1035  1.1  mrg 	lds r1, pr
   1036  1.1  mrg 	mov.l expevt_k, r4
   1037  1.1  mrg 	mov.l @r4, r4 ! r4 is value of expevt, first parameter.
   1038  1.1  mrg 	mov r1, r5   ! Remember trapping pc.
   1039  1.1  mrg 	mov r1, r6   ! Remember trapping pc.
   1040  1.1  mrg 	mov.l chandler_k, r1
   1041  1.1  mrg 	mov.l superh_trap_handler_k, r2
   1042  1.1  mrg 	! jmp to trap handler to avoid disturbing pr.
   1043  1.1  mrg 	jmp @r2
   1044  1.1  mrg 	nop
   1045  1.1  mrg 
   1046  1.1  mrg 	.org 0x600
   1047  1.1  mrg vbr_600:
   1048  1.1  mrg #ifdef PROFILE
   1049  1.1  mrg 	! Should be at vbr+0x600
   1050  1.1  mrg 	! Now we are in the land of interrupts so need to save more state.
   1051  1.1  mrg 	! Save register state
   1052  1.1  mrg 	mov.l interrupt_stack_k, r15 ! r15 has been saved to sgr.
   1053  1.1  mrg 	mov.l	r0,@-r15
   1054  1.1  mrg 	mov.l	r1,@-r15
   1055  1.1  mrg 	mov.l	r2,@-r15
   1056  1.1  mrg 	mov.l	r3,@-r15
   1057  1.1  mrg 	mov.l	r4,@-r15
   1058  1.1  mrg 	mov.l	r5,@-r15
   1059  1.1  mrg 	mov.l	r6,@-r15
   1060  1.1  mrg 	mov.l	r7,@-r15
   1061  1.1  mrg 	sts.l	pr,@-r15
   1062  1.1  mrg 	sts.l	mach,@-r15
   1063  1.1  mrg 	sts.l	macl,@-r15
   1064  1.1  mrg #if defined(__SH_FPU_ANY__)
   1065  1.1  mrg 	! Save fpul and fpscr, save fr0-fr7 in 64 bit mode
   1066  1.1  mrg 	! and set the pervading precision for the timer_handler
   1067  1.1  mrg 	mov	#0,r0
   1068  1.1  mrg 	sts.l	fpul,@-r15
   1069  1.1  mrg 	sts.l	fpscr,@-r15
   1070  1.1  mrg 	lds	r0,fpscr	! Clear fpscr
   1071  1.1  mrg 	fmov	fr0,@-r15
   1072  1.1  mrg 	fmov	fr1,@-r15
   1073  1.1  mrg 	fmov	fr2,@-r15
   1074  1.1  mrg 	fmov	fr3,@-r15
   1075  1.1  mrg 	mov.l	pervading_precision_k,r0
   1076  1.1  mrg 	fmov	fr4,@-r15
   1077  1.1  mrg 	fmov	fr5,@-r15
   1078  1.1  mrg 	mov.l	@r0,r0
   1079  1.1  mrg 	fmov	fr6,@-r15
   1080  1.1  mrg 	fmov	fr7,@-r15
   1081  1.1  mrg 	lds	r0,fpscr
   1082  1.1  mrg #endif /* __SH_FPU_ANY__ */
   1083  1.1  mrg 	! Pass interrupted pc to timer_handler as first parameter (r4).
   1084  1.1  mrg 	stc    spc, r4
   1085  1.1  mrg 	mov.l timer_handler_k, r0
   1086  1.1  mrg 	jsr @r0
   1087  1.1  mrg 	nop
   1088  1.1  mrg #if defined(__SH_FPU_ANY__)
   1089  1.1  mrg 	mov	#0,r0
   1090  1.1  mrg 	lds	r0,fpscr	! Clear the fpscr
   1091  1.1  mrg 	fmov	@r15+,fr7
   1092  1.1  mrg 	fmov	@r15+,fr6
   1093  1.1  mrg 	fmov	@r15+,fr5
   1094  1.1  mrg 	fmov	@r15+,fr4
   1095  1.1  mrg 	fmov	@r15+,fr3
   1096  1.1  mrg 	fmov	@r15+,fr2
   1097  1.1  mrg 	fmov	@r15+,fr1
   1098  1.1  mrg 	fmov	@r15+,fr0
   1099  1.1  mrg 	lds.l	@r15+,fpscr
   1100  1.1  mrg 	lds.l	@r15+,fpul
   1101  1.1  mrg #endif /* __SH_FPU_ANY__ */
   1102  1.1  mrg 	lds.l @r15+,macl
   1103  1.1  mrg 	lds.l @r15+,mach
   1104  1.1  mrg 	lds.l @r15+,pr
   1105  1.1  mrg 	mov.l @r15+,r7
   1106  1.1  mrg 	mov.l @r15+,r6
   1107  1.1  mrg 	mov.l @r15+,r5
   1108  1.1  mrg 	mov.l @r15+,r4
   1109  1.1  mrg 	mov.l @r15+,r3
   1110  1.1  mrg 	mov.l @r15+,r2
   1111  1.1  mrg 	mov.l @r15+,r1
   1112  1.1  mrg 	mov.l @r15+,r0
   1113  1.1  mrg 	stc sgr, r15    ! Restore r15, destroyed by this sequence.
   1114  1.1  mrg 	rte
   1115  1.1  mrg 	nop
   1116  1.1  mrg #if defined(__SH_FPU_ANY__)
   1117  1.1  mrg 	.balign 4
   1118  1.1  mrg pervading_precision_k:
   1119  1.1  mrg #define CONCAT1(A,B) A##B
   1120  1.1  mrg #define CONCAT(A,B) CONCAT1(A,B)
   1121  1.1  mrg 	.long CONCAT(__USER_LABEL_PREFIX__,__fpscr_values)+4
   1122  1.1  mrg #endif
   1123  1.1  mrg #else
   1124  1.1  mrg 	mov.l 2f, r0     ! Load the old vbr setting (if any).
   1125  1.1  mrg 	mov.l @r0, r0
   1126  1.1  mrg 	cmp/eq #0, r0
   1127  1.1  mrg 	! no previous vbr - jump to own handler
   1128  1.1  mrg 	bt chandler
   1129  1.1  mrg 	! there was a previous handler - chain them
   1130  1.1  mrg 	rotcr r0
   1131  1.1  mrg 	rotcr r0
   1132  1.1  mrg 	add #0x7f, r0	 ! 0x1fc
   1133  1.1  mrg 	add #0x7f, r0	 ! 0x3f8
   1134  1.1  mrg 	add #0x7f, r0	 ! 0x5f4
   1135  1.1  mrg 	add #0x03, r0	 ! 0x600
   1136  1.1  mrg 	rotcl r0
   1137  1.1  mrg 	rotcl r0	 ! Add 0x600 without corrupting another register
   1138  1.1  mrg 	jmp @r0
   1139  1.1  mrg 	nop
   1140  1.1  mrg 	.balign 4
   1141  1.1  mrg 2:
   1142  1.1  mrg 	.long old_vbr
   1143  1.1  mrg #endif	 /* PROFILE code */
   1144  1.1  mrg chandler:
   1145  1.1  mrg 	mov.l expevt_k, r4
   1146  1.1  mrg 	mov.l @r4, r4 ! r4 is value of expevt hence making this the return code
   1147  1.1  mrg 	mov.l handler_exit_k,r0
   1148  1.1  mrg 	jsr   @r0
   1149  1.1  mrg 	nop
   1150  1.1  mrg 	! We should never return from _exit but in case we do we would enter the
   1151  1.1  mrg 	! the following tight loop
   1152  1.1  mrg limbo:
   1153  1.1  mrg 	bra limbo
   1154  1.1  mrg 	nop
   1155  1.1  mrg 	.balign 4
   1156  1.1  mrg #ifdef PROFILE
   1157  1.1  mrg interrupt_stack_k:
   1158  1.1  mrg 	.long __timer_stack	! The high end of the stack
   1159  1.1  mrg timer_handler_k:
   1160  1.1  mrg 	.long __profil_counter
   1161  1.1  mrg #endif
   1162  1.1  mrg expevt_k:
   1163  1.1  mrg 	.long 0xff000024 ! Address of expevt
   1164  1.1  mrg chandler_k:
   1165  1.1  mrg 	.long chandler
   1166  1.1  mrg superh_trap_handler_k:
   1167  1.1  mrg 	.long	__superh_trap_handler
   1168  1.1  mrg handler_exit_k:
   1169  1.1  mrg 	.long _exit
   1170  1.1  mrg 	.align 2
   1171  1.1  mrg ! Simulated compile of trap handler.
   1172  1.1  mrg 	.section	.debug_abbrev,"",@progbits
   1173  1.1  mrg .Ldebug_abbrev0:
   1174  1.1  mrg 	.section	.debug_info,"",@progbits
   1175  1.1  mrg .Ldebug_info0:
   1176  1.1  mrg 	.section	.debug_line,"",@progbits
   1177  1.1  mrg .Ldebug_line0:
   1178  1.1  mrg 	.text
   1179  1.1  mrg .Ltext0:
   1180  1.1  mrg 	.align 5
   1181  1.1  mrg 	.type	__superh_trap_handler,@function
   1182  1.1  mrg __superh_trap_handler:
   1183  1.1  mrg .LFB1:
   1184  1.1  mrg 	mov.l	r14,@-r15
   1185  1.1  mrg .LCFI0:
   1186  1.1  mrg 	add	#-4,r15
   1187  1.1  mrg .LCFI1:
   1188  1.1  mrg 	mov	r15,r14
   1189  1.1  mrg .LCFI2:
   1190  1.1  mrg 	mov.l	r4,@r14
   1191  1.1  mrg 	lds	r1, pr
   1192  1.1  mrg 	add	#4,r14
   1193  1.1  mrg 	mov	r14,r15
   1194  1.1  mrg 	mov.l	@r15+,r14
   1195  1.1  mrg 	rts
   1196  1.1  mrg 	nop
   1197  1.1  mrg .LFE1:
   1198  1.1  mrg .Lfe1:
   1199  1.1  mrg 	.size	__superh_trap_handler,.Lfe1-__superh_trap_handler
   1200  1.1  mrg 	.section	.debug_frame,"",@progbits
   1201  1.1  mrg .Lframe0:
   1202  1.1  mrg 	.ualong	.LECIE0-.LSCIE0
   1203  1.1  mrg .LSCIE0:
   1204  1.1  mrg 	.ualong	0xffffffff
   1205  1.1  mrg 	.byte	0x1
   1206  1.1  mrg 	.string	""
   1207  1.1  mrg 	.uleb128 0x1
   1208  1.1  mrg 	.sleb128 -4
   1209  1.1  mrg 	.byte	0x11
   1210  1.1  mrg 	.byte	0xc
   1211  1.1  mrg 	.uleb128 0xf
   1212  1.1  mrg 	.uleb128 0x0
   1213  1.1  mrg 	.align 2
   1214  1.1  mrg .LECIE0:
   1215  1.1  mrg .LSFDE0:
   1216  1.1  mrg 	.ualong	.LEFDE0-.LASFDE0
   1217  1.1  mrg .LASFDE0:
   1218  1.1  mrg 	.ualong	.Lframe0
   1219  1.1  mrg 	.ualong	.LFB1
   1220  1.1  mrg 	.ualong	.LFE1-.LFB1
   1221  1.1  mrg 	.byte	0x4
   1222  1.1  mrg 	.ualong	.LCFI0-.LFB1
   1223  1.1  mrg 	.byte	0xe
   1224  1.1  mrg 	.uleb128 0x4
   1225  1.1  mrg 	.byte	0x4
   1226  1.1  mrg 	.ualong	.LCFI1-.LCFI0
   1227  1.1  mrg 	.byte	0xe
   1228  1.1  mrg 	.uleb128 0x8
   1229  1.1  mrg 	.byte	0x8e
   1230  1.1  mrg 	.uleb128 0x1
   1231  1.1  mrg 	.byte	0x4
   1232  1.1  mrg 	.ualong	.LCFI2-.LCFI1
   1233  1.1  mrg 	.byte	0xd
   1234  1.1  mrg 	.uleb128 0xe
   1235  1.1  mrg 	.align 2
   1236  1.1  mrg .LEFDE0:
   1237  1.1  mrg 	.text
   1238  1.1  mrg .Letext0:
   1239  1.1  mrg 	.section	.debug_info
   1240  1.1  mrg 	.ualong	0xb3
   1241  1.1  mrg 	.uaword	0x2
   1242  1.1  mrg 	.ualong	.Ldebug_abbrev0
   1243  1.1  mrg 	.byte	0x4
   1244  1.1  mrg 	.uleb128 0x1
   1245  1.1  mrg 	.ualong	.Ldebug_line0
   1246  1.1  mrg 	.ualong	.Letext0
   1247  1.1  mrg 	.ualong	.Ltext0
   1248  1.1  mrg 	.string	"trap_handler.c"
   1249  1.1  mrg 	.string	"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
   1250  1.1  mrg 	.string	"GNU C 3.2 20020529 (experimental)"
   1251  1.1  mrg 	.byte	0x1
   1252  1.1  mrg 	.uleb128 0x2
   1253  1.1  mrg 	.ualong	0xa6
   1254  1.1  mrg 	.byte	0x1
   1255  1.1  mrg 	.string	"_superh_trap_handler"
   1256  1.1  mrg 	.byte	0x1
   1257  1.1  mrg 	.byte	0x2
   1258  1.1  mrg 	.byte	0x1
   1259  1.1  mrg 	.ualong	.LFB1
   1260  1.1  mrg 	.ualong	.LFE1
   1261  1.1  mrg 	.byte	0x1
   1262  1.1  mrg 	.byte	0x5e
   1263  1.1  mrg 	.uleb128 0x3
   1264  1.1  mrg 	.string	"trap_reason"
   1265  1.1  mrg 	.byte	0x1
   1266  1.1  mrg 	.byte	0x1
   1267  1.1  mrg 	.ualong	0xa6
   1268  1.1  mrg 	.byte	0x2
   1269  1.1  mrg 	.byte	0x91
   1270  1.1  mrg 	.sleb128 0
   1271  1.1  mrg 	.byte	0x0
   1272  1.1  mrg 	.uleb128 0x4
   1273  1.1  mrg 	.string	"unsigned int"
   1274  1.1  mrg 	.byte	0x4
   1275  1.1  mrg 	.byte	0x7
   1276  1.1  mrg 	.byte	0x0
   1277  1.1  mrg 	.section	.debug_abbrev
   1278  1.1  mrg 	.uleb128 0x1
   1279  1.1  mrg 	.uleb128 0x11
   1280  1.1  mrg 	.byte	0x1
   1281  1.1  mrg 	.uleb128 0x10
   1282  1.1  mrg 	.uleb128 0x6
   1283  1.1  mrg 	.uleb128 0x12
   1284  1.1  mrg 	.uleb128 0x1
   1285  1.1  mrg 	.uleb128 0x11
   1286  1.1  mrg 	.uleb128 0x1
   1287  1.1  mrg 	.uleb128 0x3
   1288  1.1  mrg 	.uleb128 0x8
   1289  1.1  mrg 	.uleb128 0x1b
   1290  1.1  mrg 	.uleb128 0x8
   1291  1.1  mrg 	.uleb128 0x25
   1292  1.1  mrg 	.uleb128 0x8
   1293  1.1  mrg 	.uleb128 0x13
   1294  1.1  mrg 	.uleb128 0xb
   1295  1.1  mrg 	.byte	0x0
   1296  1.1  mrg 	.byte	0x0
   1297  1.1  mrg 	.uleb128 0x2
   1298  1.1  mrg 	.uleb128 0x2e
   1299  1.1  mrg 	.byte	0x1
   1300  1.1  mrg 	.uleb128 0x1
   1301  1.1  mrg 	.uleb128 0x13
   1302  1.1  mrg 	.uleb128 0x3f
   1303  1.1  mrg 	.uleb128 0xc
   1304  1.1  mrg 	.uleb128 0x3
   1305  1.1  mrg 	.uleb128 0x8
   1306  1.1  mrg 	.uleb128 0x3a
   1307  1.1  mrg 	.uleb128 0xb
   1308  1.1  mrg 	.uleb128 0x3b
   1309  1.1  mrg 	.uleb128 0xb
   1310  1.1  mrg 	.uleb128 0x27
   1311  1.1  mrg 	.uleb128 0xc
   1312  1.1  mrg 	.uleb128 0x11
   1313  1.1  mrg 	.uleb128 0x1
   1314  1.1  mrg 	.uleb128 0x12
   1315  1.1  mrg 	.uleb128 0x1
   1316  1.1  mrg 	.uleb128 0x40
   1317  1.1  mrg 	.uleb128 0xa
   1318  1.1  mrg 	.byte	0x0
   1319  1.1  mrg 	.byte	0x0
   1320  1.1  mrg 	.uleb128 0x3
   1321  1.1  mrg 	.uleb128 0x5
   1322  1.1  mrg 	.byte	0x0
   1323  1.1  mrg 	.uleb128 0x3
   1324  1.1  mrg 	.uleb128 0x8
   1325  1.1  mrg 	.uleb128 0x3a
   1326  1.1  mrg 	.uleb128 0xb
   1327  1.1  mrg 	.uleb128 0x3b
   1328  1.1  mrg 	.uleb128 0xb
   1329  1.1  mrg 	.uleb128 0x49
   1330  1.1  mrg 	.uleb128 0x13
   1331  1.1  mrg 	.uleb128 0x2
   1332  1.1  mrg 	.uleb128 0xa
   1333  1.1  mrg 	.byte	0x0
   1334  1.1  mrg 	.byte	0x0
   1335  1.1  mrg 	.uleb128 0x4
   1336  1.1  mrg 	.uleb128 0x24
   1337  1.1  mrg 	.byte	0x0
   1338  1.1  mrg 	.uleb128 0x3
   1339  1.1  mrg 	.uleb128 0x8
   1340  1.1  mrg 	.uleb128 0xb
   1341  1.1  mrg 	.uleb128 0xb
   1342  1.1  mrg 	.uleb128 0x3e
   1343  1.1  mrg 	.uleb128 0xb
   1344  1.1  mrg 	.byte	0x0
   1345  1.1  mrg 	.byte	0x0
   1346  1.1  mrg 	.byte	0x0
   1347  1.1  mrg 	.section	.debug_pubnames,"",@progbits
   1348  1.1  mrg 	.ualong	0x27
   1349  1.1  mrg 	.uaword	0x2
   1350  1.1  mrg 	.ualong	.Ldebug_info0
   1351  1.1  mrg 	.ualong	0xb7
   1352  1.1  mrg 	.ualong	0x67
   1353  1.1  mrg 	.string	"_superh_trap_handler"
   1354  1.1  mrg 	.ualong	0x0
   1355  1.1  mrg 	.section	.debug_aranges,"",@progbits
   1356  1.1  mrg 	.ualong	0x1c
   1357  1.1  mrg 	.uaword	0x2
   1358  1.1  mrg 	.ualong	.Ldebug_info0
   1359  1.1  mrg 	.byte	0x4
   1360  1.1  mrg 	.byte	0x0
   1361  1.1  mrg 	.uaword	0x0
   1362  1.1  mrg 	.uaword	0x0
   1363  1.1  mrg 	.ualong	.Ltext0
   1364  1.1  mrg 	.ualong	.Letext0-.Ltext0
   1365  1.1  mrg 	.ualong	0x0
   1366  1.1  mrg 	.ualong	0x0
   1367  1.1  mrg #endif /* VBR_SETUP */
   1368  1.1  mrg #endif /* ! __SH5__ */
   1369