Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150634399
D33513.id100153.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
43 KB
Referenced Files
None
Subscribers
None
D33513.id100153.diff
View Options
Index: stand/Makefile
===================================================================
--- stand/Makefile
+++ stand/Makefile
@@ -39,6 +39,9 @@
.include <bsd.arch.inc.mk>
S.${MK_EFI}+= efi
+.if ${MK_FDT} != "no"
+S.${MK_LOADER_KBOOT}+= kboot
+.endif
S.${MK_LOADER_UBOOT}+= uboot
.if defined(LIB32LIST)
Index: stand/powerpc/Makefile
===================================================================
--- stand/powerpc/Makefile
+++ stand/powerpc/Makefile
@@ -6,8 +6,4 @@
SUBDIR.yes= boot1.chrp ofw
-.if "${MACHINE_ARCH}" == "powerpc64"
-SUBDIR.${MK_FDT}+= kboot
-.endif
-
.include <bsd.subdir.mk>
Index: stand/powerpc/kboot/Makefile
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/Makefile
@@ -1,46 +0,0 @@
-# $FreeBSD$
-
-LOADER_CD9660_SUPPORT?= yes
-LOADER_MSDOS_SUPPORT?= no
-LOADER_EXT2FS_SUPPORT?= yes
-LOADER_UFS_SUPPORT?= yes
-LOADER_NET_SUPPORT?= yes
-LOADER_NFS_SUPPORT?= yes
-LOADER_TFTP_SUPPORT?= no
-LOADER_GZIP_SUPPORT?= yes
-LOADER_BZIP2_SUPPORT?= no
-
-.include <bsd.init.mk>
-
-PROG= loader.kboot
-NEWVERSWHAT= "kboot loader" ${MACHINE_ARCH}
-INSTALLFLAGS= -b
-
-# Architecture-specific loader code
-SRCS= conf.c vers.c main.c ppc64_elf_freebsd.c
-SRCS+= host_syscall.S hostcons.c hostdisk.c kerneltramp.S kbootfdt.c
-SRCS+= ucmpdi2.c gfx_fb_stub.c
-
-CFLAGS.gfx_fb_stub.c += -I${SRCTOP}/contrib/pnglite -I${SRCTOP}/sys/teken
-
-.include "${BOOTSRC}/fdt.mk"
-
-CFLAGS+= -mcpu=powerpc64
-
-# Always add MI sources
-.include "${BOOTSRC}/loader.mk"
-.PATH: ${SYSDIR}/libkern
-
-CFLAGS+= -Wall -DAIM
-# load address. set in linker script
-RELOC?= 0x0
-CFLAGS+= -DRELOC=${RELOC}
-
-LDFLAGS= -nostdlib -static -T ${.CURDIR}/ldscript.powerpc
-
-DPADD= ${LDR_INTERP} ${LIBOFW} ${LIBFDT} ${LIBSA}
-LDADD= ${LDR_INTERP} ${LIBOFW} ${LIBFDT} ${LIBSA}
-
-MK_PIE= no
-
-.include <bsd.prog.mk>
Index: stand/powerpc/kboot/conf.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/conf.c
@@ -1,118 +0,0 @@
-/*-
- * Copyright (C) 1999 Michael Smith <msmith@freebsd.org>
- * 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 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 AUTHOR 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/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stand.h>
-#include "bootstrap.h"
-
-#if defined(LOADER_NET_SUPPORT)
-#include "dev_net.h"
-#endif
-
-extern struct devsw hostdisk;
-
-/*
- * We could use linker sets for some or all of these, but
- * then we would have to control what ended up linked into
- * the bootstrap. So it's easier to conditionalise things
- * here.
- *
- * XXX rename these arrays to be consistent and less namespace-hostile
- */
-
-/* Exported for libstand */
-struct devsw *devsw[] = {
-#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT)
- &hostdisk,
-#endif
-#if defined(LOADER_NET_SUPPORT)
- &netdev,
-#endif
- NULL
-};
-
-struct fs_ops *file_system[] = {
-#if defined(LOADER_UFS_SUPPORT)
- &ufs_fsops,
-#endif
-#if defined(LOADER_CD9660_SUPPORT)
- &cd9660_fsops,
-#endif
-#if defined(LOADER_EXT2FS_SUPPORT)
- &ext2fs_fsops,
-#endif
-#if defined(LOADER_NFS_SUPPORT)
- &nfs_fsops,
-#endif
-#if defined(LOADER_TFTP_SUPPORT)
- &tftp_fsops,
-#endif
-#if defined(LOADER_GZIP_SUPPORT)
- &gzipfs_fsops,
-#endif
-#if defined(LOADER_BZIP2_SUPPORT)
- &bzipfs_fsops,
-#endif
- &dosfs_fsops,
- NULL
-};
-
-extern struct netif_driver kbootnet;
-
-struct netif_driver *netif_drivers[] = {
-#if 0 /* XXX */
-#if defined(LOADER_NET_SUPPORT)
- &kbootnet,
-#endif
-#endif
- NULL,
-};
-
-/* Exported for PowerPC only */
-/*
- * Sort formats so that those that can detect based on arguments
- * rather than reading the file go first.
- */
-
-extern struct file_format ppc_elf64;
-
-struct file_format *file_formats[] = {
- &ppc_elf64,
- NULL
-};
-
-/*
- * Consoles
- */
-extern struct console hostconsole;
-
-struct console *consoles[] = {
- &hostconsole,
- NULL
-};
-
Index: stand/powerpc/kboot/host_syscall.h
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/host_syscall.h
@@ -1,59 +0,0 @@
-/*-
- * 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.
- *
- * $FreeBSD$
- */
-
-#ifndef _HOST_SYSCALL_H
-#define _HOST_SYSCALL_H
-
-#include <stand.h>
-
-ssize_t host_read(int fd, void *buf, size_t nbyte);
-ssize_t host_write(int fd, const void *buf, size_t nbyte);
-int host_open(const char *path, int flags, int mode);
-ssize_t host_llseek(int fd, int32_t offset_high, int32_t offset_lo, uint64_t *result, int whence);
-int host_close(int fd);
-void *host_mmap(void *addr, size_t len, int prot, int flags, int fd, int);
-#define host_getmem(size) host_mmap(0, size, 3 /* RW */, 0x22 /* ANON */, -1, 0);
-struct old_utsname {
- char sysname[65];
- char nodename[65];
- char release[65];
- char version[65];
- char machine[65];
-};
-int host_uname(struct old_utsname *);
-struct host_timeval {
- int tv_sec;
- int tv_usec;
-};
-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(uint32_t start, int nsegs, uint32_t segs);
-int host_reboot(int, int, int, uint32_t);
-int host_getdents(int fd, void *dirp, int count);
-
-#endif
Index: stand/powerpc/kboot/host_syscall.S
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/host_syscall.S
@@ -1,88 +0,0 @@
-/*
- *
- * $FreeBSD$
- */
-
-#include <machine/asm.h>
-
-ENTRY(host_read)
- li %r0, 3 # SYS_read
- sc
- bso 1f
- blr
-1:
- li %r3, 0
- blr
-END(host_read)
-
-ENTRY(host_write)
- li %r0, 4 # SYS_write
- sc
- blr
-END(host_write)
-
-ENTRY(host_llseek)
- li %r0, 140 # SYS_llseek
- sc
- blr
-END(host_llseek)
-
-ENTRY(host_open)
- li %r0, 5 # SYS_open
- sc
- bso 1f
- blr
-1:
- li %r3, 0
- blr
-END(host_open)
-
-ENTRY(host_close)
- li %r0, 6 # SYS_close
- sc
- blr
-END(host_close)
-
-ENTRY(host_mmap)
- li %r0, 90 # SYS_mmap
- sc
- blr
-END(host_mmap)
-
-ENTRY(host_uname)
- li %r0, 122 # SYS_uname
- sc
- blr
-END(host_uname)
-
-ENTRY(host_gettimeofday)
- li %r0, 78 # SYS_gettimeofday
- sc
- blr
-END(host_gettimeofday)
-
-ENTRY(host_select)
- li %r0, 142 # SYS_select
- sc
- blr
-END(host_select)
-
-ENTRY(kexec_load)
- lis %r6,21 # KEXEC_ARCH_PPC64
- li %r0,268 # __NR_kexec_load
- sc
- blr
-END(kexec_load)
-
-ENTRY(host_reboot)
- li %r0,88 # SYS_reboot
- sc
- blr
-END(host_reboot)
-
-ENTRY(host_getdents)
- li %r0,141 # SYS_getdents
- sc
- blr
-END(host_getdents)
-
Index: stand/powerpc/kboot/hostcons.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/hostcons.c
@@ -1,97 +0,0 @@
-/*-
- * 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 "bootstrap.h"
-#include "host_syscall.h"
-
-static void hostcons_probe(struct console *cp);
-static int hostcons_init(int arg);
-static void hostcons_putchar(int c);
-static int hostcons_getchar();
-static int hostcons_poll();
-
-struct console hostconsole = {
- "host",
- "Host Console",
- 0,
- hostcons_probe,
- hostcons_init,
- hostcons_putchar,
- hostcons_getchar,
- hostcons_poll,
-};
-
-static void
-hostcons_probe(struct console *cp)
-{
-
- cp->c_flags |= C_PRESENTIN|C_PRESENTOUT;
-}
-
-static int
-hostcons_init(int arg)
-{
-
- /* XXX: set nonblocking */
- /* tcsetattr(~(ICANON | ECHO)) */
-
- return (0);
-}
-
-static void
-hostcons_putchar(int c)
-{
- uint8_t ch = c;
-
- host_write(1, &ch, 1);
-}
-
-static int
-hostcons_getchar()
-{
- uint8_t ch;
- int rv;
-
- rv = host_read(0, &ch, 1);
- if (rv == 1)
- return (ch);
- return (-1);
-}
-
-static int
-hostcons_poll()
-{
- struct host_timeval tv = {0,0};
- long fds = 1 << 0;
- int ret;
-
- ret = host_select(32, &fds, NULL, NULL, &tv);
- return (ret > 0);
-}
-
Index: stand/powerpc/kboot/hostdisk.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/hostdisk.c
@@ -1,129 +0,0 @@
-/*-
- * 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 int hostdisk_print(int verbose);
-
-struct devsw hostdisk = {
- "/dev",
- 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;
- uint64_t res;
- uint32_t posl, posh;
-
- pos = dblk * 512;
-
- posl = pos & 0xffffffff;
- posh = (pos >> 32) & 0xffffffff;
- if (host_llseek(desc->d_unit, posh, posl, &res, 0) < 0) {
- printf("Seek error\n");
- 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;
- va_list vl;
-
- va_start(vl, f);
- desc = va_arg(vl, struct devdesc *);
- va_end(vl);
-
- desc->d_unit = host_open(desc->d_opendata, O_RDONLY, 0);
-
- if (desc->d_unit <= 0) {
- printf("hostdisk_open: couldn't open %s: %d\n",
- (char *)desc->d_opendata, desc->d_unit);
- 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 int
-hostdisk_print(int verbose)
-{
- return (0);
-}
-
Index: stand/powerpc/kboot/kbootfdt.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/kbootfdt.c
@@ -1,190 +0,0 @@
-/*-
- * 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 <fdt_platform.h>
-#include <libfdt.h>
-#include "bootstrap.h"
-#include "host_syscall.h"
-
-static void
-add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
-{
- int child_offset, fd, pfd, error, dentsize;
- char subpath[512];
- void *propbuf;
- ssize_t proplen;
-
- struct host_dent {
- unsigned long d_fileno;
- unsigned long d_off;
- unsigned short d_reclen;
- char d_name[];
- /* uint8_t d_type; */
- };
- char dents[2048];
- struct host_dent *dent;
- int d_type;
-
- fd = host_open(path, O_RDONLY, 0);
- while (1) {
- dentsize = host_getdents(fd, dents, sizeof(dents));
- if (dentsize <= 0)
- break;
- for (dent = (struct host_dent *)dents;
- (char *)dent < dents + dentsize;
- dent = (struct host_dent *)((void *)dent + dent->d_reclen)) {
- sprintf(subpath, "%s/%s", path, dent->d_name);
- if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
- continue;
- d_type = *((char *)(dent) + dent->d_reclen - 1);
- if (d_type == 4 /* DT_DIR */) {
- child_offset = fdt_add_subnode(buffer, fdt_offset,
- dent->d_name);
- if (child_offset < 0) {
- printf("Error %d adding node %s/%s, skipping\n",
- child_offset, path, dent->d_name);
- continue;
- }
-
- add_node_to_fdt(buffer, subpath, child_offset);
- } else {
- propbuf = malloc(1024);
- 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);
- if (error)
- printf("Error %d adding property %s to "
- "node %d\n", error, dent->d_name,
- fdt_offset);
- }
- }
- }
-
- host_close(fd);
-}
-
-/* Fix up wrong values added to the device tree by prom_init() in Linux */
-
-static void
-fdt_linux_fixups(void *fdtp)
-{
- int offset, len;
- const void *prop;
-
- /*
- * Remove /memory/available properties, which reflect long-gone OF
- * state
- */
-
- offset = fdt_path_offset(fdtp, "/memory@0");
- if (offset > 0)
- fdt_delprop(fdtp, offset, "available");
-
- /*
- * Add reservations for OPAL and RTAS state if present
- */
-
- offset = fdt_path_offset(fdtp, "/ibm,opal");
- if (offset > 0) {
- const uint64_t *base, *size;
- base = fdt_getprop(fdtp, offset, "opal-base-address",
- &len);
- size = fdt_getprop(fdtp, offset, "opal-runtime-size",
- &len);
- if (base != NULL && size != NULL)
- fdt_add_mem_rsv(fdtp, fdt64_to_cpu(*base),
- fdt64_to_cpu(*size));
- }
- offset = fdt_path_offset(fdtp, "/rtas");
- if (offset > 0) {
- const uint32_t *base, *size;
- base = fdt_getprop(fdtp, offset, "linux,rtas-base", &len);
- size = fdt_getprop(fdtp, offset, "rtas-size", &len);
- if (base != NULL && size != NULL)
- fdt_add_mem_rsv(fdtp, fdt32_to_cpu(*base),
- fdt32_to_cpu(*size));
- }
-
- /*
- * Patch up /chosen nodes so that the stored handles mean something,
- * where possible.
- */
- offset = fdt_path_offset(fdtp, "/chosen");
- if (offset > 0) {
- fdt_delprop(fdtp, offset, "cpu"); /* This node not meaningful */
-
- offset = fdt_path_offset(fdtp, "/chosen");
- prop = fdt_getprop(fdtp, offset, "linux,stdout-package", &len);
- if (prop != NULL) {
- fdt_setprop(fdtp, offset, "stdout", prop, len);
- offset = fdt_path_offset(fdtp, "/chosen");
- fdt_setprop(fdtp, offset, "stdin", prop, len);
- }
- }
-}
-
-int
-fdt_platform_load_dtb(void)
-{
- void *buffer;
- size_t buflen = 409600;
-
- buffer = malloc(buflen);
- fdt_create_empty_tree(buffer, buflen);
- add_node_to_fdt(buffer, "/proc/device-tree",
- fdt_path_offset(buffer, "/"));
- fdt_linux_fixups(buffer);
-
- fdt_pack(buffer);
-
- fdt_load_dtb_addr(buffer);
- free(buffer);
-
- return (0);
-}
-
-void
-fdt_platform_load_overlays(void)
-{
-
-}
-
-void
-fdt_platform_fixups(void)
-{
-
-}
-
Index: stand/powerpc/kboot/kerneltramp.S
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/kerneltramp.S
@@ -1,102 +0,0 @@
-/*
- * This is the analog to the kexec "purgatory" code
- *
- * The goal here is to call the actual kernel entry point with the arguments it
- * expects when kexec calls into it with no arguments. The value of the kernel
- * entry point and arguments r3-r7 are copied into the trampoline text (which
- * can be executed from any address) at bytes 8-32. kexec begins execution
- * of APs at 0x60 bytes past the entry point, executing in a copy relocated
- * to the absolute address 0x60. Here we implement a loop waiting on the release
- * of a lock by the kernel at 0x40.
- *
- * $FreeBSD$
- */
-
-#include <machine/asm.h>
-
- .globl CNAME(kerneltramp),CNAME(szkerneltramp)
-CNAME(kerneltramp):
- mflr %r9
- bl 2f
- .space 24 /* branch address, r3-r7 */
-
-/*
- * MUST BE IN SYNC WITH:
- * struct trampoline_data {
- * uint32_t kernel_entry;
- * uint32_t dtb;
- * uint32_t phys_mem_offset;
- * uint32_t of_entry;
- * uint32_t mdp;
- * uint32_t mdp_size;
- * };
- */
-
-. = kerneltramp + 0x40 /* AP spinlock */
- .long 0
-
-. = kerneltramp + 0x60 /* AP entry point */
- li %r3,0x40
-1: lwz %r1,0(%r3)
- cmpwi %r1,0
- beq 1b
-
- /* Jump into CPU reset */
- li %r0,0x100
- icbi 0,%r0
- isync
- sync
- ba 0x100
-
-2: /* Continuation of kerneltramp */
- mflr %r8
- mtlr %r9
-
- mfmsr %r10
- andi. %r10, %r10, 1 /* test MSR_LE */
- bne little_endian
-
-/* We're starting in BE */
-big_endian:
- lwz %r3,4(%r8)
- lwz %r4,8(%r8)
- lwz %r5,12(%r8)
- lwz %r6,16(%r8)
- lwz %r7,20(%r8)
-
- lwz %r10, 0(%r8)
- mtctr %r10
- bctr
-
-/* We're starting in LE */
-little_endian:
-
- /* Entries are BE, swap them during load. */
- li %r10, 4
- lwbrx %r3, %r8, %r10
- li %r10, 8
- lwbrx %r4, %r8, %r10
- li %r10, 12
- lwbrx %r5, %r8, %r10
- li %r10, 16
- lwbrx %r6, %r8, %r10
- li %r10, 20
- lwbrx %r7, %r8, %r10
-
- /* Clear MSR_LE flag to enter the BE world */
- mfmsr %r10
- clrrdi %r10, %r10, 1
- mtsrr1 %r10
-
- /* Entry is at 0(%r8) */
- li %r10, 0
- lwbrx %r10, %r8, %r10
- mtsrr0 %r10
-
- rfid
-
-endkerneltramp:
-
- .data
-CNAME(szkerneltramp):
- .long endkerneltramp - CNAME(kerneltramp)
Index: stand/powerpc/kboot/ldscript.powerpc
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/ldscript.powerpc
@@ -1,111 +0,0 @@
-/* $FreeBSD: user/nwhitehorn/kboot/powerpc/kboot/ldscript.powerpc 272888 2014-10-10 06:24:09Z bapt $ */
-
-OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
- "elf32-powerpc-freebsd")
-OUTPUT_ARCH(powerpc:common)
-ENTRY(_start)
-SEARCH_DIR(/usr/lib);
-PROVIDE (__stack = 0);
-SECTIONS
-{
- /* Read-only sections, merged into text segment: */
- . = 0x100000;
- .text :
- {
- *(.text)
- /* .gnu.warning sections are handled specially by elf32.em. */
- *(.gnu.warning)
- *(.gnu.linkonce.t*)
- } =0
- _etext = .;
- .interp : { *(.interp) }
- .hash : { *(.hash) }
- .dynsym : { *(.dynsym) }
- .dynstr : { *(.dynstr) }
- .gnu.version : { *(.gnu.version) }
- .gnu.version_d : { *(.gnu.version_d) }
- .gnu.version_r : { *(.gnu.version_r) }
- .rela.text :
- { *(.rela.text) *(.rela.gnu.linkonce.t*) }
- .rela.data :
- { *(.rela.data) *(.rela.gnu.linkonce.d*) }
- .rela.rodata :
- { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
- .rela.got : { *(.rela.got) }
- .rela.got1 : { *(.rela.got1) }
- .rela.got2 : { *(.rela.got2) }
- .rela.ctors : { *(.rela.ctors) }
- .rela.dtors : { *(.rela.dtors) }
- .rela.init : { *(.rela.init) }
- .rela.fini : { *(.rela.fini) }
- .rela.bss : { *(.rela.bss) }
- .rela.plt : { *(.rela.plt) }
- .rela.sbss : { *(.rela.sbss) }
- .rela.sbss2 : { *(.rela.sbss2) }
- .text :
- {
- *(.text)
- /* .gnu.warning sections are handled specially by elf32.em. */
- *(.gnu.warning)
- *(.gnu.linkonce.t*)
- } =0
- _etext = .;
- PROVIDE (etext = .);
- .init : { *(.init) } =0
- .fini : { *(.fini) } =0
- .rodata : { *(.rodata) *(.gnu.linkonce.r*) }
- .rodata1 : { *(.rodata1) }
- .sbss2 : { *(.sbss2) }
- /* Adjust the address for the data segment to the next page up. */
- . = ((. + 0x1000) & ~(0x1000 - 1));
- .data :
- {
- *(.data)
- *(.gnu.linkonce.d*)
- CONSTRUCTORS
- }
- .data1 : { *(.data1) }
- .got1 : { *(.got1) }
- .dynamic : { *(.dynamic) }
- /* Put .ctors and .dtors next to the .got2 section, so that the pointers
- get relocated with -mrelocatable. Also put in the .fixup pointers.
- The current compiler no longer needs this, but keep it around for 2.7.2 */
- PROVIDE (_GOT2_START_ = .);
- .got2 : { *(.got2) }
- PROVIDE (__CTOR_LIST__ = .);
- .ctors : { *(.ctors) }
- PROVIDE (__CTOR_END__ = .);
- PROVIDE (__DTOR_LIST__ = .);
- .dtors : { *(.dtors) }
- PROVIDE (__DTOR_END__ = .);
- PROVIDE (_FIXUP_START_ = .);
- .fixup : { *(.fixup) }
- PROVIDE (_FIXUP_END_ = .);
- PROVIDE (_GOT2_END_ = .);
- PROVIDE (_GOT_START_ = .);
- .got : { *(.got) }
- .got.plt : { *(.got.plt) }
- PROVIDE (_GOT_END_ = .);
- _edata = .;
- PROVIDE (edata = .);
- .sbss :
- {
- PROVIDE (__sbss_start = .);
- *(.sbss)
- *(.scommon)
- *(.dynsbss)
- PROVIDE (__sbss_end = .);
- }
- .plt : { *(.plt) }
- .bss :
- {
- PROVIDE (__bss_start = .);
- *(.dynbss)
- *(.bss)
- *(COMMON)
- }
- . = ALIGN(4096);
- _end = . ;
- PROVIDE (end = .);
-}
-
Index: stand/powerpc/kboot/main.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/main.c
@@ -1,501 +0,0 @@
-/*-
- * Copyright (C) 2010-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 <stand.h>
-#include <sys/endian.h>
-#include <sys/param.h>
-#include <fdt_platform.h>
-
-#include <machine/cpufunc.h>
-#include <bootstrap.h>
-#include "host_syscall.h"
-
-
-struct arch_switch archsw;
-extern void *_end;
-
-int kboot_getdev(void **vdev, const char *devspec, const char **path);
-ssize_t kboot_copyin(const void *src, vm_offset_t dest, const size_t len);
-ssize_t kboot_copyout(vm_offset_t src, void *dest, const size_t len);
-ssize_t kboot_readin(readin_handle_t fd, vm_offset_t dest, const size_t len);
-int kboot_autoload(void);
-uint64_t kboot_loadaddr(u_int type, void *data, uint64_t addr);
-static void kboot_kseg_get(int *nseg, void **ptr);
-
-extern int command_fdt_internal(int argc, char *argv[]);
-
-struct region_desc {
- uint64_t start;
- uint64_t end;
-};
-
-static uint64_t
-kboot_get_phys_load_segment(void)
-{
- int fd;
- uint64_t entry[2];
- static uint64_t load_segment = ~(0UL);
- uint64_t val_64;
- uint32_t val_32;
- struct region_desc rsvd_reg[32];
- int rsvd_reg_cnt = 0;
- int ret, a, b;
- uint64_t start, end;
-
- if (load_segment == ~(0UL)) {
-
- /* Default load address is 0x00000000 */
- load_segment = 0UL;
-
- /* Read reserved regions */
- fd = host_open("/proc/device-tree/reserved-ranges", O_RDONLY, 0);
- if (fd >= 0) {
- while (host_read(fd, &entry[0], sizeof(entry)) == sizeof(entry)) {
- rsvd_reg[rsvd_reg_cnt].start = be64toh(entry[0]);
- rsvd_reg[rsvd_reg_cnt].end =
- be64toh(entry[1]) + rsvd_reg[rsvd_reg_cnt].start - 1;
- rsvd_reg_cnt++;
- }
- host_close(fd);
- }
- /* Read where the kernel ends */
- fd = host_open("/proc/device-tree/chosen/linux,kernel-end", O_RDONLY, 0);
- if (fd >= 0) {
- ret = host_read(fd, &val_64, sizeof(val_64));
-
- if (ret == sizeof(uint64_t)) {
- rsvd_reg[rsvd_reg_cnt].start = 0;
- rsvd_reg[rsvd_reg_cnt].end = be64toh(val_64) - 1;
- } else {
- memcpy(&val_32, &val_64, sizeof(val_32));
- rsvd_reg[rsvd_reg_cnt].start = 0;
- rsvd_reg[rsvd_reg_cnt].end = be32toh(val_32) - 1;
- }
- rsvd_reg_cnt++;
-
- host_close(fd);
- }
- /* Read memory size (SOCKET0 only) */
- fd = host_open("/proc/device-tree/memory@0/reg", O_RDONLY, 0);
- if (fd < 0)
- fd = host_open("/proc/device-tree/memory/reg", O_RDONLY, 0);
- if (fd >= 0) {
- ret = host_read(fd, &entry, sizeof(entry));
-
- /* Memory range in start:length format */
- entry[0] = be64toh(entry[0]);
- entry[1] = be64toh(entry[1]);
-
- /* Reserve everything what is before start */
- if (entry[0] != 0) {
- rsvd_reg[rsvd_reg_cnt].start = 0;
- rsvd_reg[rsvd_reg_cnt].end = entry[0] - 1;
- rsvd_reg_cnt++;
- }
- /* Reserve everything what is after end */
- if (entry[1] != 0xffffffffffffffffUL) {
- rsvd_reg[rsvd_reg_cnt].start = entry[0] + entry[1];
- rsvd_reg[rsvd_reg_cnt].end = 0xffffffffffffffffUL;
- rsvd_reg_cnt++;
- }
-
- host_close(fd);
- }
-
- /* Sort entries in ascending order (bubble) */
- for (a = rsvd_reg_cnt - 1; a > 0; a--) {
- for (b = 0; b < a; b++) {
- if (rsvd_reg[b].start > rsvd_reg[b + 1].start) {
- struct region_desc tmp;
- tmp = rsvd_reg[b];
- rsvd_reg[b] = rsvd_reg[b + 1];
- rsvd_reg[b + 1] = tmp;
- }
- }
- }
-
- /* Join overlapping/adjacent regions */
- for (a = 0; a < rsvd_reg_cnt - 1; ) {
-
- if ((rsvd_reg[a + 1].start >= rsvd_reg[a].start) &&
- ((rsvd_reg[a + 1].start - 1) <= rsvd_reg[a].end)) {
- /* We have overlapping/adjacent regions! */
- rsvd_reg[a].end =
- MAX(rsvd_reg[a].end, rsvd_reg[a + a].end);
-
- for (b = a + 1; b < rsvd_reg_cnt - 1; b++)
- rsvd_reg[b] = rsvd_reg[b + 1];
- rsvd_reg_cnt--;
- } else
- a++;
- }
-
- /* Find the first free region */
- if (rsvd_reg_cnt > 0) {
- start = 0;
- end = rsvd_reg[0].start;
- for (a = 0; a < rsvd_reg_cnt - 1; a++) {
- if ((start >= rsvd_reg[a].start) &&
- (start <= rsvd_reg[a].end)) {
- start = rsvd_reg[a].end + 1;
- end = rsvd_reg[a + 1].start;
- } else
- break;
- }
-
- if (start != end) {
- uint64_t align = 64UL*1024UL*1024UL;
-
- /* Align both to 64MB boundary */
- start = (start + align - 1UL) & ~(align - 1UL);
- end = ((end + 1UL) & ~(align - 1UL)) - 1UL;
-
- if (start < end)
- load_segment = start;
- }
- }
- }
-
- return (load_segment);
-}
-
-uint8_t
-kboot_get_kernel_machine_bits(void)
-{
- static uint8_t bits = 0;
- struct old_utsname utsname;
- int ret;
-
- if (bits == 0) {
- /* Default is 32-bit kernel */
- bits = 32;
-
- /* Try to get system type */
- memset(&utsname, 0, sizeof(utsname));
- ret = host_uname(&utsname);
- if (ret == 0) {
- if (strcmp(utsname.machine, "ppc64") == 0)
- bits = 64;
- else if (strcmp(utsname.machine, "ppc64le") == 0)
- bits = 64;
- }
- }
-
- return (bits);
-}
-
-int
-kboot_getdev(void **vdev, const char *devspec, const char **path)
-{
- int i;
- const char *devpath, *filepath;
- struct devsw *dv;
- struct devdesc *desc;
-
- if (strchr(devspec, ':') != NULL) {
- devpath = devspec;
- filepath = strchr(devspec, ':') + 1;
- } else {
- devpath = getenv("currdev");
- filepath = devspec;
- }
-
- for (i = 0; (dv = devsw[i]) != NULL; i++) {
- if (strncmp(dv->dv_name, devpath, strlen(dv->dv_name)) == 0)
- goto found;
- }
- return (ENOENT);
-
-found:
- if (path != NULL && filepath != NULL)
- *path = filepath;
- else if (path != NULL)
- *path = strchr(devspec, ':') + 1;
-
- 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
-main(int argc, const char **argv)
-{
- void *heapbase;
- const size_t heapsize = 15*1024*1024;
- const char *bootdev;
-
- /*
- * Set the heap to one page after the end of the loader.
- */
- heapbase = host_getmem(heapsize);
- setheap(heapbase, heapbase + heapsize);
-
- /*
- * Set up console.
- */
- cons_probe();
-
- /* Choose bootdev if provided */
- if (argc > 1)
- bootdev = argv[1];
- else
- bootdev = "";
-
- printf("Boot device: %s\n", bootdev);
-
- archsw.arch_getdev = kboot_getdev;
- archsw.arch_copyin = kboot_copyin;
- archsw.arch_copyout = kboot_copyout;
- archsw.arch_readin = kboot_readin;
- archsw.arch_autoload = kboot_autoload;
- archsw.arch_loadaddr = kboot_loadaddr;
- archsw.arch_kexec_kseg_get = kboot_kseg_get;
-
- printf("\n%s", bootprog_info);
-
- setenv("currdev", bootdev, 1);
- setenv("loaddev", bootdev, 1);
- setenv("LINES", "24", 1);
- setenv("usefdt", "1", 1);
-
- interact(); /* doesn't return */
-
- return (0);
-}
-
-void
-exit(int code)
-{
- while (1); /* XXX: host_exit */
- __unreachable();
-}
-
-void
-delay(int usecs)
-{
- struct host_timeval tvi, tv;
- uint64_t ti, t;
- host_gettimeofday(&tvi, NULL);
- ti = tvi.tv_sec*1000000 + tvi.tv_usec;
- do {
- host_gettimeofday(&tv, NULL);
- t = tv.tv_sec*1000000 + tv.tv_usec;
- } while (t < ti + usecs);
-}
-
-time_t
-getsecs(void)
-{
- struct host_timeval tv;
- host_gettimeofday(&tv, NULL);
- return (tv.tv_sec);
-}
-
-time_t
-time(time_t *tloc)
-{
- time_t rv;
-
- rv = getsecs();
- if (tloc != NULL)
- *tloc = rv;
-
- return (rv);
-}
-
-struct kexec_segment {
- void *buf;
- int bufsz;
- void *mem;
- int memsz;
-};
-
-struct kexec_segment loaded_segments[128];
-int nkexec_segments = 0;
-
-static ssize_t
-get_phys_buffer(vm_offset_t dest, const size_t len, void **buf)
-{
- int i = 0;
- const size_t segsize = 4*1024*1024;
-
- for (i = 0; i < nkexec_segments; i++) {
- if (dest >= (vm_offset_t)loaded_segments[i].mem &&
- dest < (vm_offset_t)loaded_segments[i].mem +
- loaded_segments[i].memsz)
- goto out;
- }
-
- loaded_segments[nkexec_segments].buf = host_getmem(segsize);
- loaded_segments[nkexec_segments].bufsz = segsize;
- loaded_segments[nkexec_segments].mem = (void *)rounddown2(dest,segsize);
- loaded_segments[nkexec_segments].memsz = segsize;
-
- i = nkexec_segments;
- nkexec_segments++;
-
-out:
- *buf = loaded_segments[i].buf + (dest -
- (vm_offset_t)loaded_segments[i].mem);
- return (min(len,loaded_segments[i].bufsz - (dest -
- (vm_offset_t)loaded_segments[i].mem)));
-}
-
-ssize_t
-kboot_copyin(const void *src, vm_offset_t dest, const size_t len)
-{
- ssize_t segsize, remainder;
- void *destbuf;
-
- remainder = len;
- do {
- segsize = get_phys_buffer(dest, remainder, &destbuf);
- bcopy(src, destbuf, segsize);
- remainder -= segsize;
- src += segsize;
- dest += segsize;
- } while (remainder > 0);
-
- return (len);
-}
-
-ssize_t
-kboot_copyout(vm_offset_t src, void *dest, const size_t len)
-{
- ssize_t segsize, remainder;
- void *srcbuf;
-
- remainder = len;
- do {
- segsize = get_phys_buffer(src, remainder, &srcbuf);
- bcopy(srcbuf, dest, segsize);
- remainder -= segsize;
- src += segsize;
- dest += segsize;
- } while (remainder > 0);
-
- return (len);
-}
-
-ssize_t
-kboot_readin(readin_handle_t fd, vm_offset_t dest, const size_t len)
-{
- void *buf;
- size_t resid, chunk, get;
- ssize_t got;
- vm_offset_t p;
-
- p = dest;
-
- chunk = min(PAGE_SIZE, len);
- buf = malloc(chunk);
- if (buf == NULL) {
- printf("kboot_readin: buf malloc failed\n");
- return (0);
- }
-
- for (resid = len; resid > 0; resid -= got, p += got) {
- get = min(chunk, resid);
- got = VECTX_READ(fd, buf, get);
- if (got <= 0) {
- if (got < 0)
- printf("kboot_readin: read failed\n");
- break;
- }
-
- kboot_copyin(buf, p, got);
- }
-
- free (buf);
- return (len - resid);
-}
-
-int
-kboot_autoload(void)
-{
-
- return (0);
-}
-
-uint64_t
-kboot_loadaddr(u_int type, void *data, uint64_t addr)
-{
-
- if (type == LOAD_ELF)
- addr = roundup(addr, PAGE_SIZE);
- else
- addr += kboot_get_phys_load_segment();
-
- return (addr);
-}
-
-static void
-kboot_kseg_get(int *nseg, void **ptr)
-{
-#if 0
- int a;
-
- for (a = 0; a < nkexec_segments; a++) {
- printf("kseg_get: %jx %jx %jx %jx\n",
- (uintmax_t)loaded_segments[a].buf,
- (uintmax_t)loaded_segments[a].bufsz,
- (uintmax_t)loaded_segments[a].mem,
- (uintmax_t)loaded_segments[a].memsz);
- }
-#endif
-
- *nseg = nkexec_segments;
- *ptr = &loaded_segments[0];
-}
-
-void
-_start(int argc, const char **argv, char **env)
-{
- main(argc, argv);
-}
-
-/*
- * 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);
Index: stand/powerpc/kboot/ppc64_elf_freebsd.c
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/ppc64_elf_freebsd.c
@@ -1,171 +0,0 @@
-/*-
- * Copyright (c) 2001 Benno Rice <benno@FreeBSD.org>
- * 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 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 AUTHOR 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/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#define __ELF_WORD_SIZE 64
-
-#include <sys/param.h>
-#include <sys/endian.h>
-#include <sys/linker.h>
-
-#include <machine/metadata.h>
-#include <machine/elf.h>
-
-#include <stand.h>
-
-#include "bootstrap.h"
-#include "host_syscall.h"
-
-extern char end[];
-extern void *kerneltramp;
-extern size_t szkerneltramp;
-
-struct trampoline_data {
- uint32_t kernel_entry;
- uint32_t dtb;
- uint32_t phys_mem_offset;
- uint32_t of_entry;
- uint32_t mdp;
- uint32_t mdp_size;
-};
-
-vm_offset_t md_load64(char *args, vm_offset_t *modulep, vm_offset_t *dtb);
-
-int
-ppc64_elf_loadfile(char *filename, uint64_t dest,
- struct preloaded_file **result)
-{
- int r;
-
- r = __elfN(loadfile)(filename, dest, result);
- if (r != 0)
- return (r);
-
- return (0);
-}
-
-int
-ppc64_elf_exec(struct preloaded_file *fp)
-{
- struct file_metadata *fmp;
- vm_offset_t mdp, dtb;
- Elf_Ehdr *e;
- int error;
- uint32_t *trampoline;
- uint64_t entry;
- uint64_t trampolinebase;
- struct trampoline_data *trampoline_data;
- int nseg;
- void *kseg;
-
- if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
- return(EFTYPE);
- }
- e = (Elf_Ehdr *)&fmp->md_data;
-
- /*
- * Figure out where to put it.
- *
- * Linux does not allow to do kexec_load into
- * any part of memory. Ask arch_loadaddr to
- * resolve the first available chunk of physical
- * memory where loading is possible (load_addr).
- *
- * Memory organization is shown below.
- * It is assumed, that text segment offset of
- * kernel ELF (KERNPHYSADDR) is non-zero,
- * which is true for PPC/PPC64 architectures,
- * where default is 0x100000.
- *
- * load_addr: trampoline code
- * load_addr + KERNPHYSADDR: kernel text segment
- */
- trampolinebase = archsw.arch_loadaddr(LOAD_RAW, NULL, 0);
- printf("Load address at %#jx\n", (uintmax_t)trampolinebase);
- printf("Relocation offset is %#jx\n", (uintmax_t)elf64_relocation_offset);
-
- /* Set up loader trampoline */
- trampoline = malloc(szkerneltramp);
- memcpy(trampoline, &kerneltramp, szkerneltramp);
-
- /* Parse function descriptor for ELFv1 kernels */
- if ((e->e_flags & 3) == 2)
- entry = e->e_entry;
- else {
- archsw.arch_copyout(e->e_entry + elf64_relocation_offset,
- &entry, 8);
- entry = be64toh(entry);
- }
-
- /*
- * Placeholder for trampoline data is at trampolinebase + 0x08
- * CAUTION: all data must be Big Endian
- */
- trampoline_data = (void*)&trampoline[2];
- trampoline_data->kernel_entry = htobe32(entry + elf64_relocation_offset);
- trampoline_data->phys_mem_offset = htobe32(0);
- trampoline_data->of_entry = htobe32(0);
-
- if ((error = md_load64(fp->f_args, &mdp, &dtb)) != 0)
- return (error);
-
- trampoline_data->dtb = htobe32(dtb);
- trampoline_data->mdp = htobe32(mdp);
- trampoline_data->mdp_size = htobe32(0xfb5d104d);
-
- printf("Kernel entry at %#jx (%#x) ...\n",
- entry, be32toh(trampoline_data->kernel_entry));
- printf("DTB at %#x, mdp at %#x\n",
- be32toh(trampoline_data->dtb), be32toh(trampoline_data->mdp));
-
- dev_cleanup();
-
- archsw.arch_copyin(trampoline, trampolinebase, szkerneltramp);
- free(trampoline);
-
- if (archsw.arch_kexec_kseg_get == NULL)
- panic("architecture did not provide kexec segment mapping");
- archsw.arch_kexec_kseg_get(&nseg, &kseg);
-
- error = kexec_load(trampolinebase, nseg, (uintptr_t)kseg);
- if (error != 0)
- panic("kexec_load returned error: %d", error);
-
- error = host_reboot(0xfee1dead, 672274793,
- 0x45584543 /* LINUX_REBOOT_CMD_KEXEC */, (uintptr_t)NULL);
- if (error != 0)
- panic("reboot returned error: %d", error);
-
- while (1) {}
-}
-
-struct file_format ppc_elf64 =
-{
- ppc64_elf_loadfile,
- ppc64_elf_exec
-};
Index: stand/powerpc/kboot/version
===================================================================
--- /dev/null
+++ stand/powerpc/kboot/version
@@ -1,6 +0,0 @@
-$FreeBSD: user/nwhitehorn/kboot/powerpc/kboot/version 224106 2011-07-16 19:01:09Z nwhitehorn $
-
-NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
-file is important. Make sure the current version number is on line 6.
-
-0.1: Initial kboot/PowerPC version.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 3, 11:43 PM (53 m, 51 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30785861
Default Alt Text
D33513.id100153.diff (43 KB)
Attached To
Mode
D33513: kboot: Move powerpc kboot to top level
Attached
Detach File
Event Timeline
Log In to Comment