Module Name: src
Committed By: phx
Date: Sun Mar 6 18:22:13 UTC 2011
Modified Files:
src/sys/arch/sandpoint/stand/altboot: Makefile brdsetup.c devopen.c
globals.h main.c
Added Files:
src/sys/arch/sandpoint/stand/altboot: memfs.c memfs.h
Log Message:
Suport for loading a kernel from memory (RAM, ROM or Flash).
The boot file path should look like "mem:<address>", where <address> is
the start address, in hex notation, of the file in memory.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/sandpoint/stand/altboot/Makefile
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sandpoint/stand/altboot/brdsetup.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/sandpoint/stand/altboot/devopen.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sandpoint/stand/altboot/globals.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/sandpoint/stand/altboot/main.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/sandpoint/stand/altboot/memfs.c \
src/sys/arch/sandpoint/stand/altboot/memfs.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sandpoint/stand/altboot/Makefile
diff -u src/sys/arch/sandpoint/stand/altboot/Makefile:1.9 src/sys/arch/sandpoint/stand/altboot/Makefile:1.10
--- src/sys/arch/sandpoint/stand/altboot/Makefile:1.9 Sun Mar 6 13:55:12 2011
+++ src/sys/arch/sandpoint/stand/altboot/Makefile Sun Mar 6 18:22:13 2011
@@ -1,12 +1,13 @@
-# $NetBSD: Makefile,v 1.9 2011/03/06 13:55:12 phx Exp $
+# $NetBSD: Makefile,v 1.10 2011/03/06 18:22:13 phx Exp $
S= ${.CURDIR}/../../../..
PROG= altboot
FILES+= ${PROG}.bin ${PROG}.img
NOMAN= # defined
-SRCS= entry.S main.c brdsetup.c pci.c devopen.c dev_net.c nif.c
-SRCS+= fxp.c tlp.c rge.c skg.c stg.c dsk.c pciide.c siisata.c
+SRCS= entry.S main.c brdsetup.c pci.c devopen.c dev_net.c memfs.c
+SRCS+= nif.c fxp.c tlp.c rge.c skg.c stg.c
+SRCS+= dsk.c pciide.c siisata.c
SRCS+= printf.c vers.c
CLEANFILES+= vers.c ${PROG} ${PROG}.bin ${PROG}.img
CFLAGS+= -Wall -Wno-main -ffreestanding -msoft-float -mmultiple
Index: src/sys/arch/sandpoint/stand/altboot/brdsetup.c
diff -u src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.6 src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.7
--- src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.6 Sun Mar 6 13:55:12 2011
+++ src/sys/arch/sandpoint/stand/altboot/brdsetup.c Sun Mar 6 18:22:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: brdsetup.c,v 1.6 2011/03/06 13:55:12 phx Exp $ */
+/* $NetBSD: brdsetup.c,v 1.7 2011/03/06 18:22:13 phx Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -959,20 +959,13 @@
return NULL;
}
-static uint8_t hex2nibble(char c)
-{
- if (c >= 'a')
- c &= ~0x20;
- return c > '9' ? c - 'A' + 10 : c - '0';
-}
-
static void
read_mac_string(uint8_t *mac, char *p)
{
int i;
for (i = 0; i < 6; i++, p += 3)
- *mac++ = (hex2nibble(p[0]) << 4) | hex2nibble(p[1]);
+ *mac++ = read_hex(p);
}
/*
Index: src/sys/arch/sandpoint/stand/altboot/devopen.c
diff -u src/sys/arch/sandpoint/stand/altboot/devopen.c:1.1 src/sys/arch/sandpoint/stand/altboot/devopen.c:1.2
--- src/sys/arch/sandpoint/stand/altboot/devopen.c:1.1 Sun Jan 23 01:05:30 2011
+++ src/sys/arch/sandpoint/stand/altboot/devopen.c Sun Mar 6 18:22:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: devopen.c,v 1.1 2011/01/23 01:05:30 nisimura Exp $ */
+/* $NetBSD: devopen.c,v 1.2 2011/03/06 18:22:13 phx Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -40,6 +40,7 @@
#include <lib/libkern/libkern.h>
#include "globals.h"
+#include "memfs.h"
struct devsw devnet = { "net", net_strategy, net_open, net_close, noioctl };
struct devsw devdsk = { "dsk", dsk_strategy, dsk_open, dsk_close, noioctl };
@@ -50,6 +51,7 @@
struct fs_ops fs_tftp = FS_OPS(tftp);
struct fs_ops fs_ffsv2 = FS_OPS(ffsv2);
struct fs_ops fs_ffsv1 = FS_OPS(ffsv1);
+struct fs_ops fs_mem = FS_OPS(mem);
extern char *fsmod;
static void parseunit(const char *, int *, int *, char **);
@@ -64,6 +66,13 @@
if (of->f_flags != F_READ)
return EPERM;
+ if (strncmp("mem:", name, 4) == 0) {
+ of->f_dev = NULL;
+ of->f_flags |= F_NODEV;
+ file_system[0] = fs_mem;
+ *file = (char *)&name[4];
+ return 0; /* MEM */
+ }
if (strncmp("net:", name, 4) == 0 || strncmp("nfs:", name, 4) == 0) {
of->f_dev = &devnet;
if ((error = net_open(of, &name[4], "nfs")) != 0)
Index: src/sys/arch/sandpoint/stand/altboot/globals.h
diff -u src/sys/arch/sandpoint/stand/altboot/globals.h:1.7 src/sys/arch/sandpoint/stand/altboot/globals.h:1.8
--- src/sys/arch/sandpoint/stand/altboot/globals.h:1.7 Sun Mar 6 13:55:12 2011
+++ src/sys/arch/sandpoint/stand/altboot/globals.h Sun Mar 6 18:22:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: globals.h,v 1.7 2011/03/06 13:55:12 phx Exp $ */
+/* $NetBSD: globals.h,v 1.8 2011/03/06 18:22:13 phx Exp $ */
#ifdef DEBUG
#define DPRINTF(x) printf x
@@ -117,6 +117,9 @@
void _wbinv(uint32_t, uint32_t);
void _inv(uint32_t, uint32_t);
+/* parsing */
+uint32_t read_hex(const char *);
+
/* heap */
void *allocaligned(size_t, size_t);
Index: src/sys/arch/sandpoint/stand/altboot/main.c
diff -u src/sys/arch/sandpoint/stand/altboot/main.c:1.8 src/sys/arch/sandpoint/stand/altboot/main.c:1.9
--- src/sys/arch/sandpoint/stand/altboot/main.c:1.8 Sun Mar 6 13:55:12 2011
+++ src/sys/arch/sandpoint/stand/altboot/main.c Sun Mar 6 18:22:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.8 2011/03/06 13:55:12 phx Exp $ */
+/* $NetBSD: main.c,v 1.9 2011/03/06 18:22:13 phx Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -482,6 +482,31 @@
return (void *)((p + align) & ~align);
}
+static int hex2nibble(char c)
+{
+
+ if (c >= 'a')
+ c &= ~0x20;
+ if (c >= 'A' && c <= 'F')
+ c -= 'A' - ('9' + 1);
+ else if (c < '0' || c > '9')
+ return -1;
+
+ return c - '0';
+}
+
+uint32_t
+read_hex(const char *s)
+{
+ int n;
+ uint32_t val;
+
+ val = 0;
+ while ((n = hex2nibble(*s++)) >= 0)
+ val = (val << 4) | n;
+ return val;
+}
+
static int
check_bootname(char *s)
{
@@ -491,12 +516,12 @@
* tftp:
* tftp:<bootfile>
* wd[N[P]]:<bootfile>
+ * mem:<address>
*
* net is a synonym of nfs.
*/
- if (strncmp(s, "nfs:", 4) == 0 || strncmp(s, "net:", 4) == 0)
- return 1;
- if (strncmp(s, "tftp:", 5) == 0)
+ if (strncmp(s, "nfs:", 4) == 0 || strncmp(s, "net:", 4) == 0 ||
+ strncmp(s, "tftp:", 5) == 0 || strncmp(s, "mem:", 4) == 0)
return 1;
if (s[0] == 'w' && s[1] == 'd') {
s += 2;
Added files:
Index: src/sys/arch/sandpoint/stand/altboot/memfs.c
diff -u /dev/null src/sys/arch/sandpoint/stand/altboot/memfs.c:1.1
--- /dev/null Sun Mar 6 18:22:13 2011
+++ src/sys/arch/sandpoint/stand/altboot/memfs.c Sun Mar 6 18:22:13 2011
@@ -0,0 +1,122 @@
+/* $NetBSD: memfs.c,v 1.1 2011/03/06 18:22:13 phx Exp $ */
+
+/*-
+ * Copyright (c) 2011 Frank Wille.
+ * All rights reserved.
+ *
+ * Written by Frank Wille for The NetBSD Project.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+
+#include <lib/libsa/stand.h>
+
+#include "globals.h"
+#include "memfs.h"
+
+struct memhandle {
+ char *base;
+ off_t off;
+};
+
+int
+mem_open(const char *path, struct open_file *f)
+{
+ struct memhandle *mh;
+
+ mh = alloc(sizeof(struct memhandle));
+ if (mh == NULL)
+ return ENOMEM;
+ mh->base = (char *)read_hex(path);
+ mh->off = 0;
+ f->f_fsdata = mh;
+ return 0;
+}
+
+#ifndef LIBSA_NO_FS_CLOSE
+int
+mem_close(struct open_file *f)
+{
+
+ dealloc(f->f_fsdata, sizeof(struct memhandle));
+ return 0;
+}
+#endif
+
+int
+mem_read(struct open_file *f, void *buf, size_t size, size_t *resid)
+{
+ struct memhandle *mh;
+
+ mh = f->f_fsdata;
+ memcpy(buf, mh->base + mh->off, size);
+ mh->off += size;
+ if (resid)
+ *resid = 0;
+ return 0;
+}
+
+#ifndef LIBSA_NO_FS_WRITE
+int
+mem_write(struct open_file *f, void *buf, size_t size, size_t *resid)
+{
+ struct memhandle *mh;
+
+ mh = f->f_fsdata;
+ memcpy(mh->base + mh->off, buf, size);
+ mh->off += size;
+ if (resid)
+ *resid = 0;
+ return 0;
+}
+#endif
+
+#ifndef LIBSA_NO_FS_SEEK
+off_t
+mem_seek(struct open_file *f, off_t offset, int where)
+{
+ struct memhandle *mh;
+
+ mh = f->f_fsdata;
+ switch (where) {
+ case SEEK_SET:
+ mh->off = offset;
+ break;
+ case SEEK_CUR:
+ mh->off += offset;
+ break;
+ default:
+ errno = EOFFSET;
+ return -1;
+ }
+ return mh->off;
+}
+#endif
+
+int
+mem_stat(struct open_file *f, struct stat *sb)
+{
+
+ return EIO;
+}
Index: src/sys/arch/sandpoint/stand/altboot/memfs.h
diff -u /dev/null src/sys/arch/sandpoint/stand/altboot/memfs.h:1.1
--- /dev/null Sun Mar 6 18:22:13 2011
+++ src/sys/arch/sandpoint/stand/altboot/memfs.h Sun Mar 6 18:22:13 2011
@@ -0,0 +1,31 @@
+/* $NetBSD: memfs.h,v 1.1 2011/03/06 18:22:13 phx Exp $ */
+
+/*-
+ * Copyright (c) 2011 Frank Wille.
+ * All rights reserved.
+ *
+ * Written by Frank Wille for The NetBSD Project.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+FS_DEF(mem);