Date: Sun, 20 Dec 2015 12:14:12 -0800 From: Thomas Skibo <thomasskibo@yahoo.com> To: Adrian Chadd <adrian.chadd@gmail.com> Cc: "freebsd-arm@freebsd.org" <freebsd-arm@freebsd.org> Subject: Re: u-boot and ubldr on arm64 Message-ID: <195ED9AE-7759-4833-846D-949BD6F85735@yahoo.com> In-Reply-To: <CAJ-VmokxwNDNM9fNEaPC_%2BKHwkjc8Y_F%2BxKK0dTsGTvZuNU39g@mail.gmail.com> References: <5695944F-A052-4959-8F9A-ACD4CD3413D6@yahoo.com> <CAJ-VmokxwNDNM9fNEaPC_%2BKHwkjc8Y_F%2BxKK0dTsGTvZuNU39g@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_2EBD3790-110C-4818-8F3E-DA21896228AC Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Dec 18, 2015, at 3:24 PM, Adrian Chadd <adrian.chadd@gmail.com> = wrote: >=20 > hey cool! >=20 > Can you post your patches to freebsd and uboot? Let's get them > somewhere reviewed! >=20 >=20 > -a >=20 >=20 Ok. I=E2=80=99m attaching my changes so far. I=E2=80=99ve run out of time = to play with this until after the holidays. I=E2=80=99ve attached an unrelated patch to sys/arm64/arm64/machdep.c = that gets me up and running with an FDT kernel. Opinions welcome from = the arm64 guys. Cheers, =E2=80=94Thomas =E2=80=94 Thomas Skibo thomasskibo@yahoo.com --Apple-Mail=_2EBD3790-110C-4818-8F3E-DA21896228AC Content-Disposition: attachment; filename=ubldr-patches.txt Content-Type: text/plain; name="ubldr-patches.txt" Content-Transfer-Encoding: quoted-printable Index: sys/boot/Makefile.arm64 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/Makefile.arm64 (revision 292455) +++ sys/boot/Makefile.arm64 (working copy) @@ -4,4 +4,4 @@ SUBDIR+=3D fdt .endif =20 -SUBDIR+=3D efi +SUBDIR+=3D efi uboot Index: sys/boot/arm64/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/arm64/Makefile (revision 292455) +++ sys/boot/arm64/Makefile (working copy) @@ -1,3 +1,5 @@ # $FreeBSD$ =20 +SUBDIR=3D uboot + .include <bsd.subdir.mk> Index: sys/boot/arm64/Makefile.inc =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/Makefile.inc 2015-12-19 17:47:30.916631000 -0800 @@ -0,0 +1,3 @@ +# $FreeBSD$ + +.include "../Makefile.inc" Index: sys/boot/arm64/uboot/version =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/version 2015-12-12 07:04:07.979566000 = -0800 @@ -0,0 +1,9 @@ +$FreeBSD$ + +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. + +1.2: Extended with NAND FS support. +1.1: Flattened Device Tree blob support. +1.0: Added storage support. Booting from HDD, USB, etc. is now = possible. +0.5: Initial U-Boot/arm version (netbooting only). Index: sys/boot/arm64/uboot/conf.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/conf.c 2015-12-12 07:02:16.820511000 -0800 @@ -0,0 +1,94 @@ +/*- + * Copyright (c) 2008 Semihalf, Rafal Jaworowski + * 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" +#include "libuboot.h" + +#if defined(LOADER_NET_SUPPORT) +#include "dev_net.h" +#endif + +struct devsw *devsw[] =3D { +#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT) + &uboot_storage, +#endif +#if defined(LOADER_NET_SUPPORT) + &netdev, +#endif + NULL +}; + +struct fs_ops *file_system[] =3D { +#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_NANDFS_SUPPORT) + &nandfs_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 + NULL +}; + +struct netif_driver *netif_drivers[] =3D { +#if defined(LOADER_NET_SUPPORT) + &uboot_net, +#endif + NULL, +}; + +struct file_format *file_formats[] =3D { + &uboot_elf, + NULL +}; + +extern struct console uboot_console; + +struct console *consoles[] =3D { + &uboot_console, + NULL +}; Index: sys/boot/arm64/uboot/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/Makefile 2015-12-17 09:03:26.981847000 = -0800 @@ -0,0 +1,159 @@ +# $FreeBSD$ + +.include <src.opts.mk> + +FILES=3D ubldr ubldr.bin + +NEWVERSWHAT=3D "U-Boot loader" ${MACHINE_ARCH} +BINDIR?=3D /boot +INSTALLFLAGS=3D -b +WARNS?=3D 1 +# Address at which ubldr will be loaded. +# This varies for different boards and SOCs. +UBLDR_LOADADDR?=3D 0x1000000 + +# Architecture-specific loader code +SRCS=3D start.S conf.c self_reloc.c vers.c + +.if !defined(LOADER_NO_DISK_SUPPORT) +LOADER_DISK_SUPPORT?=3D yes +.else +LOADER_DISK_SUPPORT=3D no +.endif +LOADER_UFS_SUPPORT?=3D yes +LOADER_CD9660_SUPPORT?=3D no +LOADER_EXT2FS_SUPPORT?=3D no +.if ${MK_NAND} !=3D "no" +LOADER_NANDFS_SUPPORT?=3D yes +.else +LOADER_NANDFS_SUPPORT?=3D no +.endif +LOADER_NET_SUPPORT?=3D yes +LOADER_NFS_SUPPORT?=3D yes +LOADER_TFTP_SUPPORT?=3D no +LOADER_GZIP_SUPPORT?=3D no +LOADER_BZIP2_SUPPORT?=3D no +.if ${MK_FDT} !=3D "no" +LOADER_FDT_SUPPORT=3D yes +.else +LOADER_FDT_SUPPORT=3D no +.endif + +.if ${LOADER_DISK_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_DISK_SUPPORT +.endif +.if ${LOADER_UFS_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_UFS_SUPPORT +.endif +.if ${LOADER_CD9660_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_CD9660_SUPPORT +.endif +.if ${LOADER_EXT2FS_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_EXT2FS_SUPPORT +.endif +.if ${LOADER_NANDFS_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_NANDFS_SUPPORT +.endif +.if ${LOADER_GZIP_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_GZIP_SUPPORT +.endif +.if ${LOADER_BZIP2_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_BZIP2_SUPPORT +.endif +.if ${LOADER_NET_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_NET_SUPPORT +.endif +.if ${LOADER_NFS_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_NFS_SUPPORT +.endif +.if ${LOADER_TFTP_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -DLOADER_TFTP_SUPPORT +.endif +.if ${LOADER_FDT_SUPPORT} =3D=3D "yes" +CFLAGS+=3D -I${.CURDIR}/../../fdt +CFLAGS+=3D -I${.OBJDIR}/../../fdt +CFLAGS+=3D -DLOADER_FDT_SUPPORT +LIBUBOOT_FDT=3D ${.OBJDIR}/../../uboot/fdt/libuboot_fdt.a +LIBFDT=3D ${.OBJDIR}/../../fdt/libfdt.a +.endif + +CFLAGS+=3D -DNETIF_OPEN_CLOSE_ONCE + +.if ${MK_FORTH} !=3D "no" +# Enable BootForth +BOOT_FORTH=3D yes +CFLAGS+=3D -DBOOT_FORTH -I${.CURDIR}/../../ficl = -I${.CURDIR}/../../ficl/aarch64 +LIBFICL=3D ${.OBJDIR}/../../ficl/libficl.a +.endif + +# Always add MI sources +.PATH: ${.CURDIR}/../../common +.include "${.CURDIR}/../../common/Makefile.inc" +CFLAGS+=3D -I${.CURDIR}/../../common +CFLAGS+=3D -I. + +CLEANFILES+=3D vers.c loader.help + +CFLAGS+=3D -ffreestanding -msoft-float + +LDFLAGS=3D -nostdlib -static -T = ${.CURDIR}/ldscript.${MACHINE_CPUARCH} + +# Pull in common loader code +.PATH: ${.CURDIR}/../../uboot/common +.include "${.CURDIR}/../../uboot/common/Makefile.inc" +CFLAGS+=3D -I${.CURDIR}/../../uboot/common + +# U-Boot standalone support library +LIBUBOOT=3D ${.OBJDIR}/../../uboot/lib/libuboot.a +CFLAGS+=3D -I${.CURDIR}/../../uboot/lib +CFLAGS+=3D -I${.OBJDIR}/../../uboot/lib + +# where to get libstand from +CFLAGS+=3D -I${.CURDIR}/../../../../lib/libstand/ + +# clang doesn't understand %D as a specifier to printf +NO_WERROR.clang=3D + +DPADD=3D ${LIBFICL} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} = ${LIBSTAND} +LDADD=3D ${LIBFICL} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} = -lstand + +OBJS+=3D ${SRCS:N*.h:R:S/$/.o/g} + +vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version + sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version = ${NEWVERSWHAT} + +loader.help: help.common help.uboot ${.CURDIR}/../../fdt/help.fdt + cat ${.ALLSRC} | \ + awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET} + +ldscript.abs: + echo "UBLDR_LOADADDR =3D ${UBLDR_LOADADDR};" >${.TARGET} + +ldscript.pie: + echo "UBLDR_LOADADDR =3D 0;" >${.TARGET} + +ubldr: ${OBJS} ldscript.abs ${.CURDIR}/ldscript.${MACHINE_CPUARCH} = ${DPADD} + ${CC} ${CFLAGS} -T ldscript.abs ${LDFLAGS} \ + -o ${.TARGET} ${OBJS} ${LDADD} + +ubldr.pie: ${OBJS} ldscript.pie ${.CURDIR}/ldscript.${MACHINE_CPUARCH} = ${DPADD} + ${CC} ${CFLAGS} -T ldscript.pie ${LDFLAGS} -pie -Wl,-Bsymbolic \ + -o ${.TARGET} ${OBJS} ${LDADD} + +ubldr.bin: ubldr.pie + ${OBJCOPY} -S -O binary ubldr.pie ${.TARGET} + +CLEANFILES+=3D ldscript.abs ldscript.pie ubldr ubldr.pie ubldr.bin + +.if !defined(LOADER_ONLY) +.PATH: ${.CURDIR}/../../forth +.include "${.CURDIR}/../../forth/Makefile.inc" + +# Install loader.rc. +FILES+=3D loader.rc +# Put sample menu.rc on disk but don't enable it by default. +FILES+=3D menu.rc +FILESNAME_menu.rc=3D menu.rc.sample +.endif + +.include <bsd.prog.mk> Index: sys/boot/arm64/uboot/start.S =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/start.S 2015-12-16 13:38:31.463576000 = -0800 @@ -0,0 +1,122 @@ +/*- + * Copyright (c) 2008 Semihalf, Rafal Czubak + * 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. + * + * $FreeBSD$ + */ + +#include <machine/asm.h> +#include <machine/armreg.h> + + .text + .extern _C_LABEL(self_reloc), _C_LABEL(main) + .weak _DYNAMIC + +/* + * Entry point to the loader that U-Boot passes control to. + */ + .globl _start +_start: + + /*=20 + * Do self-relocation when the weak external symbol _DYNAMIC is = non-NULL. + * When linked as a dynamic relocatable file, the linker = automatically + * defines _DYNAMIC with a value that is the offset of the = dynamic + * relocation info section. + * Note that we're still on u-boot's stack here, but the = self_reloc=20 + * code uses only a couple dozen bytes of stack space. + */ + ldr x15, =3D.here_off /* .here_off is a symbol = whose value */ + ldr x0, [x15] /* is its own offset in the text = seg. */ + sub x0, x15, x0 /* Get its pc-relative address = and */ + ldr x1, .dynamic_off /* subtract its value and we get = */ + cmp x1, #0 /* x0 =3D physaddr we were = loaded at. */ + b.eq 2f + add x1, x1, x0 /* x1 =3D dynamic section = physaddr. */ + bl _C_LABEL(self_reloc) /* Do reloc if _DYNAMIC is = non-NULL. */ +2:=09 + /* Hint where to look for the API signature */ + ldr x15, =3Duboot_address + mov x0, sp + str x0, [x15] + + /* Save U-Boot's x18 */ + ldr x15, =3Dsaved_regs + str x18, [x15, #0] + + /*=20 + * Start loader. This is basically a tail-recursion call; if = main() + * returns, it returns to u-boot (which reports the value = returned x0). + */ + b main + + /*=20 + * Data for self-relocation, in the text segment for pc-rel = access. + */ + .align 3 +.here_off: + .quad . +.dynamic_off: + .quad _DYNAMIC + +/* + * syscall() + */ +ENTRY(syscall) + /* Save caller's lr, x18 */ + ldr x15, =3Dsaved_regs + str x18, [x15, #8] + str lr, [x15, #16] +=09 + /* Restore U-Boot's x18 */ + ldr x18, saved_regs +=09 + /* Call into U-Boot */ + ldr lr, =3Dreturn_from_syscall + ldr x15, syscall_ptr + br x15 +return_from_syscall: + /* Restore loader's x18 and lr */ + ldr lr, saved_regs + 16 + ldr x18, saved_regs + 8 + /* Return to caller */ + ret + +/* + * Data section + */ + .data + .align 3 + .globl syscall_ptr +syscall_ptr: + .quad 0 + + .globl uboot_address +uboot_address: + .quad 0 + +saved_regs: + .quad 0 /* U-Boot's x18 */ + .quad 0 /* Loader's x18 */ + .quad 0 /* Loader's lr */ Index: sys/boot/arm64/uboot/help.uboot =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/help.uboot 2015-12-12 07:02:24.667806000 = -0800 @@ -0,0 +1,27 @@ +$FreeBSD$ + = +#########################################################################= ###### +# Tubenv DShow or import U-Boot environment variables + + ubenv <import | show> [varname ...] + + Display U-Boot environment variables, or import them into the + loader environment (which makes them available in the kernel). + = +#########################################################################= ###### +# Tubenv Simport DImport U-Boot env vars + + ubenv import [varname ...] + + If no variable names are specified, all U-Boot environment + variables are imported. Each variable is prefixed with "uboot." + to avoid any possible conflicts with loader or kernel variables. + = +#########################################################################= ###### +# Tubenv Sshow DShow U-Boot env vars + + ubenv show [varname ...] + + If no variable names are specified, all U-Boot environment + variables are shown. + Index: sys/boot/arm64/uboot/loader.conf =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/loader.conf 2015-12-14 12:03:37.518477000 = -0800 @@ -0,0 +1,13 @@ +# This is defaults/loader.conf for ARM 64, containing defaults for = loader(8). +# Do not modify the contents of this file, instead put your = customizations +# into /boot/loader.conf or /boot/loader.conf.local +# $FreeBSD$ + +autoboot_delay=3D10 +bootfile=3D"kernel" # Kernel name (possibly absolute path) +kernel=3D"kernel" # /boot sub-directory containing kernel and = modules +loader_conf_files=3D"/boot/loader.conf /boot/loader.conf.local" +module_path=3D"/boot/kernel;/boot/modules;/boot/dtb" +nextboot_conf=3D"/boot/nextboot.conf" +nextboot_enable=3D"NO" +verbose_loading=3D"NO" Index: sys/boot/arm64/uboot/ldscript.aarch64 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 2015-12-19 17:44:00.000000000 -0800 +++ sys/boot/arm64/uboot/ldscript.aarch64 2015-12-12 = 07:03:01.792999000 -0800 @@ -0,0 +1,133 @@ +/* $FreeBSD$ */ + +OUTPUT_ARCH(aarch64) +ENTRY(_start) +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . =3D UBLDR_LOADADDR + SIZEOF_HEADERS; + .text : + { + *(.text) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + } =3D0 + _etext =3D .; + PROVIDE (etext =3D .); + .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.sdata : { *(.rela.sdata) } + .rela.sbss : { *(.rela.sbss) } + .rela.sdata2 : { *(.rela.sdata2) } + .rela.sbss2 : { *(.rela.sbss2) } + .init : { *(.init) } =3D0 + .fini : { *(.fini) } =3D0 + .rodata : { *(.rodata) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .sdata2 : { *(.sdata2) } + .sbss2 : { *(.sbss2) } + /* Adjust the address for the data segment to the next page up. */ + . =3D ((. + 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_ =3D .); + .got2 : { *(.got2) } + PROVIDE (__CTOR_LIST__ =3D .); + .ctors : { *(.ctors) } + PROVIDE (__CTOR_END__ =3D .); + PROVIDE (__DTOR_LIST__ =3D .); + .dtors : { *(.dtors) } + PROVIDE (__DTOR_END__ =3D .); + PROVIDE (_FIXUP_START_ =3D .); + .fixup : { *(.fixup) } + PROVIDE (_FIXUP_END_ =3D .); + PROVIDE (_GOT2_END_ =3D .); + PROVIDE (_GOT_START_ =3D .); + .got : { *(.got) } + .got.plt : { *(.got.plt) } + PROVIDE (_GOT_END_ =3D .); + /* We want the small data sections together, so single-instruction = offsets + can access them all, and initialized data all before = uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { *(.sdata) } + _edata =3D .; + PROVIDE (edata =3D .); + .sbss : + { + PROVIDE (__sbss_start =3D .); + *(.sbss) + *(.scommon) + *(.dynsbss) + PROVIDE (__sbss_end =3D .); + } + .plt : { *(.plt) } + .bss : + { + PROVIDE (__bss_start =3D .); + *(.dynbss) + *(.bss) + *(COMMON) + } + _end =3D . ; + PROVIDE (end =3D .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the = beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* These must appear regardless of . */ +} Index: sys/boot/common/load_elf.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/common/load_elf.c (revision 292455) +++ sys/boot/common/load_elf.c (working copy) @@ -198,7 +198,7 @@ * leave dest set to the value calculated by = archsw.arch_loadaddr() and * passed in to this function. */ -#ifndef __arm__ +#if !defined(__arm__) && !defined(__aarch64__) if (ehdr->e_type =3D=3D ET_EXEC) dest =3D (ehdr->e_entry & ~PAGE_MASK); #endif @@ -370,6 +370,24 @@ #ifdef ELF_VERBOSE printf("ehdr->e_entry 0x%08x, va<->pa off %llx\n", = ehdr->e_entry, off); #endif +#elif defined(__aarch64__) + /* + * The elf headers in arm kernels specify virtual addresses in = all + * header fields, even the ones that should be physical = addresses. + * We assume the entry point is in the first 2MB, and masking = the lower + * bits will leave us with the virtual address the kernel was = linked + * at. We subtract that from the load offset, making 'off' into = the + * value which, when added to a virtual address in an elf = header, + * translates it to a physical address. We do the va->pa = conversion on + * the entry point address in the header now, so that later we = can + * launch the kernel by just jumping to that address. + */ +#define KERN_ALIGN (2 * 1024 * 1024) /* XXX: where should this go? */ + off -=3D ehdr->e_entry & ~(KERN_ALIGN-1); + ehdr->e_entry +=3D off; +#ifdef ELF_VERBOSE + printf("ehdr->e_entry %p, va<->pa off 0x%llx\n", ehdr->e_entry, = off); +#endif #else off =3D 0; /* other archs use direct mapped kernels = */ #endif Index: sys/boot/efi/loader/bootinfo.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/efi/loader/bootinfo.c (revision 292455) +++ sys/boot/efi/loader/bootinfo.c (working copy) @@ -217,7 +217,7 @@ if (fp->f_args) MOD_ARGS(addr, fp->f_args, c); v =3D fp->f_addr; -#if defined(__arm__) +#if defined(__arm__) || defined(__aarch64__) v -=3D __elfN(relocation_offset); #endif MOD_ADDR(addr, v, c); @@ -360,7 +360,7 @@ vm_offset_t dtbp; int dtb_size; #endif -#if defined(__arm__) +#if defined(__arm__) || defined(__aarch64__) vm_offset_t vaddr; int i; /* @@ -448,7 +448,7 @@ md =3D file_findmetadata(kfp, MODINFOMD_KERNEND); bcopy(&kernend, md->md_data, sizeof kernend); =20 -#if defined(__arm__) +#if defined(__arm__) || defined(__aarch64__) *modulep -=3D __elfN(relocation_offset); =20 /* Do relocation fixup on metadata of each module. */ Index: sys/boot/uboot/common/main.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/common/main.c (revision 292455) +++ sys/boot/uboot/common/main.c (working copy) @@ -133,7 +133,7 @@ size =3D memsize(si, t[i]); if (size > 0) printf("%s: %lldMB\n", ub_mem_type(t[i]), - size / 1024 / 1024); + (unsigned long long)size / 1024 / 1024); } } =20 @@ -512,7 +512,7 @@ { =20 printf("heap base at %p, top at %p, used %d\n", end, sbrk(0), - sbrk(0) - end); + (int)(sbrk(0) - end)); =20 return (CMD_OK); } @@ -605,7 +605,7 @@ } =20 /* If ldvar is malformed or there's no variable name left, punt. = */ - if (ldvar[0] =3D=3D 0 || var[0] =3D=3D 0) + if ((action =3D=3D UBENV_IMPORT && ldvar[0] =3D=3D 0) || var[0] = =3D=3D 0) return; =20 val =3D ub_env_get(var); Index: sys/boot/uboot/fdt/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/fdt/Makefile (revision 292455) +++ sys/boot/uboot/fdt/Makefile (working copy) @@ -24,7 +24,7 @@ CFLAGS+=3D -I${.CURDIR}/../../common -I${.CURDIR}/../../.. -I. =20 machine: - ln -sf ${.CURDIR}/../../../${MACHINE_CPUARCH}/include machine + ln -sf ${.CURDIR}/../../../${MACHINE}/include machine =20 CLEANFILES+=3D machine =20 Index: sys/boot/uboot/lib/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/lib/Makefile (revision 292455) +++ sys/boot/uboot/lib/Makefile (working copy) @@ -42,7 +42,7 @@ .endif =20 machine: - ln -sf ${.CURDIR}/../../../${MACHINE_CPUARCH}/include machine + ln -sf ${.CURDIR}/../../../${MACHINE}/include machine =20 CLEANFILES+=3D machine =20 Index: sys/boot/uboot/lib/copy.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/lib/copy.c (revision 292455) +++ sys/boot/uboot/lib/copy.c (working copy) @@ -40,7 +40,7 @@ * MD primitives supporting placement of module data=20 */ =20 -#ifdef __arm__ +#if defined(__arm__) || defined(__aarch64__) #define KERN_ALIGN (2 * 1024 * 1024) #else #define KERN_ALIGN PAGE_SIZE Index: sys/boot/uboot/lib/disk.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/lib/disk.c (revision 292455) +++ sys/boot/uboot/lib/disk.c (working copy) @@ -156,8 +156,8 @@ } =20 if (size % SI(dev).bsize) { - stor_printf("size=3D%d not multiple of device block = size=3D%d\n", - size, SI(dev).bsize); + stor_printf("size=3D%ld not multiple of device block = size=3D%d\n", + (long)size, SI(dev).bsize); return (EIO); } bcount =3D size / SI(dev).bsize; Index: sys/boot/uboot/lib/elf_freebsd.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/lib/elf_freebsd.c (revision 292455) +++ sys/boot/uboot/lib/elf_freebsd.c (working copy) @@ -81,7 +81,7 @@ return (error); =20 entry =3D (void *)e->e_entry; - printf("Kernel entry at 0x%x...\n", (unsigned)entry); + printf("Kernel entry at 0x%p...\n", entry); =20 dev_cleanup(); printf("Kernel args: %s\n", fp->f_args); Index: sys/boot/uboot/lib/glue.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/boot/uboot/lib/glue.c (revision 292455) +++ sys/boot/uboot/lib/glue.c (working copy) @@ -109,7 +109,7 @@ { int c; =20 - if (!syscall(API_GETC, NULL, (uint32_t)&c)) + if (!syscall(API_GETC, NULL, (uintptr_t)&c)) return (-1); =20 return (c); @@ -120,7 +120,7 @@ { int t; =20 - if (!syscall(API_TSTC, NULL, (uint32_t)&t)) + if (!syscall(API_TSTC, NULL, (uintptr_t)&t)) return (-1); =20 return (t); @@ -130,14 +130,14 @@ ub_putc(char c) { =20 - syscall(API_PUTC, NULL, (uint32_t)&c); + syscall(API_PUTC, NULL, (uintptr_t)&c); } =20 void ub_puts(const char *s) { =20 - syscall(API_PUTS, NULL, (uint32_t)s); + syscall(API_PUTS, NULL, (uintptr_t)s); } =20 /**************************************** @@ -166,7 +166,7 @@ si.mr_no =3D UB_MAX_MR; memset(&mr, 0, sizeof(mr)); =20 - if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si)) + if (!syscall(API_GET_SYS_INFO, &err, (uintptr_t)&si)) return (NULL); =20 return ((err) ? NULL : &si); @@ -483,7 +483,7 @@ { char *value; =20 - if (!syscall(API_ENV_GET, NULL, (uint32_t)name, = (uint32_t)&value)) + if (!syscall(API_ENV_GET, NULL, (uintptr_t)name, = (uintptr_t)&value)) return (NULL); =20 return (value); @@ -493,7 +493,7 @@ ub_env_set(const char *name, char *value) { =20 - syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value); + syscall(API_ENV_SET, NULL, (uintptr_t)name, (uintptr_t)value); } =20 static char env_name[256]; @@ -510,7 +510,7 @@ * internally, which handles such case */ env =3D NULL; - if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, = (uint32_t)&env)) + if (!syscall(API_ENV_ENUM, NULL, (uintptr_t)last, = (uintptr_t)&env)) return (NULL); =20 if (env =3D=3D NULL || last =3D=3D env) --Apple-Mail=_2EBD3790-110C-4818-8F3E-DA21896228AC Content-Disposition: attachment; filename=u-boot-patches.txt Content-Type: text/plain; name="u-boot-patches.txt" Content-Transfer-Encoding: quoted-printable diff --git a/api/api.c b/api/api.c index c5f6edb..2639ee5 100644 --- a/api/api.c +++ b/api/api.c @@ -52,7 +52,7 @@ static int API_getc(va_list ap) { int *c; =20 - if ((c =3D (int *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((c =3D (int *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 *c =3D getc(); @@ -68,7 +68,7 @@ static int API_tstc(va_list ap) { int *t; =20 - if ((t =3D (int *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((t =3D (int *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 *t =3D tstc(); @@ -84,7 +84,7 @@ static int API_putc(va_list ap) { char *c; =20 - if ((c =3D (char *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((c =3D (char *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 putc(*c); @@ -100,7 +100,7 @@ static int API_puts(va_list ap) { char *s; =20 - if ((s =3D (char *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((s =3D (char *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 puts(s); @@ -132,7 +132,7 @@ static int API_get_sys_info(va_list ap) { struct sys_info *si; =20 - si =3D (struct sys_info *)va_arg(ap, u_int32_t); + si =3D (struct sys_info *)va_arg(ap, uintptr_t); if (si =3D=3D NULL) return API_ENOMEM; =20 @@ -148,7 +148,7 @@ static int API_udelay(va_list ap) { unsigned long *d; =20 - if ((d =3D (unsigned long *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((d =3D (unsigned long *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 udelay(*d); @@ -164,11 +164,11 @@ static int API_get_timer(va_list ap) { unsigned long *base, *cur; =20 - cur =3D (unsigned long *)va_arg(ap, u_int32_t); + cur =3D (unsigned long *)va_arg(ap, uintptr_t); if (cur =3D=3D NULL) return API_EINVAL; =20 - base =3D (unsigned long *)va_arg(ap, u_int32_t); + base =3D (unsigned long *)va_arg(ap, uintptr_t); if (base =3D=3D NULL) return API_EINVAL; =20 @@ -199,7 +199,7 @@ static int API_dev_enum(va_list ap) struct device_info *di; =20 /* arg is ptr to the device_info struct we are going to fill out = */ - di =3D (struct device_info *)va_arg(ap, u_int32_t); + di =3D (struct device_info *)va_arg(ap, uintptr_t); if (di =3D=3D NULL) return API_EINVAL; =20 @@ -233,7 +233,7 @@ static int API_dev_open(va_list ap) int err =3D 0; =20 /* arg is ptr to the device_info struct */ - di =3D (struct device_info *)va_arg(ap, u_int32_t); + di =3D (struct device_info *)va_arg(ap, uintptr_t); if (di =3D=3D NULL) return API_EINVAL; =20 @@ -265,7 +265,7 @@ static int API_dev_close(va_list ap) int err =3D 0; =20 /* arg is ptr to the device_info struct */ - di =3D (struct device_info *)va_arg(ap, u_int32_t); + di =3D (struct device_info *)va_arg(ap, uintptr_t); if (di =3D=3D NULL) return API_EINVAL; =20 @@ -319,7 +319,7 @@ static int API_dev_write(va_list ap) int err =3D 0; =20 /* 1. arg is ptr to the device_info struct */ - di =3D (struct device_info *)va_arg(ap, u_int32_t); + di =3D (struct device_info *)va_arg(ap, uintptr_t); if (di =3D=3D NULL) return API_EINVAL; =20 @@ -329,12 +329,12 @@ static int API_dev_write(va_list ap) return API_ENODEV; =20 /* 2. arg is ptr to buffer from where to get data to write */ - buf =3D (void *)va_arg(ap, u_int32_t); + buf =3D (void *)va_arg(ap, uintptr_t); if (buf =3D=3D NULL) return API_EINVAL; =20 /* 3. arg is length of buffer */ - len =3D (int *)va_arg(ap, u_int32_t); + len =3D (int *)va_arg(ap, uintptr_t); if (len =3D=3D NULL) return API_EINVAL; if (*len <=3D 0) @@ -387,7 +387,7 @@ static int API_dev_read(va_list ap) int *len_net, *act_len_net; =20 /* 1. arg is ptr to the device_info struct */ - di =3D (struct device_info *)va_arg(ap, u_int32_t); + di =3D (struct device_info *)va_arg(ap, uintptr_t); if (di =3D=3D NULL) return API_EINVAL; =20 @@ -397,23 +397,23 @@ static int API_dev_read(va_list ap) return API_ENODEV; =20 /* 2. arg is ptr to buffer from where to put the read data */ - buf =3D (void *)va_arg(ap, u_int32_t); + buf =3D (void *)va_arg(ap, uintptr_t); if (buf =3D=3D NULL) return API_EINVAL; =20 if (di->type & DEV_TYP_STOR) { /* 3. arg - ptr to var with # of blocks to read */ - len_stor =3D (lbasize_t *)va_arg(ap, u_int32_t); + len_stor =3D (lbasize_t *)va_arg(ap, uintptr_t); if (!len_stor) return API_EINVAL; if (*len_stor <=3D 0) return API_EINVAL; =20 /* 4. arg - ptr to var with start block */ - start =3D (lbastart_t *)va_arg(ap, u_int32_t); + start =3D (lbastart_t *)va_arg(ap, uintptr_t); =20 /* 5. arg - ptr to var where to put the len actually = read */ - act_len_stor =3D (lbasize_t *)va_arg(ap, u_int32_t); + act_len_stor =3D (lbasize_t *)va_arg(ap, uintptr_t); if (!act_len_stor) return API_EINVAL; =20 @@ -422,14 +422,14 @@ static int API_dev_read(va_list ap) } else if (di->type & DEV_TYP_NET) { =20 /* 3. arg points to the var with length of packet to = read */ - len_net =3D (int *)va_arg(ap, u_int32_t); + len_net =3D (int *)va_arg(ap, uintptr_t); if (!len_net) return API_EINVAL; if (*len_net <=3D 0) return API_EINVAL; =20 /* 4. - ptr to var where to put the len actually read */ - act_len_net =3D (int *)va_arg(ap, u_int32_t); + act_len_net =3D (int *)va_arg(ap, uintptr_t); if (!act_len_net) return API_EINVAL; =20 @@ -453,9 +453,9 @@ static int API_env_get(va_list ap) { char *name, **value; =20 - if ((name =3D (char *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((name =3D (char *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; - if ((value =3D (char **)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((value =3D (char **)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 *value =3D getenv(name); @@ -476,9 +476,9 @@ static int API_env_set(va_list ap) { char *name, *value; =20 - if ((name =3D (char *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((name =3D (char *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; - if ((value =3D (char *)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((value =3D (char *)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 setenv(name, value); @@ -498,9 +498,9 @@ static int API_env_enum(va_list ap) int i, n; char *last, **next; =20 - last =3D (char *)va_arg(ap, u_int32_t); + last =3D (char *)va_arg(ap, uintptr_t); =20 - if ((next =3D (char **)va_arg(ap, u_int32_t)) =3D=3D NULL) + if ((next =3D (char **)va_arg(ap, uintptr_t)) =3D=3D NULL) return API_EINVAL; =20 if (last =3D=3D NULL) @@ -586,7 +586,7 @@ static cfp_t calls_table[API_MAXCALL] =3D { NULL, }; * The main syscall entry point - this is not reentrant, only one call = is * serviced until finished. * - * e.g. syscall(1, int *, u_int32_t, u_int32_t, u_int32_t, u_int32_t); + * e.g. syscall(1, int *, uintptr_t, uintptr_t, uintptr_t, uintptr_t); * * call: syscall number * diff --git a/examples/api/crt0.S b/examples/api/crt0.S index 78d35a2..eb6312e 100644 --- a/examples/api/crt0.S +++ b/examples/api/crt0.S @@ -25,6 +25,22 @@ syscall: mtctr %r11 bctr =20 +#elif defined(CONFIG_ARM64) + + .text + .globl _start +_start: + ldr x14, =3Dsearch_hint + mov x15, sp + str x15, [x14] + b main + + + .globl syscall +syscall: + ldr x15, syscall_ptr + br x15 + #elif defined(CONFIG_ARM) =20 .text @@ -45,10 +61,10 @@ syscall: #endif =20 .globl syscall_ptr + .align 3 syscall_ptr: - .align 4 - .long 0 + .quad 0 =20 .globl search_hint search_hint: - .long 0 + .quad 0 diff --git a/examples/api/demo.c b/examples/api/demo.c index 8c30457..e1693ef 100644 --- a/examples/api/demo.c +++ b/examples/api/demo.c @@ -43,12 +43,11 @@ int main(int argc, char * const argv[]) if (sig->version > API_SIG_VERSION) return -3; =20 - printf("API signature found @%x\n", (unsigned int)sig); + printf("API signature found @0x%p\n", sig); test_dump_sig(sig); =20 printf("\n*** Consumer API test ***\n"); - printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr, - (unsigned int)&syscall_ptr); + printf("syscall ptr 0x%p @0x%p\n", syscall_ptr, &syscall_ptr); =20 /* console activities */ ub_putc('B'); @@ -203,7 +202,7 @@ void test_dump_sig(struct api_signature *sig) printf("signature:\n"); printf(" version\t=3D %d\n", sig->version); printf(" checksum\t=3D 0x%08x\n", sig->checksum); - printf(" sc entry\t=3D 0x%08x\n", (unsigned int)sig->syscall); + printf(" sc entry\t=3D 0x%p\n", (void *)sig->syscall); } =20 void test_dump_si(struct sys_info *si) @@ -296,7 +295,7 @@ void test_dump_di(int handle) struct device_info *di =3D ub_dev_get(handle); =20 printf("device info (%d):\n", handle); - printf(" cookie\t=3D 0x%08x\n", (uint32_t)di->cookie); + printf(" cookie\t=3D 0x%p\n", di->cookie); printf(" type\t\t=3D 0x%08x\n", di->type); =20 if (di->type =3D=3D DEV_TYP_NET) { diff --git a/examples/api/glue.c b/examples/api/glue.c index d619518..d5c1809 100644 --- a/examples/api/glue.c +++ b/examples/api/glue.c @@ -41,8 +41,8 @@ static int valid_sig(struct api_signature *sig) int api_search_sig(struct api_signature **sig) { unsigned char *sp; - uint32_t search_start =3D 0; - uint32_t search_end =3D 0; + uintptr_t search_start =3D 0; + uintptr_t search_end =3D 0; =20 if (sig =3D=3D NULL) return 0; @@ -77,7 +77,7 @@ int ub_getc(void) { int c; =20 - if (!syscall(API_GETC, NULL, (uint32_t)&c)) + if (!syscall(API_GETC, NULL, (uintptr_t)&c)) return -1; =20 return c; @@ -87,7 +87,7 @@ int ub_tstc(void) { int t; =20 - if (!syscall(API_TSTC, NULL, (uint32_t)&t)) + if (!syscall(API_TSTC, NULL, (uintptr_t)&t)) return -1; =20 return t; @@ -95,12 +95,12 @@ int ub_tstc(void) =20 void ub_putc(char c) { - syscall(API_PUTC, NULL, (uint32_t)&c); + syscall(API_PUTC, NULL, (uintptr_t)&c); } =20 void ub_puts(const char *s) { - syscall(API_PUTS, NULL, (uint32_t)s); + syscall(API_PUTS, NULL, (uintptr_t)s); } =20 /**************************************** @@ -126,7 +126,7 @@ struct sys_info * ub_get_sys_info(void) si.mr_no =3D UB_MAX_MR; memset(&mr, 0, sizeof(mr)); =20 - if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si)) + if (!syscall(API_GET_SYS_INFO, &err, (uintptr_t)&si)) return NULL; =20 return ((err) ? NULL : &si); @@ -344,7 +344,7 @@ char * ub_env_get(const char *name) { char *value; =20 - if (!syscall(API_ENV_GET, NULL, (uint32_t)name, = (uint32_t)&value)) + if (!syscall(API_ENV_GET, NULL, (uintptr_t)name, = (uintptr_t)&value)) return NULL; =20 return value; @@ -352,7 +352,7 @@ char * ub_env_get(const char *name) =20 void ub_env_set(const char *name, char *value) { - syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value); + syscall(API_ENV_SET, NULL, (uintptr_t)name, (uintptr_t)value); } =20 static char env_name[256]; @@ -369,7 +369,7 @@ const char * ub_env_enum(const char *last) * 'name=3Dval' string), since the API_ENUM_ENV call uses = envmatch() * internally, which handles such case */ - if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, = (uint32_t)&env)) + if (!syscall(API_ENV_ENUM, NULL, (uintptr_t)last, = (uintptr_t)&env)) return NULL; =20 if (!env) @@ -396,7 +396,8 @@ int ub_display_get_info(int type, struct = display_info *di) { int err =3D 0; =20 - if (!syscall(API_DISPLAY_GET_INFO, &err, (uint32_t)type, = (uint32_t)di)) + if (!syscall(API_DISPLAY_GET_INFO, &err, (uintptr_t)type, + (uintptr_t)di)) return API_ESYSC; =20 return err; diff --git a/examples/api/glue.h b/examples/api/glue.h index 91c8c1c..3e27a4e 100644 --- a/examples/api/glue.h +++ b/examples/api/glue.h @@ -19,7 +19,7 @@ #define UB_MAX_DEV 6 /* max devices number */ =20 extern void *syscall_ptr; -extern uint32_t search_hint; +extern uintptr_t search_hint; =20 int syscall(int, int *, ...); int api_search_sig(struct api_signature **sig); diff --git a/examples/api/libgenwrap.c b/examples/api/libgenwrap.c index c1afa5b..4f78c15 100644 --- a/examples/api/libgenwrap.c +++ b/examples/api/libgenwrap.c @@ -23,7 +23,7 @@ int printf (const char *fmt, ...) { va_list args; uint i; - char printbuffer[256]; + char printbuffer[512]; =20 va_start (args, fmt); =20 --Apple-Mail=_2EBD3790-110C-4818-8F3E-DA21896228AC Content-Disposition: attachment; filename=machdep-patch.txt Content-Type: text/plain; name="machdep-patch.txt" Content-Transfer-Encoding: 7bit Index: sys/arm64/arm64/machdep.c =================================================================== --- sys/arm64/arm64/machdep.c (revision 292455) +++ sys/arm64/arm64/machdep.c (working copy) @@ -766,8 +766,19 @@ try_load_dtb(caddr_t kmdp) { vm_offset_t dtbp; + struct mem_region mem_regions[FDT_MEM_REGIONS]; + uint32_t memsize; /* XXX: fdt_get_mem_regions() can't handle 64-bit */ + int i, mem_regions_sz; dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); +#ifdef FDT_DTB_STATIC + /* + * If the device tree blob was not retrieved from metadata, + * try to use the statically embedded one. + */ + if (dtbp == (vm_offset_t)NULL) + dtbp = (vm_offset_t)&fdt_static_dtb; +#endif if (dtbp == (vm_offset_t)NULL) { printf("ERROR loading DTB\n"); return; @@ -778,6 +789,19 @@ if (OF_init((void *)dtbp) != 0) panic("OF_init failed with the found device tree"); + + /* Grab physical memory regions information from device tree. */ + if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, &memsize) != 0) { + printf("No physical memory regions in DTB\n"); + return; + } + + for (i = 0; i < mem_regions_sz; i++) { + if (!add_physmap_entry(mem_regions[i].mr_start, + mem_regions[i].mr_size, physmap, + &physmap_idx)) + break; + } } #endif @@ -822,10 +846,6 @@ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); -#ifdef FDT - try_load_dtb(kmdp); -#endif - /* Find the address to start allocating from */ lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); @@ -833,8 +853,13 @@ physmap_idx = 0; efihdr = (struct efi_map_header *)preload_search_info(kmdp, MODINFO_METADATA | MODINFOMD_EFI_MAP); - add_efi_map_entries(efihdr, physmap, &physmap_idx); + if (efihdr != NULL) + add_efi_map_entries(efihdr, physmap, &physmap_idx); +#ifdef FDT + try_load_dtb(kmdp); +#endif + /* Print the memory map */ mem_len = 0; for (i = 0; i < physmap_idx; i += 2) { --Apple-Mail=_2EBD3790-110C-4818-8F3E-DA21896228AC--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?195ED9AE-7759-4833-846D-949BD6F85735>