1/*	$NetBSD: rmheader.S,v 1.2.2.3 2004/09/21 13:11:35 skrll Exp $	*/
2
3/*-
4 * Copyright (c) 2001 Ben Harris
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/*
31 * Relocatable module header for boot32.
32 */
33
34#include <riscoscalls.h>
35
36rmbase:
37	b	rmstart			/* Start code */
38	.word	0			/* Initialisation code */
39	.word	0			/* Finalisation code */
40	.word	0			/* Service call handler */
41	.word	rmtitle - rmbase	/* Title string */
42	.word	rmhelp - rmbase		/* Help string */
43	.word	rmcmdtbl - rmbase	/* Help and command keyword table */
44	.word	0			/* SWI chunk base number */
45	.word	0			/* SWI handler code offset */
46	.word	0			/* SWI decoding table offset */
47	.word	0			/* SWI decoding code offset */
48	.word	0			/* Messages filename offset */
49	.word	flags - rmbase		/* Module flags extension offset */
50
51rmtitle:
52	.asciz	"boot32"
53	.align
54flags:
55	.word	1			/* 32 bit compatible */
56
57rmstart:
58	/*
59	 * This entry point is called when we're started up as an application,
60	 * so we're allowed to use application workspace.  This is good,
61	 * because most of our code is linked to run at 0x8000.
62	 */
63	mov	r0, #0x8000
64	adr	r1, rmbase
65	ldr	r2, Lsize
66Lcopyloop:
67	ldr	r3, [r1], #4
68	str	r3, [r0], #4
69	subs	r2, r2, #4
70	bgt	Lcopyloop
71	mov	r0, #0x8000
72	mov	r1, #128*1024
73LDsync_loop:
74	ldrb	r3, [r0], #1
75	subs	r1, r1, #1
76	bgt	LDsync_loop
77	ldr	r0, Lstart
78	mov	pc, r0
79
80	/*
81	 * The size of the code/data to be moved is not `end - rmbase' but
82	 * `__bss_start__ - rmbase' for the module is loaded into RISC OS
83	 * based on the filesize where as NetBSD doesn't have to include all
84	 * the bss space into the file itself. In some odd cases the
85	 * relocatable module area can be smaller than the module + bss and
86	 * thus bomb out.
87	 */
88Lsize:
89	.word	__bss_start__ - rmbase
90Lstart:
91	.word	_start
92
93rmcmdtbl:
94	.asciz	"boot32"		/* Command text */
95	.align
96	.word	rmcmd_boot32 - rmbase	/* Command code */
97	.byte	0x00			/* Min 0 parameters */
98	.byte	0x00			/* No GSTransed parameters */
99	.byte	0xff			/* Max 255 parameters */
100	.byte	0x00			/* Normal command */
101	.word	0			/* No syntax message */
102	.word	0			/* No help message */
103
104rmcmd_boot32:
105	/* We're called with r0 -> command tail. */
106	stmfd	r13!, {r14}
107	mov	r2, r0
108	mov	r0, #2
109	adr	r1, rmtitle
110	swi	XOS_Module
111	ldmfd	r13!, {pc}
112