svn commit: r276355 - user/nwhitehorn/kboot/powerpc/kboot
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Mon Dec 29 02:13:09 UTC 2014
Author: nwhitehorn
Date: Mon Dec 29 02:13:06 2014
New Revision: 276355
URL: https://svnweb.freebsd.org/changeset/base/276355
Log:
Add block device support. This can't autoload the kernel for some reason,
but can manually. Not sure why.
Added:
user/nwhitehorn/kboot/powerpc/kboot/hostdisk.c (contents, props changed)
Modified:
user/nwhitehorn/kboot/powerpc/kboot/Makefile
user/nwhitehorn/kboot/powerpc/kboot/conf.c
user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
user/nwhitehorn/kboot/powerpc/kboot/hostcons.c
user/nwhitehorn/kboot/powerpc/kboot/main.c
Modified: user/nwhitehorn/kboot/powerpc/kboot/Makefile
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/Makefile Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/Makefile Mon Dec 29 02:13:06 2014 (r276355)
@@ -10,7 +10,7 @@ INSTALLFLAGS= -b
# Architecture-specific loader code
SRCS= conf.c metadata.c vers.c main.c ppc64_elf_freebsd.c
-SRCS+= host_syscall.S hostcons.c
+SRCS+= host_syscall.S hostcons.c hostdisk.c
SRCS+= ucmpdi2.c
LOADER_DISK_SUPPORT?= yes
Modified: user/nwhitehorn/kboot/powerpc/kboot/conf.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/conf.c Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/conf.c Mon Dec 29 02:13:06 2014 (r276355)
@@ -34,8 +34,7 @@ __FBSDID("$FreeBSD$");
#include "dev_net.h"
#endif
-extern struct devsw kbootdisk;
-extern struct devsw kbootcdrom;
+extern struct devsw hostdisk;
/*
* We could use linker sets for some or all of these, but
@@ -48,13 +47,8 @@ extern struct devsw kbootcdrom;
/* Exported for libstand */
struct devsw *devsw[] = {
-#if 0 /* XXX */
-#if defined(LOADER_CD9660_SUPPORT)
- &kbootcdrom,
-#endif
-#if defined(LOADER_DISK_SUPPORT)
- &kbootdisk,
-#endif
+#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT)
+ &hostdisk,
#endif
#if defined(LOADER_NET_SUPPORT)
&netdev,
Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S Mon Dec 29 02:13:06 2014 (r276355)
@@ -10,6 +10,11 @@ ENTRY(host_write)
sc
blr
+ENTRY(host_seek)
+ li %r0, 478 # SYS_lseek
+ sc
+ blr
+
ENTRY(host_open)
li %r0, 5 # SYS_open
sc
Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h Mon Dec 29 02:13:06 2014 (r276355)
@@ -32,6 +32,7 @@
ssize_t host_read(int fd, void *buf, size_t nbyte);
ssize_t host_write(int fd, const void *buf, size_t nbyte);
+ssize_t host_seek(int fd, uint64_t offset, int whence);
int host_open(char *path, int flags, int mode);
int host_close(int fd);
void *host_getmem(void *addr, size_t len);
Modified: user/nwhitehorn/kboot/powerpc/kboot/hostcons.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/hostcons.c Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/hostcons.c Mon Dec 29 02:13:06 2014 (r276355)
@@ -76,7 +76,7 @@ hostcons_getchar()
{
uint8_t ch;
- host_read(1, &ch, 1);
+ host_read(0, &ch, 1);
return (ch);
}
Added: user/nwhitehorn/kboot/powerpc/kboot/hostdisk.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/nwhitehorn/kboot/powerpc/kboot/hostdisk.c Mon Dec 29 02:13:06 2014 (r276355)
@@ -0,0 +1,126 @@
+/*-
+ * Copyright (C) 2014 Nathan Whitehorn
+ * All rights reserved.
+ *
+ * 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 AUTHOR ``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 TOOLS GMBH 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/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include "bootstrap.h"
+#include "host_syscall.h"
+
+static int hostdisk_init(void);
+static int hostdisk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize);
+static int hostdisk_open(struct open_file *f, ...);
+static int hostdisk_close(struct open_file *f);
+static int hostdisk_ioctl(struct open_file *f, u_long cmd, void *data);
+static void hostdisk_print(int verbose);
+
+struct devsw hostdisk = {
+ "a",
+ DEVT_DISK,
+ hostdisk_init,
+ hostdisk_strategy,
+ hostdisk_open,
+ hostdisk_close,
+ hostdisk_ioctl,
+ hostdisk_print,
+};
+
+static int
+hostdisk_init(void)
+{
+
+ return (0);
+}
+
+static int
+hostdisk_strategy(void *devdata, int flag, daddr_t dblk, size_t size,
+ char *buf, size_t *rsize)
+{
+ struct devdesc *desc = devdata;
+ daddr_t pos;
+ int n;
+
+ pos = dblk * 512;
+
+ if (host_seek(desc->d_unit, pos, 0) < 0)
+ return (EIO);
+ n = host_read(desc->d_unit, buf, size);
+
+ if (n < 0)
+ return (EIO);
+
+ *rsize = n;
+ return (0);
+}
+
+static int
+hostdisk_open(struct open_file *f, ...)
+{
+ struct devdesc *desc;
+ char *path;
+ va_list vl;
+
+ va_start(vl, f);
+ desc = va_arg(vl, struct devdesc *);
+ va_end(vl);
+
+ path = malloc(strlen((char *)(desc->d_opendata)) + 6);
+ strcpy(path, "/dev/");
+ strcat(path, (char *)(desc->d_opendata));
+
+ desc->d_unit = host_open(path, O_RDONLY, 0);
+ free(path);
+
+ if (desc->d_unit < 0)
+ return (ENOENT);
+
+ return (0);
+}
+
+static int
+hostdisk_close(struct open_file *f)
+{
+ struct devdesc *desc = f->f_devdata;
+
+ host_close(desc->d_unit);
+ return (0);
+}
+
+static int
+hostdisk_ioctl(struct open_file *f, u_long cmd, void *data)
+{
+
+ return (EINVAL);
+}
+
+static void
+hostdisk_print(int verbose)
+{
+
+}
+
Modified: user/nwhitehorn/kboot/powerpc/kboot/main.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/main.c Mon Dec 29 00:35:44 2014 (r276354)
+++ user/nwhitehorn/kboot/powerpc/kboot/main.c Mon Dec 29 02:13:06 2014 (r276355)
@@ -55,17 +55,16 @@ kboot_getdev(void **vdev, const char *de
int i;
const char *devpath, *filepath;
struct devsw *dv;
+ struct devdesc *desc;
- if (devspec[0] == '/') {
- devpath = getenv("currdev");
- filepath = devspec;
- } else {
+ if (strchr(devspec, ':') != NULL) {
devpath = devspec;
- if (strchr(devspec, ':') == NULL)
- filepath = NULL;
- else
- filepath = strchr(devspec, ':') + 1;
+ filepath = strchr(devspec, ':') + 1;
+ } else {
+ devpath = getenv("currdev");
+ filepath = &devspec[1];
}
+
for (i = 0; (dv = devsw[i]) != NULL; i++) {
if (strncmp(dv->dv_name, devpath, strlen(dv->dv_name)) == 0)
goto found;
@@ -73,11 +72,20 @@ kboot_getdev(void **vdev, const char *de
return (ENOENT);
found:
- if (path != NULL)
+ if (path != NULL && filepath != NULL)
*path = filepath;
else if (path != NULL)
*path = strchr(devspec, ':') + 1;
- *vdev = strdup(devpath);
+
+ if (vdev != NULL) {
+ desc = malloc(sizeof(*desc));
+ desc->d_dev = dv;
+ desc->d_unit = 0;
+ desc->d_opendata = strdup(devpath);
+ *vdev = desc;
+ }
+
+ return (0);
}
int
More information about the svn-src-user
mailing list