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