Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Feb 2014 18:07:32 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r261942 - projects/arm64/sys/boot/arm64/efi
Message-ID:  <201402151807.s1FI7WfC038981@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Sat Feb 15 18:07:31 2014
New Revision: 261942
URL: http://svnweb.freebsd.org/changeset/base/261942

Log:
  Implement elf64_exec on arm64.

Modified:
  projects/arm64/sys/boot/arm64/efi/exec.c

Modified: projects/arm64/sys/boot/arm64/efi/exec.c
==============================================================================
--- projects/arm64/sys/boot/arm64/efi/exec.c	Sat Feb 15 18:06:49 2014	(r261941)
+++ projects/arm64/sys/boot/arm64/efi/exec.c	Sat Feb 15 18:07:31 2014	(r261942)
@@ -39,6 +39,8 @@ __FBSDID("$FreeBSD$");
 #include <efi.h>
 #include <efilib.h>
 
+#include "libarm64.h"
+
 static int elf64_exec(struct preloaded_file *amp);
 static int elf64_obj_exec(struct preloaded_file *amp);
 
@@ -55,8 +57,38 @@ struct file_format *file_formats[] = {
 static int
 elf64_exec(struct preloaded_file *fp)
 {
-	printf("elf64_exec\n");
-	return (EINVAL);
+	struct file_metadata *md;
+	EFI_STATUS status;
+	UINTN descsz, memmapsz, mapkey;
+	UINT32 descver;
+	Elf_Ehdr *ehdr;
+	void (*entry)(void *);
+
+	if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
+        	return(EFTYPE);
+
+	ehdr = (Elf_Ehdr *)&(md->md_data);
+
+	entry = arm64_efi_translate(ehdr->e_entry);
+
+	memmapsz = 0;
+	status = BS->GetMemoryMap(&memmapsz, NULL, &mapkey, &descsz, &descver);
+        if (EFI_ERROR(status) && status != EFI_BUFFER_TOO_SMALL) {
+		printf("%s: GetMemoryMap() returned 0x%lx\n", __func__,
+		    (long)status);
+		return (EINVAL);
+	}
+
+	status = BS->ExitBootServices(IH, mapkey);
+        if (EFI_ERROR(status)) {
+		printf("%s: ExitBootServices() returned 0x%lx\n", __func__,
+		    (long)status);
+		return (EINVAL);
+	}
+
+	/* TODO: Pass the required metadata to the kernel */
+	(*entry)(NULL);
+	panic("exec returned");
 }
 
 static int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402151807.s1FI7WfC038981>