From: Fu Wei <fu.wei@linaro.org>
To: grub-devel@gnu.org, Leif Lindholm <leif.lindholm@linaro.org>,
Ian Campbell <Ian.Campbell@citrix.com>
Cc: Roy Franz <roy.franz@linaro.org>, Jon Masters <jcm@redhat.com>,
linaro-uefi <linaro-uefi@lists.linaro.org>
Subject: [PATCH 2/5] arm64: Move some #define from
Date: Fri, 19 Dec 2014 02:04:15 +0800 [thread overview]
Message-ID: <5493171F.5010402@linaro.org> (raw)
grub-core/loader/arm64/linux.c to include/grub/arm64/linux.h Reason:
(1)make code more orderly (2)these #define can be used by other files which
includs include/grub/arm64/linux.h
Make some shared functions for multiboot.c
Signed-off-by: Fu Wei <fu.wei@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
---
grub-core/loader/arm64/linux.c | 59 +++++++++++++++++++++---------------------
include/grub/arm64/linux.h | 11 ++++++++
2 files changed, 41 insertions(+), 29 deletions(-)
diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
index 564a75a..987f5b9 100644
--- a/grub-core/loader/arm64/linux.c
+++ b/grub-core/loader/arm64/linux.c
@@ -33,12 +33,6 @@
GRUB_MOD_LICENSE ("GPLv3+");
-#define GRUB_EFI_PAGE_SHIFT 12
-#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT)
-#define GRUB_EFI_PE_MAGIC 0x5A4D
-
-static grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
-
static grub_dl_t my_mod;
static int loaded;
@@ -58,6 +52,7 @@ static void *
get_firmware_fdt (void)
{
grub_efi_configuration_table_t *tables;
+ grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
void *firmware_fdt = NULL;
unsigned int i;
@@ -75,8 +70,8 @@ get_firmware_fdt (void)
return firmware_fdt;
}
-static void
-get_fdt (void)
+void *
+grub_linux_get_fdt (void)
{
void *raw_fdt;
grub_size_t size;
@@ -99,7 +94,7 @@ get_fdt (void)
grub_dprintf ("linux", "allocating %ld bytes for fdt\n", size);
fdt = grub_efi_allocate_pages (0, BYTES_TO_PAGES (size));
if (!fdt)
- return;
+ return NULL;
if (raw_fdt)
{
@@ -110,10 +105,11 @@ get_fdt (void)
{
grub_fdt_create_empty_tree (fdt, size);
}
+ return fdt;
}
-static grub_err_t
-check_kernel (struct grub_arm64_linux_kernel_header *lh)
+grub_err_t
+grub_arm64_uefi_check_image (struct grub_arm64_linux_kernel_header * lh)
{
if (lh->magic != GRUB_ARM64_LINUX_MAGIC)
return grub_error(GRUB_ERR_BAD_OS, "invalid magic number");
@@ -131,14 +127,14 @@ check_kernel (struct grub_arm64_linux_kernel_header *lh)
}
static grub_err_t
-finalize_params (void)
+finalize_params_linux (void)
{
grub_efi_boot_services_t *b;
+ grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
grub_efi_status_t status;
int node, retval;
- get_fdt ();
- if (!fdt)
+ if (!grub_linux_get_fdt ())
goto failure;
node = grub_fdt_find_subnode (fdt, 0, "chosen");
@@ -240,21 +236,16 @@ out:
return grub_errno;
}
-static grub_err_t
-grub_linux_boot (void)
+grub_err_t
+grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args)
{
grub_efi_memory_mapped_device_path_t *mempath;
grub_efi_handle_t image_handle;
grub_efi_boot_services_t *b;
grub_efi_status_t status;
- grub_err_t retval;
grub_efi_loaded_image_t *loaded_image;
int len;
- retval = finalize_params();
- if (retval != GRUB_ERR_NONE)
- return retval;
-
mempath = grub_malloc (2 * sizeof (grub_efi_memory_mapped_device_path_t));
if (!mempath)
return grub_errno;
@@ -263,8 +254,8 @@ grub_linux_boot (void)
mempath[0].header.subtype = GRUB_EFI_MEMORY_MAPPED_DEVICE_PATH_SUBTYPE;
mempath[0].header.length = grub_cpu_to_le16_compile_time (sizeof (*mempath));
mempath[0].memory_type = GRUB_EFI_LOADER_DATA;
- mempath[0].start_address = (grub_addr_t) kernel_addr;
- mempath[0].end_address = (grub_addr_t) kernel_addr + kernel_size;
+ mempath[0].start_address = addr;
+ mempath[0].end_address = addr + size;
mempath[1].header.type = GRUB_EFI_END_DEVICE_PATH_TYPE;
mempath[1].header.subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
@@ -273,16 +264,16 @@ grub_linux_boot (void)
b = grub_efi_system_table->boot_services;
status = b->load_image (0, grub_efi_image_handle,
(grub_efi_device_path_t *) mempath,
- kernel_addr, kernel_size, &image_handle);
+ (void *) addr, size, &image_handle);
if (status != GRUB_EFI_SUCCESS)
return grub_error (GRUB_ERR_BAD_OS, "cannot load image");
- grub_dprintf ("linux", "linux command line: '%s'\n", linux_args);
+ grub_dprintf ("linux", "linux command line: '%s'\n", args);
/* Convert command line to UCS-2 */
loaded_image = grub_efi_get_loaded_image (image_handle);
loaded_image->load_options_size = len =
- (grub_strlen (linux_args) + 1) * sizeof (grub_efi_char16_t);
+ (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t);
loaded_image->load_options =
grub_efi_allocate_pages (0,
BYTES_TO_PAGES (loaded_image->load_options_size));
@@ -291,9 +282,9 @@ grub_linux_boot (void)
loaded_image->load_options_size =
2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
- (grub_uint8_t *) linux_args, len, NULL);
+ (grub_uint8_t *) args, len, NULL);
- grub_dprintf("linux", "starting image %p\n", image_handle);
+ grub_dprintf ("linux", "starting image %p\n", image_handle);
status = b->start_image (image_handle, 0, NULL);
/* When successful, not reached */
@@ -305,6 +296,16 @@ grub_linux_boot (void)
}
static grub_err_t
+grub_linux_boot (void)
+{
+ if (finalize_params_linux () != GRUB_ERR_NONE)
+ return grub_errno;
+
+ return (grub_arm64_uefi_boot_image((grub_addr_t)kernel_addr,
+ kernel_size, linux_args));
+}
+
+static grub_err_t
grub_linux_unload (void)
{
grub_dl_unref (my_mod);
@@ -400,7 +401,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh))
return grub_errno;
- if (check_kernel (&lh) != GRUB_ERR_NONE)
+ if (grub_arm64_uefi_check_image (&lh) != GRUB_ERR_NONE)
goto fail;
grub_loader_unset();
diff --git a/include/grub/arm64/linux.h b/include/grub/arm64/linux.h
index 864e5dc..65796d9 100644
--- a/include/grub/arm64/linux.h
+++ b/include/grub/arm64/linux.h
@@ -23,6 +23,10 @@
#define GRUB_ARM64_LINUX_MAGIC 0x644d5241 /* 'ARM\x64' */
+#define GRUB_EFI_PAGE_SHIFT 12
+#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT)
+#define GRUB_EFI_PE_MAGIC 0x5A4D
+
/* From linux/Documentation/arm64/booting.txt */
struct grub_arm64_linux_kernel_header
{
@@ -38,4 +42,11 @@ struct grub_arm64_linux_kernel_header
grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
};
+/* Declare the functions for getting dtb and checking/booting image */
+void *grub_linux_get_fdt (void);
+grub_err_t grub_arm64_uefi_check_image (struct grub_arm64_linux_kernel_header
+ *lh);
+grub_err_t grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size,
+ char *args);
+
#endif /* ! GRUB_LINUX_CPU_HEADER */
--
1.8.3.1
next reply other threads:[~2014-12-18 18:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-18 18:04 Fu Wei [this message]
2015-05-07 13:09 ` [PATCH 2/5] arm64: Move some #define from Vladimir 'φ-coder/phcoder' Serbinenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5493171F.5010402@linaro.org \
--to=fu.wei@linaro.org \
--cc=Ian.Campbell@citrix.com \
--cc=grub-devel@gnu.org \
--cc=jcm@redhat.com \
--cc=leif.lindholm@linaro.org \
--cc=linaro-uefi@lists.linaro.org \
--cc=roy.franz@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.