xref: /netbsd/sys/arch/sandpoint/stand/altboot/memfs.c (revision 6ecb01ed)
1 /* $NetBSD: memfs.c,v 1.1 2011/03/06 18:22:13 phx Exp $ */
2 
3 /*-
4  * Copyright (c) 2011 Frank Wille.
5  * All rights reserved.
6  *
7  * Written by Frank Wille for The NetBSD Project.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <sys/param.h>
32 
33 #include <lib/libsa/stand.h>
34 
35 #include "globals.h"
36 #include "memfs.h"
37 
38 struct memhandle {
39 	char *base;
40 	off_t off;
41 };
42 
43 int
mem_open(const char * path,struct open_file * f)44 mem_open(const char *path, struct open_file *f)
45 {
46 	struct memhandle *mh;
47 
48 	mh = alloc(sizeof(struct memhandle));
49 	if (mh == NULL)
50 		return ENOMEM;
51 	mh->base = (char *)read_hex(path);
52 	mh->off = 0;
53 	f->f_fsdata = mh;
54 	return 0;
55 }
56 
57 #ifndef LIBSA_NO_FS_CLOSE
58 int
mem_close(struct open_file * f)59 mem_close(struct open_file *f)
60 {
61 
62 	dealloc(f->f_fsdata, sizeof(struct memhandle));
63 	return 0;
64 }
65 #endif
66 
67 int
mem_read(struct open_file * f,void * buf,size_t size,size_t * resid)68 mem_read(struct open_file *f, void *buf, size_t size, size_t *resid)
69 {
70 	struct memhandle *mh;
71 
72 	mh = f->f_fsdata;
73 	memcpy(buf, mh->base + mh->off, size);
74 	mh->off += size;
75 	if (resid)
76 		*resid = 0;
77 	return 0;
78 }
79 
80 #ifndef LIBSA_NO_FS_WRITE
81 int
mem_write(struct open_file * f,void * buf,size_t size,size_t * resid)82 mem_write(struct open_file *f, void *buf, size_t size, size_t *resid)
83 {
84 	struct memhandle *mh;
85 
86 	mh = f->f_fsdata;
87 	memcpy(mh->base + mh->off, buf, size);
88 	mh->off += size;
89 	if (resid)
90 		*resid = 0;
91 	return 0;
92 }
93 #endif
94 
95 #ifndef LIBSA_NO_FS_SEEK
96 off_t
mem_seek(struct open_file * f,off_t offset,int where)97 mem_seek(struct open_file *f, off_t offset, int where)
98 {
99 	struct memhandle *mh;
100 
101 	mh = f->f_fsdata;
102 	switch (where) {
103 	case SEEK_SET:
104 		mh->off = offset;
105 		break;
106 	case SEEK_CUR:
107 		mh->off += offset;
108 		break;
109 	default:
110 		errno = EOFFSET;
111 		return -1;
112 	}
113 	return mh->off;
114 }
115 #endif
116 
117 int
mem_stat(struct open_file * f,struct stat * sb)118 mem_stat(struct open_file *f, struct stat *sb)
119 {
120 
121 	return EIO;
122 }
123