Home | History | Annotate | Line # | Download | only in evbsh3
locore.S revision 1.1
      1  1.1  uch /*	$NetBSD: locore.S,v 1.1 2002/02/24 18:19:41 uch Exp $	*/
      2  1.1  uch 
      3  1.1  uch /*-
      4  1.1  uch  * Copyright (c) 1993, 1994, 1995, 1997
      5  1.1  uch  *	Charles M. Hannum.  All rights reserved.
      6  1.1  uch  * Copyright (c) 1990 The Regents of the University of California.
      7  1.1  uch  * All rights reserved.
      8  1.1  uch  *
      9  1.1  uch  * This code is derived from software contributed to Berkeley by
     10  1.1  uch  * William Jolitz.
     11  1.1  uch  *
     12  1.1  uch  * Redistribution and use in source and binary forms, with or without
     13  1.1  uch  * modification, are permitted provided that the following conditions
     14  1.1  uch  * are met:
     15  1.1  uch  * 1. Redistributions of source code must retain the above copyright
     16  1.1  uch  *    notice, this list of conditions and the following disclaimer.
     17  1.1  uch  * 2. Redistributions in binary form must reproduce the above copyright
     18  1.1  uch  *    notice, this list of conditions and the following disclaimer in the
     19  1.1  uch  *    documentation and/or other materials provided with the distribution.
     20  1.1  uch  * 3. All advertising materials mentioning features or use of this software
     21  1.1  uch  *    must display the following acknowledgement:
     22  1.1  uch  *	This product includes software developed by the University of
     23  1.1  uch  *	California, Berkeley and its contributors.
     24  1.1  uch  * 4. Neither the name of the University nor the names of its contributors
     25  1.1  uch  *    may be used to endorse or promote products derived from this software
     26  1.1  uch  *    without specific prior written permission.
     27  1.1  uch  *
     28  1.1  uch  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29  1.1  uch  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  1.1  uch  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  1.1  uch  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32  1.1  uch  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33  1.1  uch  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34  1.1  uch  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35  1.1  uch  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  1.1  uch  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37  1.1  uch  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38  1.1  uch  * SUCH DAMAGE.
     39  1.1  uch  *
     40  1.1  uch  *	@(#)locore.s	7.3 (Berkeley) 5/13/91
     41  1.1  uch  */
     42  1.1  uch 
     43  1.1  uch #include "opt_ddb.h"
     44  1.1  uch #include "opt_lockdebug.h"
     45  1.1  uch #include "opt_memsize.h"
     46  1.1  uch 
     47  1.1  uch #include "assym.h"
     48  1.1  uch 
     49  1.1  uch #include <sys/errno.h>
     50  1.1  uch #include <sys/syscall.h>
     51  1.1  uch 
     52  1.1  uch #include <sh3/locore.h>
     53  1.1  uch #include <machine/asm.h>
     54  1.1  uch #include <machine/cputypes.h>
     55  1.1  uch #include <machine/param.h>
     56  1.1  uch #include <machine/pte.h>
     57  1.1  uch #include <machine/trap.h>
     58  1.1  uch 
     59  1.1  uch #define INIT_STACK	IOM_RAM_BEGIN + IOM_RAM_SIZE - 0x00001000
     60  1.1  uch 
     61  1.1  uch #ifdef SH4
     62  1.1  uch #define SHREG_BBRA	0xff200008
     63  1.1  uch #define SHREG_CCR	0xff00001c
     64  1.1  uch #define SHREG_EXPEVT	0xff000024
     65  1.1  uch #define SHREG_INTEVT	0xff000028
     66  1.1  uch #define SHREG_MMUCR	0xff000010
     67  1.1  uch #define SHREG_TTB	0xff000008
     68  1.1  uch #else
     69  1.1  uch #define SHREG_BBRA	0xffffffb8
     70  1.1  uch #define SHREG_CCR	0xffffffec
     71  1.1  uch #define SHREG_EXPEVT	0xffffffd4
     72  1.1  uch #define SHREG_INTEVT	0xffffffd8
     73  1.1  uch #define SHREG_MMUCR	0xffffffe0
     74  1.1  uch #define SHREG_TTB	0xfffffff8
     75  1.1  uch #endif
     76  1.1  uch 
     77  1.1  uch NENTRY(start)
     78  1.1  uch 	/* Set SP to initial position */
     79  1.1  uch 	mov.l	XLtmpstk, r15
     80  1.1  uch 
     81  1.1  uch 	__INTR_MASK_r0_r1
     82  1.1  uch 
     83  1.1  uch 	/* Set Register Bank to Bank 0 */
     84  1.1  uch 	mov.l	SR_init, r0
     85  1.1  uch 	ldc	r0, sr
     86  1.1  uch 
     87  1.1  uch 	xor	r0, r0
     88  1.1  uch 	mov.l	XL_SHREG_MMUCR, r2
     89  1.1  uch 	mov.l	r0, @r2		/* MMU OFF */
     90  1.1  uch 
     91  1.1  uch 	bra	start1
     92  1.1  uch 	nop
     93  1.1  uch 	.align	2
     94  1.1  uch SR_init:	.long	0x500000F0
     95  1.1  uch XL_SHREG_MMUCR:	.long	SHREG_MMUCR
     96  1.1  uch start1:
     97  1.1  uch 
     98  1.1  uch #ifdef ROMIMAGE
     99  1.1  uch 	/* Initialize BUS State Control Regs. */
    100  1.1  uch 	mov.l	_ROM_START, r3
    101  1.1  uch 	mov.l	XL_ram_start, r4
    102  1.1  uch 	mov.l	@r4, r4
    103  1.1  uch 	sub	r3, r4
    104  1.1  uch 	/* Set Bus State Controler */
    105  1.1  uch 	mov.l	XLInitializeBsc, r0
    106  1.1  uch 	sub	r4, r0
    107  1.1  uch 	jsr	@r0
    108  1.1  uch 	nop
    109  1.1  uch 
    110  1.1  uch 	/* Move kernel image from ROM area to RAM area */
    111  1.1  uch 	mov.l	___end, r0
    112  1.1  uch 	mov.l	___start, r1
    113  1.1  uch 	mov.l	_KERNBASE, r2
    114  1.1  uch 	sub	r2, r0
    115  1.1  uch 	sub	r2, r1
    116  1.1  uch 	sub	r1, r0
    117  1.1  uch 	add	#4, r0		/* size of bytes to be copied */
    118  1.1  uch 	shlr2	r0		/* number of long word */
    119  1.1  uch 	mov.l	_ROM_START, r3
    120  1.1  uch 	add	r3, r1		/* src address */
    121  1.1  uch 	mov.l	___start, r3
    122  1.1  uch 	sub	r2, r3
    123  1.1  uch 	mov.l	XL_ram_start, r4
    124  1.1  uch 	mov.l	@r4, r4
    125  1.1  uch 	add	r4, r3		/* dest address */
    126  1.1  uch 1:
    127  1.1  uch 	mov.l	@r1+, r4
    128  1.1  uch 	mov.l	r4, @r3
    129  1.1  uch 	add	#4, r3
    130  1.1  uch 	dt	r0		/* decrement and Test */
    131  1.1  uch 	bf	1b
    132  1.1  uch 	/* kernel image copy end */
    133  1.1  uch 
    134  1.1  uch 	mov.l	LXstart_in_RAM, r0
    135  1.1  uch 	jmp	@r0		/* jump to RAM area */
    136  1.1  uch 	nop
    137  1.1  uch 
    138  1.1  uch 	.align	2
    139  1.1  uch LXstart_in_RAM:
    140  1.1  uch 	.long	start_in_RAM
    141  1.1  uch XL_ram_start:
    142  1.1  uch 	.long	_C_LABEL(ram_start)
    143  1.1  uch #else
    144  1.1  uch #ifndef	DONT_INIT_BSC
    145  1.1  uch 	/* Set Bus State Controler */
    146  1.1  uch 	mov.l	XLInitializeBsc, r0
    147  1.1  uch 	jsr	@r0
    148  1.1  uch 	nop
    149  1.1  uch #endif
    150  1.1  uch #endif
    151  1.1  uch 
    152  1.1  uch start_in_RAM:
    153  1.1  uch 	mova	1f, r0
    154  1.1  uch 	mov	r0, r4
    155  1.1  uch 	mov.l	XLinitSH3, r0
    156  1.1  uch 	jsr	@r0		/* call initSH3() */
    157  1.1  uch 	nop
    158  1.1  uch 
    159  1.1  uch 	.align	2
    160  1.1  uch 1:
    161  1.1  uch 
    162  1.1  uch #ifdef SH4
    163  1.1  uch 	/* CCR must be accessed from P2 area */
    164  1.1  uch 	mova	cache_on, r0
    165  1.1  uch 	mov	r0, r5
    166  1.1  uch 	mov.l	XLtoP2, r1
    167  1.1  uch 	add	r1, r5
    168  1.1  uch 	mova	main_label, r0
    169  1.1  uch 	mov	r0, r2
    170  1.1  uch 	mov.l	XL_SHREG_CCR, r3
    171  1.1  uch 	mov.l	XL_CCRVAL, r4
    172  1.1  uch 	jmp	@r5
    173  1.1  uch 	nop
    174  1.1  uch 
    175  1.1  uch 	.align	2
    176  1.1  uch cache_on:
    177  1.1  uch 	mov.l	r4, @r3 /* Write to CCR */
    178  1.1  uch 	nop
    179  1.1  uch 	nop
    180  1.1  uch 	nop
    181  1.1  uch 	nop
    182  1.1  uch 	nop
    183  1.1  uch 	nop
    184  1.1  uch 	nop
    185  1.1  uch 	nop
    186  1.1  uch 	jmp @r2
    187  1.1  uch 	nop
    188  1.1  uch 
    189  1.1  uch 	.align	2
    190  1.1  uch main_label:
    191  1.1  uch #endif
    192  1.1  uch 	mov.l	XLmain, r0
    193  1.1  uch 	jsr	@r0		/* call main() */
    194  1.1  uch 	nop
    195  1.1  uch 
    196  1.1  uch 		.align	2
    197  1.1  uch 
    198  1.1  uch #ifndef	DONT_INIT_BSC
    199  1.1  uch XLInitializeBsc:.long	_C_LABEL(InitializeBsc)
    200  1.1  uch #endif
    201  1.1  uch ___start:	.long	start
    202  1.1  uch ___etext:	.long	_etext
    203  1.1  uch ___end:		.long	_end
    204  1.1  uch XLtmpstk:	.long	INIT_STACK
    205  1.1  uch _KERNBASE:	.long	KERNBASE
    206  1.1  uch _ROM_START:	.long	IOM_ROM_BEGIN
    207  1.1  uch XLinitSH3:	.long	_C_LABEL(initSH3)
    208  1.1  uch XLmain:		.long	_C_LABEL(main)
    209  1.1  uch XLtoP2:		.long	0x20000000
    210  1.1  uch XL_SHREG_CCR:	.long	SHREG_CCR
    211  1.1  uch #ifdef SH4
    212  1.1  uch #if 1
    213  1.1  uch XL_CCRVAL:	.long	0x0909 /* Operand cache ON */
    214  1.1  uch #else
    215  1.1  uch XL_CCRVAL:	.long	0x0000 /* cache OFF */
    216  1.1  uch #endif
    217  1.1  uch #endif
    218  1.1  uch 
    219  1.1  uch load_and_reset:
    220  1.1  uch 	mov.l	XL_start_address, r0
    221  1.1  uch 	mov	r0, r8
    222  1.1  uch 	mov.l	@r4+, r1	/* r1 = osimage size */
    223  1.1  uch 	mov.l	@r4+, r2	/* r2 = check sum */
    224  1.1  uch 	shlr2	r1		/* r1 = osimage size in dword */
    225  1.1  uch 1:
    226  1.1  uch 	mov.l	@r4+, r3
    227  1.1  uch 	mov.l	r3, @r0
    228  1.1  uch 	add	#4, r0
    229  1.1  uch 	dt	r1
    230  1.1  uch 	bf	1b
    231  1.1  uch 
    232  1.1  uch 	jmp	@r8		/* jump to start address */
    233  1.1  uch 	nop
    234  1.1  uch 
    235  1.1  uch 	.align	2
    236  1.1  uch XL_start_address:
    237  1.1  uch 	.long	IOM_RAM_BEGIN + 0x00010000
    238  1.1  uch load_and_reset_end:
    239  1.1  uch 
    240  1.1  uch ENTRY(XLoadAndReset)
    241  1.1  uch 	__INTR_MASK_r0_r1
    242  1.1  uch 	/* copy trampoline code to RAM area top */
    243  1.1  uch 	mov.l	XL_load_and_reset, r0
    244  1.1  uch 	mov.l	XL_load_and_reset_end, r1
    245  1.1  uch 	mov.l	XL_load_trampoline_addr, r2
    246  1.1  uch 	mov	r2, r8
    247  1.1  uch 	sub	r0, r1		/* r1 = bytes to be copied */
    248  1.1  uch 1:	mov.b	@r0+, r3
    249  1.1  uch 	mov.b	r3, @r2
    250  1.1  uch 	add	#1, r2
    251  1.1  uch 	dt	r1
    252  1.1  uch 	bf	1b
    253  1.1  uch 
    254  1.1  uch 	jmp	@r8		/* jump to trampoline code */
    255  1.1  uch 	nop
    256  1.1  uch 
    257  1.1  uch 	.align	2
    258  1.1  uch XL_load_trampoline_addr:
    259  1.1  uch 	.long	IOM_RAM_BEGIN + 0x00008000
    260  1.1  uch XL_load_and_reset:
    261  1.1  uch 	.long	load_and_reset
    262  1.1  uch XL_load_and_reset_end:
    263  1.1  uch 	.long	load_and_reset_end
    264  1.1  uch 
    265  1.1  uch ENTRY(Sh3Reset)
    266  1.1  uch 	mov.l	XL_reset_vector, r8
    267  1.1  uch 	jmp	@r8
    268  1.1  uch 	nop
    269  1.1  uch 
    270  1.1  uch 	.align	2
    271  1.1  uch XL_reset_vector:
    272  1.1  uch 	.long	0xa0000000
    273  1.1  uch 
    274  1.1  uch /*
    275  1.1  uch  * void interrupt_exp(int, int, int, int, stuct trapframe)
    276  1.1  uch  *    __attribute__((__noreturn__)):
    277  1.1  uch  *	on entry, SR.BL = 1, SR_RB = 0, all regsiters are saved,
    278  1.1  uch  *	stack is already setuped.
    279  1.1  uch  */
    280  1.1  uch 	.align	2
    281  1.1  uch recurse:
    282  1.1  uch 	stc	sr, r4
    283  1.1  uch 	ldc	r5, spc
    284  1.1  uch 	ldc	r4, ssr
    285  1.1  uch 	RECURSEENTRY
    286  1.1  uch 	bra	1f
    287  1.1  uch 	 nop
    288  1.1  uch NENTRY(interrupt_exp)
    289  1.1  uch 1:
    290  1.1  uch 	MOV	(INTEVT, r0)
    291  1.1  uch 	mov.l	@r0,	r0
    292  1.1  uch 	mov.l	r0, @(TF_TRAPNO, r15)	/* trapframe->tf_trapno = INTEVT */
    293  1.1  uch 	__INTR_MASK_r0_r1		/* mask all interrupt */
    294  1.1  uch 	__EXCEPTION_UNBLOCK_r0_r1	/* enable exception for TLB handling */
    295  1.1  uch 	mov.l	_L.intrhandler, r0
    296  1.1  uch 	jsr	@r0
    297  1.1  uch  	 nop
    298  1.1  uch 	tst	r0,	r0	/* intrhandler() == 0, fast intr return */
    299  1.1  uch 	bt	2f
    300  1.1  uch 
    301  1.1  uch 	mov.l	_L.check_ipending, r0
    302  1.1  uch 	jsr	@r0
    303  1.1  uch 	 nop
    304  1.1  uch 	tst	r0,	r0
    305  1.1  uch 	bf	1b		/* handle pending interrupt. */
    306  1.1  uch 
    307  1.1  uch 	/* Check for ASTs on exit to user mode. */
    308  1.1  uch 	mov.l	_L.ast,	r0
    309  1.1  uch 	jsr	@r0
    310  1.1  uch 	 mov	r15,	r4
    311  1.1  uch 2:
    312  1.1  uch 	EXCEPTION_RETURN
    313  1.1  uch 	/* NOTREACHED */
    314  1.1  uch 	.align	2
    315  1.1  uch REG_SYMBOL(INTEVT)
    316  1.1  uch _L.intrhandler:		.long	_C_LABEL(intrhandler)
    317  1.1  uch _L.ast:			.long	_C_LABEL(ast)
    318  1.1  uch 
    319  1.1  uch NENTRY(Xspllower)
    320  1.1  uch 	sts.l	pr,	@-r15
    321  1.1  uch 
    322  1.1  uch restart:
    323  1.1  uch 	__INTR_MASK_r0_r1
    324  1.1  uch 	__EXCEPTION_UNBLOCK_r0_r1
    325  1.1  uch 	mov.l	_L.check_ipending, r0
    326  1.1  uch 	jsr	@r0
    327  1.1  uch 	 nop
    328  1.1  uch 	tst	r0,	r0
    329  1.1  uch 	bt	1f
    330  1.1  uch 
    331  1.1  uch 	mov.l	_L.restart, r5
    332  1.1  uch 	mov.l	_L.recurse, r0
    333  1.1  uch 	jmp	@r0
    334  1.1  uch 	 nop
    335  1.1  uch 
    336  1.1  uch 1:
    337  1.1  uch 	__INTR_UNMASK_r0_r1
    338  1.1  uch 	lds.l	@r15+,	pr
    339  1.1  uch 	rts
    340  1.1  uch 	 nop
    341  1.1  uch 
    342  1.1  uch 	.align	2
    343  1.1  uch _L.check_ipending:	.long	_C_LABEL(check_ipending)
    344  1.1  uch _L.recurse:		.long	recurse
    345  1.1  uch _L.restart:		.long	restart
    346  1.1  uch 
    347  1.1  uch 	.data
    348  1.1  uch 	.align	2
    349  1.1  uch 	.globl	_C_LABEL(intrcnt), _C_LABEL(eintrcnt)
    350  1.1  uch 	.globl	_C_LABEL(intrnames), _C_LABEL(eintrnames)
    351  1.1  uch _C_LABEL(intrcnt):
    352  1.1  uch _C_LABEL(eintrcnt):
    353  1.1  uch _C_LABEL(intrnames):
    354  1.1  uch _C_LABEL(eintrnames):
    355