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);