svn commit: r261936 - projects/arm64/sys/boot/arm64/efi

Andrew Turner andrew at FreeBSD.org
Sat Feb 15 16:19:32 UTC 2014


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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include <stand.h>
+#include <bootstrap.h>
+
+#include <efi.h>
+#include <efilib.h>
+
+#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 */
 


More information about the svn-src-projects mailing list