Page MenuHomeFreeBSD

D33514.id100154.diff
No OneTemporary

D33514.id100154.diff

Index: stand/Makefile
===================================================================
--- stand/Makefile
+++ stand/Makefile
@@ -80,8 +80,10 @@
SUBDIR_DEPEND_lua+= liblua
SUBDIR_DEPEND_efi+= ${INTERP_DEPENDS}
+SUBDIR_DEPEND_kboot+= ${INTERP_DEPENDS}
.if ${MK_FDT} != "no"
SUBDIR_DEPEND_efi+= fdt
+SUBDIR_DEPEND_kboot+= fdt
.endif
SUBDIR_DEPEND_uboot+= ${INTERP_DEPENDS}
Index: stand/kboot/Makefile
===================================================================
--- stand/kboot/Makefile
+++ stand/kboot/Makefile
@@ -17,30 +17,23 @@
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
+SRCS= vers.c main.c hostcons.c hostdisk.c kbootfdt.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
+.PATH: ${.CURDIR}/arch/${MACHINE_ARCH}
+.include "${.CURDIR}/arch/${MACHINE_ARCH}/Makefile.inc"
# Always add MI sources
.include "${BOOTSRC}/loader.mk"
.PATH: ${SYSDIR}/libkern
+CFLAGS+= -I${.CURDIR} -I${.CURDIR}/arch/${MACHINE_ARCH}
-CFLAGS+= -Wall -DAIM
-# load address. set in linker script
-RELOC?= 0x0
-CFLAGS+= -DRELOC=${RELOC}
-
-LDFLAGS= -nostdlib -static -T ${.CURDIR}/ldscript.powerpc
+CFLAGS+= -Wall
DPADD= ${LDR_INTERP} ${LIBOFW} ${LIBFDT} ${LIBSA}
LDADD= ${LDR_INTERP} ${LIBOFW} ${LIBFDT} ${LIBSA}
-MK_PIE= no
-
.include <bsd.prog.mk>
Index: stand/kboot/arch/powerpc64/Makefile.inc
===================================================================
--- /dev/null
+++ stand/kboot/arch/powerpc64/Makefile.inc
@@ -0,0 +1,14 @@
+CFLAGS+= -mcpu=powerpc64
+
+SRCS+= conf.c ppc64_elf_freebsd.c host_syscall.S kerneltramp.S
+SRCS+= ucmpdi2.c
+
+# load address. set in linker script
+RELOC?= 0x0
+CFLAGS+= -DRELOC=${RELOC}
+
+LDFLAGS= -nostdlib -static -T ${.CURDIR}/arch/${MACHINE_ARCH}/ldscript.powerpc
+
+MK_PIE= no
+# Maybe bogus?
+CFLAGS+= -DAIM
Index: stand/kboot/conf.c
===================================================================
--- /dev/null
+++ stand/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/kboot/host_syscall.S
===================================================================
--- /dev/null
+++ stand/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/kboot/kerneltramp.S
===================================================================
--- /dev/null
+++ stand/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/kboot/ldscript.powerpc
===================================================================
--- /dev/null
+++ stand/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/kboot/ppc64_elf_freebsd.c
===================================================================
--- /dev/null
+++ stand/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
-};

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 7, 5:44 PM (11 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36189920
Default Alt Text
D33514.id100154.diff (17 KB)

Event Timeline