xref: /netbsd-src/sys/arch/bebox/stand/boot/inkernel.c (revision f82d7874c259b2a6cc59b714f844919f32bf7b51)
1 /*	$NetBSD: inkernel.c,v 1.7 2008/04/28 20:23:15 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Kazuki Sakamoto.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <lib/libsa/stand.h>
33 #include <sys/param.h>
34 #include "boot.h"
35 #include "magic.h"
36 
37 #define	KERNENTRY	(RELOC - 0x200000)
38 
39 void
40 init_in()
41 {
42 	int p;
43 
44 	for (p = endaddr(); p < KERNENTRY; p += sizeof (int)) {
45 		if (*(int *)p != ENTRY ||
46 		    *(int *)(p + sizeof (int)) != 0 ||
47 		    *(int *)(p + sizeof (int) * 2) != 0)
48 			continue;
49 
50 		p += sizeof (int) * 3;
51 		if (memcmp((char *)p, magic, MAGICSIZE) == 0) {
52 			kern_len = *(int *)(p + MAGICSIZE);
53 			memcpy((char *)KERNENTRY,
54 				(char *)(p + MAGICSIZE + KERNLENSIZE),
55 				kern_len);
56 			break;
57 		}
58 	}
59 }
60 
61 int
62 inopen(p)
63 	struct open_file *p;
64 {
65 	if (kern_len)
66 		return (0);
67 	return (EINVAL);
68 }
69 
70 int
71 inclose(p)
72 	struct open_file *p;
73 {
74 	return (0);
75 }
76 
77 int
78 instrategy(devdata, func, blk, size, buf, rsize)
79 	void *devdata;	/* device uniq data */
80 	int func;	/* function (read or write) */
81 	daddr_t blk;	/* block number */
82 	size_t size;	/* request size in bytes */
83 	void *buf;	/* buffer */
84 	size_t *rsize;	/* bytes transferred */
85 {
86 
87 	memcpy(buf, (char *)KERNENTRY + blk * DEV_BSIZE, size);
88 	*rsize = size;
89 	return (0);
90 }
91