Home | History | Annotate | Line # | Download | only in common
      1 |
      2 |	execute NetBSD kernel
      3 |
      4 |	written by ITOH Yasufumi
      5 |	public domain
      6 |
      7 |	$NetBSD: execkern.S,v 1.4 2011/02/21 02:31:58 itohy Exp $
      8 
      9 #include <machine/asm.h>
     10 #include "execkern.h"
     11 
     12 #define MFP		0x00E88000	/* MFP */
     13 #define MFP_IERA	(MFP+0x07)	/* (B) interrupt enable reg A */
     14 #define MFP_IERB	(MFP+0x09)	/* (B) interrupt enable reg B */
     15 #define MFP_RSR		(MFP+0x2B)	/* (B) USART receiver status reg */
     16 
     17 #ifndef SRAM_MEMSZ
     18 #define SRAM		0x00ED0000	/* SRAM start addr */
     19 #define SRAM_MEMSZ	(SRAM + 8)	/* (L) size of main memory */
     20 #endif
     21 
     22 |	a3+0	load address
     23 |
     24 |	a3+4	section #1 image top address
     25 |	a3+8	section #1 size
     26 |	a3+12	section #1 gap size
     27 |	  :	  :
     28 |	a3+n-12	section #XK_NSEC image top address
     29 |	a3+n-8	section #XK_NSEC size
     30 |	a3+n-4	section #XK_NSEC gap size
     31 |
     32 |	a3+n	(reserved) (d5)
     33 |	a3+n+4	bootdev (d6)
     34 |	a3+n+8	boothowto (d7)
     35 |	a3+n+12	entry address (absolute address)
     36 
     37 #ifndef XK_NO_C_INTERFACE
     38 	.text
     39 	.even
     40 ENTRY_NOPROFILE(exec_kernel)
     41 	addql	#4,%sp
     42 	moveal	%sp@+,%a3		| struct execkern_arg *
     43 #endif
     44 
     45 	moveal	%a3@+,%a1		| load address
     46 	movel	%a1,%d3
     47 
     48 	|
     49 	| copy image
     50 	|
     51 
     52 	movel	#XK_NSEC-1,%d2
     53 Lloop:
     54 	moveal	%a3@+,%a0		| section image address
     55 	movel	%a3@+,%d0		| section size
     56 	movel	%d0,%d1
     57 	jbsr	copy
     58 	movel	%a3@+,%d0		| section gap
     59 	jbsr	clear
     60 
     61 	dbra	%d2,Lloop
     62 
     63 	| stop MFP interrupts (for compatibility)
     64 	clrb	MFP_IERA
     65 	clrb	MFP_IERB
     66 	clrb	MFP_RSR
     67 
     68 	|
     69 	| execute kernel
     70 	| start(load_addr, mem_max, kernel_end)
     71 	|
     72 	movel	%a1,%d0
     73 	addql	#3,%d0
     74 	andib	#0xFC,%d0
     75 	subl	%d3,%d0
     76 	movel	%d0,%sp@-		| arg #3 (end of kernel)
     77 	movel	SRAM_MEMSZ,%sp@-	| arg #2 (RAM size from SRAM)
     78 	movel	%d3,%sp@-		| arg #1 (load address)
     79 
     80 #if 0
     81 	movel	%a3@+,%d5		| (reserved)
     82 	movel	%a3@+,%d6		| boot device
     83 	movel	%a3@+,%d7		| boot howto
     84 
     85 	movel	%a3@+,%a0		| entry address
     86 #else	/* optimized */
     87 	moveml	%a3@+,%d5-%d7/%a0
     88 #endif
     89 
     90 	| clear unused registers
     91 	moveq	#0,%d0
     92 	moveq	#0,%d1
     93 	moveq	#0,%d2
     94 	moveq	#0,%d3
     95 	moveq	#0,%d4
     96 	moveal	%d0,%a1
     97 	moveal	%d0,%a2
     98 	moveal	%d0,%a3
     99 	moveal	%d0,%a4
    100 	moveal	%d0,%a5
    101 	moveal	%d0,%a6
    102 
    103 	jsr	%a0@			| execute NetBSD kernel
    104 	| NOTREACHED
    105 
    106 	| ??? returned from kernel -- issue software reset
    107 	subal	%a1,%a1
    108 	moveml	0x00ff0000,#0x0101	| get RESET vectors (%d0: ssp, %a0: pc)
    109 	moveml	#0x0101,%a1@		| put them at 0x00000000 (for Xellent)
    110 	.long	0x4E7B9801		| movec	%a1,%vbr
    111 	jmp	%a0@			| go to reset address
    112 
    113 
    114 |
    115 | utility routines
    116 |
    117 
    118 | copy %d0 bytes from higher (%a0) to lower (%a1) address
    119 1:	moveb	%a0@+,%a1@+
    120 copy:	subql	#1,%d0
    121 	bpls	1b
    122 	rts
    123 
    124 | clear %d0 bytes at %a1
    125 | do nothing if %d0 is zero
    126 1:	clrb	%a1@+
    127 clear:	subql	#1,%d0
    128 	bpls	1b
    129 	rts
    130