xref: /netbsd-src/sys/arch/x68k/stand/common/execkern.S (revision 3b435a73967be44dfb4a27315acd72bfacde430c)
1|
2|	execute NetBSD kernel
3|
4|	written by Yasha (ITOH Yasufumi)
5|	public domain
6|
7|	$NetBSD: execkern.S,v 1.1 1998/09/01 19:51:56 itohy Exp $
8
9/* XXX this value is from <machine/exec_aout.h> */
10#define __LDPGSZ	8192
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	kernel image top address (a.out header is excluded)
23|	a3+4	load address
24|	a3+8	text size
25|	a3+12	data size
26|	a3+16	bss size
27|	a3+20	symbol size
28|	a3+24	(reserved) (d5)
29|	a3+28	bootdev (d6)
30|	a3+32	boothowto (d7)
31|	a3+36	entry address (absolute address)
32
33#ifndef XK_NO_C_INTERFACE
34	.text
35	.even
36	.globl	_exec_kernel
37_exec_kernel:
38	addql	#4,sp
39	moveal	sp@+,a3			| struct execkern_arg *
40#endif
41
42	moveal	a3@+,a0			| image address
43	moveal	a3@+,a1			| load address
44	movel	a1,d3
45
46	|
47	| copy image
48	|
49
50	| copy text segment
51	movel	a3@+,d0			| text size
52	movel	d0,d1
53	jbsr	copy
54
55	| clear gap between text and data
56	negl	d1
57	andil	#__LDPGSZ-1,d1
58	movel	d1,d0			| gap size between text and data
59	jbsr	clear
60
61	| copy data segment
62	movel	a3@+,d0			| data size
63	jbsr	copy
64
65	| clear bss
66	movel	a3@+,d0			| bss size
67	jbsr	clear
68
69	| copy symbol table
70	movel	a3@+,d0			| symbol table size
71	movel	d0,a1@+
72	beqs	Lnotable
73	jbsr	copy
74
75	| copy string table size
76	movel	a0@+,d0
77	movel	d0,a1@+
78	beqs	Lnotable
79
80	| copy string table
81	subql	#4,d0			| table size is already copied
82	jbsr	copy
83
84Lnotable:
85
86	| stop MFP interrupts (for compatibility)
87	clrb	MFP_IERA
88	clrb	MFP_IERB
89	clrb	MFP_RSR
90
91	|
92	| execute kernel
93	| start(load_addr, mem_max, kernel_end)
94	|
95	movel	a1,d0
96	addql	#3,d0
97	andib	#0xFC,d0
98	subl	d3,d0
99	movel	d0,sp@-			| arg #3 (kernel size)
100	movel	SRAM_MEMSZ,sp@-		| arg #2 (RAM size from SRAM)
101	movel	d3,sp@-			| arg #1 (load address)
102
103#if 0
104	movel	a3@+,d5			| (reserved)
105	movel	a3@+,d6			| boot device
106	movel	a3@+,d7			| boot howto
107
108	movel	a3@+,a0			| entry address
109#else	/* optimized */
110	moveml	a3@+,d5-d7/a0
111#endif
112
113	| clear unused registers
114	moveq	#0,d0
115	moveq	#0,d1
116	moveq	#0,d2
117	moveq	#0,d3
118	moveq	#0,d4
119	moveal	d0,a1
120	moveal	d0,a2
121	moveal	d0,a3
122	moveal	d0,a4
123	moveal	d0,a5
124	moveal	d0,a6
125
126	jsr	a0@			| execute NetBSD kernel
127	| NOTREACHED
128
129	| ??? returned from kernel -- issue software reset
130	subal	a1,a1
131	moveml	0x00ff0000,#0x0101	| get RESET vectors (d0: ssp, a0: pc)
132	moveml	#0x0101,a1@		| put them at 0x00000000 (for Xellent)
133	.long	0x4E7B9801		| movec	a1,vbr
134	jmp	a0@			| go to reset address
135
136
137|
138| utility routines
139|
140
141| copy d0 bytes from higher (a0) to lower (a1) address
1421:	moveb	a0@+,a1@+
143copy:	subql	#1,d0
144	bpls	1b
145	rts
146
147| clear d0 bytes at a1
148| do nothing if d0 is zero
1491:	clrb	a1@+
150clear:	subql	#1,d0
151	bpls	1b
152	rts
153