svn commit: r276507 - in user/nwhitehorn/kboot: fdt powerpc/kboot
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Thu Jan 1 18:12:44 UTC 2015
Author: nwhitehorn
Date: Thu Jan 1 18:12:02 2015
New Revision: 276507
URL: https://svnweb.freebsd.org/changeset/base/276507
Log:
Commit the actually correct changes to get the FDT into the kernel.
Modified:
user/nwhitehorn/kboot/fdt/Makefile
user/nwhitehorn/kboot/powerpc/kboot/Makefile
user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c
user/nwhitehorn/kboot/powerpc/kboot/main.c
user/nwhitehorn/kboot/powerpc/kboot/metadata.c
user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c
Modified: user/nwhitehorn/kboot/fdt/Makefile
==============================================================================
--- user/nwhitehorn/kboot/fdt/Makefile Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/fdt/Makefile Thu Jan 1 18:12:02 2015 (r276507)
@@ -6,7 +6,8 @@ LIB= fdt
INTERNALLIB=
# Vendor sources of libfdt.
-SRCS+= fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
+SRCS+= fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c \
+ fdt_empty_tree.c
# Loader's fdt commands extension sources.
SRCS+= fdt_loader_cmd.c
Modified: user/nwhitehorn/kboot/powerpc/kboot/Makefile
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/Makefile Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/Makefile Thu Jan 1 18:12:02 2015 (r276507)
@@ -21,7 +21,7 @@ LOADER_NET_SUPPORT?= yes
LOADER_NFS_SUPPORT?= yes
LOADER_TFTP_SUPPORT?= no
LOADER_GZIP_SUPPORT?= yes
-LOADER_FDT_SUPPORT?= yes
+LOADER_FDT_SUPPORT= yes
LOADER_BZIP2_SUPPORT?= no
.if ${LOADER_DISK_SUPPORT} == "yes"
@@ -98,8 +98,8 @@ CFLAGS+= -Wa,-mppc64bridge
LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/
-DPADD= ${LIBFICL} ${LIBOFW} ${LIBSTAND}
-LDADD= ${LIBFICL} ${LIBOFW} ${LIBSTAND}
+DPADD= ${LIBFICL} ${LIBOFW} ${LIBFDT} ${LIBSTAND}
+LDADD= ${LIBFICL} ${LIBOFW} ${LIBFDT} ${LIBSTAND}
SC_DFLT_FONT=cp437
Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S Thu Jan 1 18:12:02 2015 (r276507)
@@ -6,9 +6,10 @@ ENTRY(host_read)
bso 1f
blr
1:
- li %r3, -1
+ li %r3, 0
blr
+
ENTRY(host_write)
li %r0, 4 # SYS_write
sc
@@ -49,11 +50,6 @@ ENTRY(host_select)
blr
ENTRY(kexec_load)
- lis %r4,nkexec_segments at ha
- ori %r4,%r4,nkexec_segments at l
- lwz %r4,0(%r4)
- lis %r5,loaded_segments at ha
- ori %r5,%r5,loaded_segments at l
lis %r6,21 # KEXEC_ARCH_PPC64
li %r0,268 # __NR_kexec_load
sc
Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h Thu Jan 1 18:12:02 2015 (r276507)
@@ -44,7 +44,7 @@ struct host_timeval {
int host_gettimeofday(struct host_timeval *a, void *b);
int host_select(int nfds, long *readfds, long *writefds, long *exceptfds,
struct host_timeval *timeout);
-int kexec_load(vm_offset_t start);
+int kexec_load(vm_offset_t start, int nsegs, void *segs);
int host_reboot(int, int, int, void *);
int host_getdents(int fd, void *dirp, int count);
Modified: user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/kbootfdt.c Thu Jan 1 18:12:02 2015 (r276507)
@@ -33,25 +33,6 @@ __FBSDID("$FreeBSD$");
#include "host_syscall.h"
static void
-print_fdt(void *fdtp)
-{
- int offset, depth, i;
- const char *compat;
-
- offset = fdt_path_offset(fdtp, "/");
-
- for (depth = 0, offset = fdt_next_node(fdtp, offset, &depth);
- offset >= 0; offset = fdt_next_node(fdtp, offset, &depth)) {
- for (i = 1; i < depth; i++) printf("\t");
- printf("%d: %s",offset, fdt_get_name(fdtp, offset, NULL));
- compat = fdt_getprop(fdtp, offset, "compatible", NULL);
- if (compat != NULL)
- printf(" (%s)", compat);
- printf("\n");
- }
-}
-
-static void
add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
{
int child_offset, fd, pfd, error, dentsize;
@@ -70,7 +51,7 @@ add_node_to_fdt(void *buffer, const char
struct host_dent *dent;
int d_type;
- fd = open(path, O_RDONLY);
+ fd = host_open(path, O_RDONLY, 0);
while (1) {
dentsize = host_getdents(fd, dents, sizeof(dents));
if (dentsize <= 0)
@@ -94,15 +75,16 @@ add_node_to_fdt(void *buffer, const char
add_node_to_fdt(buffer, subpath, child_offset);
} else {
- pfd = open(subpath, O_RDONLY);
propbuf = malloc(1024);
- proplen = read(pfd, propbuf, 1024);
- if (proplen < 0)
- proplen = 0;
+ proplen = 0;
+ pfd = host_open(subpath, O_RDONLY, 0);
+ if (pfd > 0) {
+ proplen = host_read(pfd, propbuf, 1024);
+ host_close(pfd);
+ }
error = fdt_setprop(buffer, fdt_offset, dent->d_name,
propbuf, proplen);
free(propbuf);
- close(pfd);
if (error)
printf("Error %d adding property %s to "
"node %d\n", error, dent->d_name,
@@ -111,7 +93,7 @@ add_node_to_fdt(void *buffer, const char
}
}
- close(fd);
+ host_close(fd);
}
int
@@ -125,7 +107,6 @@ fdt_platform_load_dtb(void)
fdt_create_empty_tree(buffer, buflen);
add_node_to_fdt(buffer, path, fdt_path_offset(buffer, "/"));
fdt_pack(buffer);
-printf("Device tree is %d total bytes\n", fdt_totalsize(buffer));
fdt_load_dtb_addr(buffer);
Modified: user/nwhitehorn/kboot/powerpc/kboot/main.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/main.c Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/main.c Thu Jan 1 18:12:02 2015 (r276507)
@@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$");
#include <stand.h>
#include <sys/param.h>
+#include <fdt_platform.h>
#define _KERNEL
#include <machine/cpufunc.h>
@@ -49,6 +50,8 @@ ssize_t kboot_readin(const int fd, vm_of
int kboot_autoload(void);
int kboot_setcurrdev(struct env_var *ev, int flags, const void *value);
+extern int command_fdt_internal(int argc, char *argv[]);
+
int
kboot_getdev(void **vdev, const char *devspec, const char **path)
{
@@ -168,9 +171,9 @@ time(time_t *tloc)
struct kexec_segment {
void *buf;
- size_t bufsz;
+ int bufsz;
void *mem;
- size_t memsz;
+ int memsz;
};
struct kexec_segment loaded_segments[128];
@@ -181,7 +184,6 @@ get_phys_buffer(vm_offset_t dest, const
{
int i = 0;
const size_t segsize = 2*1024*1024;
- dest += 32*1024*1024; /* XXX Make nonoverlapping somehow */
for (i = 0; i < nkexec_segments; i++) {
if (dest >= (vm_offset_t)loaded_segments[i].mem &&
@@ -287,3 +289,18 @@ _start(int argc, const char **argv, char
main((int)sp[0], (const char **)&sp[1]);
}
+/*
+ * Since proper fdt command handling function is defined in fdt_loader_cmd.c,
+ * and declaring it as extern is in contradiction with COMMAND_SET() macro
+ * (which uses static pointer), we're defining wrapper function, which
+ * calls the proper fdt handling routine.
+ */
+static int
+command_fdt(int argc, char *argv[])
+{
+
+ return (command_fdt_internal(argc, argv));
+}
+
+COMMAND_SET(fdt, "fdt", "flattened device tree handling", command_fdt);
+
Modified: user/nwhitehorn/kboot/powerpc/kboot/metadata.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/metadata.c Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/metadata.c Thu Jan 1 18:12:02 2015 (r276507)
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/reboot.h>
#include <sys/linker.h>
#include <sys/boot.h>
+#include <fdt_platform.h>
#include <machine/metadata.h>
Modified: user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c Thu Jan 1 18:07:56 2015 (r276506)
+++ user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c Thu Jan 1 18:12:02 2015 (r276507)
@@ -44,6 +44,8 @@ extern char end[];
extern vm_offset_t reloc; /* From <arch>/conf.c */
extern void *kerneltramp;
extern size_t szkerneltramp;
+extern int nkexec_segments;
+extern void * loaded_segments;
int
ppc64_elf_loadfile(char *filename, u_int64_t dest,
@@ -66,7 +68,7 @@ ppc64_elf_exec(struct preloaded_file *fp
Elf_Ehdr *e;
int error;
uint32_t *trampoline;
- vm_offset_t trampolinebase = 32*1024*1024; /* XXX */
+ vm_offset_t trampolinebase = 16*1024*1024; /* XXX */
if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
return(EFTYPE);
@@ -93,7 +95,7 @@ ppc64_elf_exec(struct preloaded_file *fp
archsw.arch_copyin(trampoline, trampolinebase, szkerneltramp);
free(trampoline);
- error = kexec_load(trampolinebase);
+ error = kexec_load(trampolinebase, nkexec_segments, &loaded_segments);
if (error != 0)
panic("kexec_load returned error: %d", error);
error = host_reboot(0xfee1dead, 672274793,
More information about the svn-src-user
mailing list