From owner-svn-src-stable-11@freebsd.org Fri Apr 6 20:24:52 2018 Return-Path: Delivered-To: svn-src-stable-11@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8E656F836F4; Fri, 6 Apr 2018 20:24:52 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 3E80374845; Fri, 6 Apr 2018 20:24:52 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 393A016BBE; Fri, 6 Apr 2018 20:24:52 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w36KOqqt058540; Fri, 6 Apr 2018 20:24:52 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w36KOpTi058529; Fri, 6 Apr 2018 20:24:51 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <201804062024.w36KOpTi058529@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Fri, 6 Apr 2018 20:24:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r332150 - in stable/11/stand: . common mips/beri/loader powerpc/kboot powerpc/ofw sparc64/loader uboot/common uboot/lib X-SVN-Group: stable-11 X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: in stable/11/stand: . common mips/beri/loader powerpc/kboot powerpc/ofw sparc64/loader uboot/common uboot/lib X-SVN-Commit-Revision: 332150 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-11@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for only the 11-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Apr 2018 20:24:52 -0000 Author: kevans Date: Fri Apr 6 20:24:50 2018 New Revision: 332150 URL: https://svnweb.freebsd.org/changeset/base/332150 Log: MFC r329190, r329315, r330131: metadata load file unification r329190: Unify metadata load files for arm, mips, powerpc, sparc64 Summary: All metadata.c files are very similar, with only trivial changes. Unify them into a single common file, with minor special-casing where needed. r329315: stand: Fix ubldr after r329190 metadata load files were consolidated in r329190, and these relocation fixup bits were inadvertently dropped in the process. Re-add them to fix boot with ubldr. r330131: Fix module loading on arm after the metadata.c unification in r329190. Arm modules need an additional address fixup not needed by other platforms. Added: stable/11/stand/common/metadata.c - copied, changed from r329190, head/stand/common/metadata.c Deleted: stable/11/stand/mips/beri/loader/metadata.c stable/11/stand/powerpc/kboot/metadata.c stable/11/stand/powerpc/ofw/metadata.c stable/11/stand/sparc64/loader/metadata.c stable/11/stand/uboot/common/metadata.c Modified: stable/11/stand/loader.mk stable/11/stand/mips/beri/loader/Makefile stable/11/stand/mips/beri/loader/exec.c stable/11/stand/mips/beri/loader/loader.h stable/11/stand/powerpc/kboot/Makefile stable/11/stand/powerpc/kboot/main.c stable/11/stand/powerpc/ofw/Makefile stable/11/stand/sparc64/loader/Makefile stable/11/stand/uboot.mk stable/11/stand/uboot/lib/elf_freebsd.c Directory Properties: stable/11/ (props changed) Copied and modified: stable/11/stand/common/metadata.c (from r329190, head/stand/common/metadata.c) ============================================================================== --- head/stand/common/metadata.c Tue Feb 13 03:44:50 2018 (r329190, copy source) +++ stable/11/stand/common/metadata.c Fri Apr 6 20:24:50 2018 (r332150) @@ -38,6 +38,9 @@ __FBSDID("$FreeBSD$"); #include #endif +#ifdef __arm__ +#include +#endif #include #include "bootstrap.h" @@ -262,6 +265,7 @@ md_copymodules(vm_offset_t addr, int kern64) struct preloaded_file *fp; struct file_metadata *md; uint64_t scratch64; + uint32_t scratch32; int c; c = addr != 0; @@ -278,7 +282,11 @@ md_copymodules(vm_offset_t addr, int kern64) scratch64 = fp->f_size; MOD_SIZE(addr, scratch64, c); } else { - MOD_ADDR(addr, fp->f_addr, c); + scratch32 = fp->f_addr; +#ifdef __arm__ + scratch32 -= __elfN(relocation_offset); +#endif + MOD_ADDR(addr, scratch32, c); MOD_SIZE(addr, fp->f_size, c); } for (md = fp->f_metadata; md != NULL; md = md->md_next) { @@ -315,7 +323,23 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs uint64_t scratch64; char *rootdevname; int howto; +#ifdef __arm__ + vm_offset_t vaddr; + int i; + /* + * These metadata addreses must be converted for kernel after + * relocation. + */ + uint32_t mdt[] = { + MODINFOMD_SSYM, MODINFOMD_ESYM, MODINFOMD_KERNEND, + MODINFOMD_ENVP, +#if defined(LOADER_FDT_SUPPORT) + MODINFOMD_DTBP +#endif + }; +#endif + align = kern64 ? 8 : 4; howto = md_getboothowto(args); @@ -409,6 +433,23 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs } else { bcopy(&kernend, md->md_data, sizeof kernend); } + +#ifdef __arm__ + /* Convert addresses to the final VA */ + *modulep -= __elfN(relocation_offset); + + /* Do relocation fixup on metadata of each module. */ + for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) { + for (i = 0; i < nitems(mdt); i++) { + md = file_findmetadata(xp, mdt[i]); + if (md) { + bcopy(md->md_data, &vaddr, sizeof vaddr); + vaddr -= __elfN(relocation_offset); + bcopy(&vaddr, md->md_data, sizeof vaddr); + } + } + } +#endif (void)md_copymodules(addr, kern64); #if defined(LOADER_FDT_SUPPORT) Modified: stable/11/stand/loader.mk ============================================================================== --- stable/11/stand/loader.mk Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/loader.mk Fri Apr 6 20:24:50 2018 (r332150) @@ -22,12 +22,16 @@ SRCS+= load_elf32.c reloc_elf32.c .elif ${MACHINE_CPUARCH} == "powerpc" SRCS+= load_elf32.c reloc_elf32.c SRCS+= load_elf64.c reloc_elf64.c +SRCS+= metadata.c .elif ${MACHINE_CPUARCH} == "sparc64" SRCS+= load_elf64.c reloc_elf64.c +SRCS+= metadata.c .elif ${MACHINE_ARCH:Mmips64*} != "" SRCS+= load_elf64.c reloc_elf64.c +SRCS+= metadata.c .elif ${MACHINE} == "mips" SRCS+= load_elf32.c reloc_elf32.c +SRCS+= metadata.c .endif .if ${LOADER_DISK_SUPPORT:Uyes} == "yes" Modified: stable/11/stand/mips/beri/loader/Makefile ============================================================================== --- stable/11/stand/mips/beri/loader/Makefile Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/mips/beri/loader/Makefile Fri Apr 6 20:24:50 2018 (r332150) @@ -47,7 +47,6 @@ SRCS= start.S \ main.c \ devicename.c \ exec.c \ - metadata.c \ vers.c \ arch.c Modified: stable/11/stand/mips/beri/loader/exec.c ============================================================================== --- stable/11/stand/mips/beri/loader/exec.c Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/mips/beri/loader/exec.c Fri Apr 6 20:24:50 2018 (r332150) @@ -85,7 +85,7 @@ beri_elf64_exec(struct preloaded_file *fp) } ehdr = (Elf_Ehdr *)md->md_data; - error = md_load64(fp->f_args, &mdp); + error = md_load64(fp->f_args, &mdp, NULL); if (error) { printf("%s: md_load64 failed\n", fp->f_name); return (error); Modified: stable/11/stand/mips/beri/loader/loader.h ============================================================================== --- stable/11/stand/mips/beri/loader/loader.h Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/mips/beri/loader/loader.h Fri Apr 6 20:24:50 2018 (r332150) @@ -56,7 +56,7 @@ extern char **boot2_envv; extern struct bootinfo boot2_bootinfo; /* metadata.c */ -int md_load64(char *args, vm_offset_t *modulep); +int md_load64(char *args, vm_offset_t *modulep, vm_offset_t *dtbp); /* vers.c */ extern char bootprog_info[]; Modified: stable/11/stand/powerpc/kboot/Makefile ============================================================================== --- stable/11/stand/powerpc/kboot/Makefile Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/powerpc/kboot/Makefile Fri Apr 6 20:24:50 2018 (r332150) @@ -17,7 +17,7 @@ NEWVERSWHAT= "kboot loader" ${MACHINE_ARCH} INSTALLFLAGS= -b # Architecture-specific loader code -SRCS= conf.c metadata.c vers.c main.c ppc64_elf_freebsd.c +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 Modified: stable/11/stand/powerpc/kboot/main.c ============================================================================== --- stable/11/stand/powerpc/kboot/main.c Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/powerpc/kboot/main.c Fri Apr 6 20:24:50 2018 (r332150) @@ -291,6 +291,7 @@ main(int argc, const char **argv) setenv("currdev", bootdev, 1); setenv("loaddev", bootdev, 1); setenv("LINES", "24", 1); + setenv("usefdt", "1", 1); interact(); /* doesn't return */ Modified: stable/11/stand/powerpc/ofw/Makefile ============================================================================== --- stable/11/stand/powerpc/ofw/Makefile Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/powerpc/ofw/Makefile Fri Apr 6 20:24:50 2018 (r332150) @@ -17,7 +17,7 @@ NEWVERSWHAT= "Open Firmware loader" ${MACHINE_ARCH} INSTALLFLAGS= -b # Architecture-specific loader code -SRCS= conf.c metadata.c vers.c start.c +SRCS= conf.c vers.c start.c SRCS+= ucmpdi2.c .include "${BOOTSRC}/fdt.mk" Modified: stable/11/stand/sparc64/loader/Makefile ============================================================================== --- stable/11/stand/sparc64/loader/Makefile Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/sparc64/loader/Makefile Fri Apr 6 20:24:50 2018 (r332150) @@ -25,7 +25,7 @@ HAVE_ZFS= yes # Architecture-specific loader code .PATH: ${BOOTSRC}/sparc64/loader -SRCS= locore.S main.c metadata.c vers.c +SRCS= locore.S main.c vers.c .if ${LOADER_DEBUG} == "yes" CFLAGS+= -DLOADER_DEBUG Modified: stable/11/stand/uboot.mk ============================================================================== --- stable/11/stand/uboot.mk Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/uboot.mk Fri Apr 6 20:24:50 2018 (r332150) @@ -1,6 +1,6 @@ # $FreeBSD$ -SRCS+= main.c metadata.c +SRCS+= main.c .PATH: ${UBOOTSRC}/common @@ -10,6 +10,9 @@ CFLAGS+= -I${UBOOTSRC}/common LIBUBOOT= ${BOOTOBJ}/uboot/lib/libuboot.a CFLAGS+= -I${UBOOTSRC}/lib CFLAGS+= -I${BOOTOBJ}/uboot/lib +.if ${MACHINE_CPUARCH} == "arm" +SRCS+= metadata.c +.endif .include "${BOOTSRC}/fdt.mk" Modified: stable/11/stand/uboot/lib/elf_freebsd.c ============================================================================== --- stable/11/stand/uboot/lib/elf_freebsd.c Fri Apr 6 19:59:27 2018 (r332149) +++ stable/11/stand/uboot/lib/elf_freebsd.c Fri Apr 6 20:24:50 2018 (r332150) @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); #include "bootstrap.h" #include "libuboot.h" -extern vm_offset_t md_load(char *, vm_offset_t *); +extern vm_offset_t md_load(char *, vm_offset_t *, vm_offset_t *); int __elfN(uboot_load)(char *filename, u_int64_t dest, @@ -81,7 +81,7 @@ __elfN(uboot_exec)(struct preloaded_file *fp) e = (Elf_Ehdr *)&fmp->md_data; - if ((error = md_load(fp->f_args, &mdp)) != 0) + if ((error = md_load(fp->f_args, &mdp, NULL)) != 0) return (error); entry = (void *)e->e_entry;