From owner-svn-src-projects@FreeBSD.ORG Sat Feb 15 16:19:32 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 648CFEB; Sat, 15 Feb 2014 16:19:32 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5080C13E2; Sat, 15 Feb 2014 16:19:32 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s1FGJWXt092253; Sat, 15 Feb 2014 16:19:32 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s1FGJVek092249; Sat, 15 Feb 2014 16:19:31 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201402151619.s1FGJVek092249@svn.freebsd.org> From: Andrew Turner Date: Sat, 15 Feb 2014 16:19:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r261936 - projects/arm64/sys/boot/arm64/efi X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Feb 2014 16:19:32 -0000 Author: andrew Date: Sat Feb 15 16:19:31 2014 New Revision: 261936 URL: http://svnweb.freebsd.org/changeset/base/261936 Log: Use the copy{in,out} functions from the amd64 loader on the uefi branch. Added: projects/arm64/sys/boot/arm64/efi/copy.c (contents, props changed) Modified: projects/arm64/sys/boot/arm64/efi/Makefile projects/arm64/sys/boot/arm64/efi/libarm64.h projects/arm64/sys/boot/arm64/efi/main.c Modified: projects/arm64/sys/boot/arm64/efi/Makefile ============================================================================== --- projects/arm64/sys/boot/arm64/efi/Makefile Sat Feb 15 16:17:38 2014 (r261935) +++ projects/arm64/sys/boot/arm64/efi/Makefile Sat Feb 15 16:19:31 2014 (r261936) @@ -11,7 +11,7 @@ INTERNALPROG= # architecture-specific loader code SRCS= start.S main.c conf.c vers.c reloc.c autoload.c -SRCS+= devicename.c exec.c +SRCS+= copy.c devicename.c exec.c CFLAGS+= -fno-builtin CFLAGS+= -I${.CURDIR} Added: projects/arm64/sys/boot/arm64/efi/copy.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/arm64/sys/boot/arm64/efi/copy.c Sat Feb 15 16:19:31 2014 (r261936) @@ -0,0 +1,90 @@ +/*- + * Copyright (c) 2013 The FreeBSD Foundation + * Copyright (c) 2014 Andrew turner + * All rights reserved. + * + * This software was developed by Benno Rice under sponsorship from + * the FreeBSD Foundation. + * 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include + +#include +#include + +#define STAGE_PAGES 8192 /* 32MB */ + +EFI_PHYSICAL_ADDRESS staging; +int stage_offset_set = 0; +ssize_t stage_offset; + +int +arm64_efi_copy_init(void) +{ + EFI_STATUS status; + + status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData, + STAGE_PAGES, &staging); + if (EFI_ERROR(status)) { + printf("failed to allocate staging area: %d\n", + status & EFI_ERROR_MASK); + return (status); + } + + return (0); +} + +ssize_t +arm64_efi_copyin(const void *src, vm_offset_t dest, const size_t len) +{ + + if (!stage_offset_set) { + stage_offset = (vm_offset_t)staging - dest; + stage_offset_set = 1; + } + + bcopy(src, (void *)(dest + stage_offset), len); + return (len); +} + +ssize_t +arm64_efi_copyout(const vm_offset_t src, void *dest, const size_t len) +{ + + bcopy((void *)(src + stage_offset), dest, len); + return (len); +} + +ssize_t +arm64_efi_readin(const int fd, vm_offset_t dest, const size_t len) +{ + + return (read(fd, (void *)(dest + stage_offset), len)); +} + Modified: projects/arm64/sys/boot/arm64/efi/libarm64.h ============================================================================== --- projects/arm64/sys/boot/arm64/efi/libarm64.h Sat Feb 15 16:17:38 2014 (r261935) +++ projects/arm64/sys/boot/arm64/efi/libarm64.h Sat Feb 15 16:19:31 2014 (r261936) @@ -34,5 +34,11 @@ int arm64_getdev(void **vdev, const char char *arm64_fmtdev(void *vdev); int arm64_setcurrdev(struct env_var *ev, int flags, const void *value); +/* copy.c */ +int arm64_efi_copy_init(void); +ssize_t arm64_efi_copyin(const void *src, vm_offset_t dest, const size_t len); +ssize_t arm64_efi_copyout(const vm_offset_t src, void *dest, const size_t len); +ssize_t arm64_efi_readin(const int fd, vm_offset_t dest, const size_t len); + #endif /* _LIBARM64_H_ */ Modified: projects/arm64/sys/boot/arm64/efi/main.c ============================================================================== --- projects/arm64/sys/boot/arm64/efi/main.c Sat Feb 15 16:17:38 2014 (r261935) +++ projects/arm64/sys/boot/arm64/efi/main.c Sat Feb 15 16:19:31 2014 (r261936) @@ -47,26 +47,6 @@ extern char bootprog_maker[]; struct devdesc currdev; /* our current device */ struct arch_switch archsw; /* MI/MD interface boundary */ -ssize_t -arm64_copyin(const void *src, vm_offset_t dest, const size_t len) -{ - bcopy(src, (void *)dest, len); - return (len); -} - -ssize_t -arm64_copyout(vm_offset_t src, void *dest, const size_t len) -{ - bcopy((void *)src, dest, len); - return (len); -} - -ssize_t -arm64_readin(int fd, vm_offset_t va, size_t len) -{ - return read(fd, va, len); -} - EFI_GUID acpi = ACPI_TABLE_GUID; EFI_GUID acpi20 = ACPI_20_TABLE_GUID; EFI_GUID devid = DEVICE_PATH_PROTOCOL; @@ -90,6 +70,11 @@ main(int argc, CHAR16 *argv[]) */ cons_probe(); + if (arm64_efi_copy_init()) { + printf("failed to allocate staging area\n"); + exit(EFI_BUFFER_TOO_SMALL); + } + /* * March through the device switch probing for things. */ @@ -140,9 +125,9 @@ main(int argc, CHAR16 *argv[]) archsw.arch_autoload = amd64_autoload; archsw.arch_getdev = arm64_getdev; - archsw.arch_copyin = arm64_copyin; - archsw.arch_copyout = arm64_copyout; - archsw.arch_readin = arm64_readin; + archsw.arch_copyin = arm64_efi_copyin; + archsw.arch_copyout = arm64_efi_copyout; + archsw.arch_readin = arm64_efi_readin; interact(); /* doesn't return */