All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: fu.wei@linaro.org, grub-devel@gnu.org, arvidjaar@gmail.com
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	stefano.stabellini@eu.citrix.com, jcm@redhat.com,
	leif.lindholm@linaro.org, ryan.harkin@linaro.org,
	linaro-uefi@lists.linaro.org
Subject: Re: [PATCH v2 1/3] arm64: Add Xen boot support file
Date: Wed, 15 Jul 2015 18:18:45 +0200	[thread overview]
Message-ID: <55A687E5.4070106@gmail.com> (raw)
In-Reply-To: <1436777640-31871-2-git-send-email-fu.wei@linaro.org>


[-- Attachment #1.1: Type: text/plain, Size: 27720 bytes --]

On 13.07.2015 10:53, fu.wei@linaro.org wrote:
> From: Fu Wei <fu.wei@linaro.org>
> 
> This patch adds Xen boot support file:
> grub-core/loader/arm64/xen_boot.c
> include/grub/arm64/xen_boot.h
> 
> This patch also adds commands register code and hearder file into
> grub-core/loader/arm64/linux.c
> 
>   - This adds support for the Xen boot on ARM specification for arm64.
>   - The implementation for Xen is following  <Multiboot on ARM Specification>:
>       http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions/Multiboot
Please don't refer to this protocol as multiboot anywhere in grub or
around because it's NOT multiboot and we don't want to confuse those 2
protocols.
>     and xen/docs/misc/arm/device-tree/booting.txt in Xen source code.
>   - The multiboot/module commands have existed,
>     so we use xen_hypervisor/xen_module instead.
>   - This Xen boot support is built into linux module for aarch64.
>   - Adding this functionality to the existing "linux" module is for
>     reusing the existing code of devicetree.
> 
Please create separate module. Modules are dynamically linked.
> Signed-off-by: Fu Wei <fu.wei@linaro.org>
> ---
>  grub-core/Makefile.core.def       |   1 +
>  grub-core/loader/arm64/linux.c    |   6 +
>  grub-core/loader/arm64/xen_boot.c | 615 ++++++++++++++++++++++++++++++++++++++
>  include/grub/arm64/xen_boot.h     | 115 +++++++
>  4 files changed, 737 insertions(+)
>  create mode 100644 grub-core/loader/arm64/xen_boot.c
>  create mode 100644 include/grub/arm64/xen_boot.h
> 
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index a6101de..01f8261 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -1659,6 +1659,7 @@ module = {
>    ia64_efi = loader/ia64/efi/linux.c;
>    arm = loader/arm/linux.c;
>    arm64 = loader/arm64/linux.c;
> +  arm64 = loader/arm64/xen_boot.c;
>    fdt = lib/fdt.c;
>    common = loader/linux.c;
>    common = lib/cmdline.c;
> diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
> index 987f5b9..7ae9bde 100644
> --- a/grub-core/loader/arm64/linux.c
> +++ b/grub-core/loader/arm64/linux.c
> @@ -26,6 +26,7 @@
>  #include <grub/mm.h>
>  #include <grub/types.h>
>  #include <grub/cpu/linux.h>
> +#include <grub/cpu/xen_boot.h>
>  #include <grub/efi/efi.h>
>  #include <grub/efi/pe32.h>
>  #include <grub/i18n.h>
> @@ -477,6 +478,9 @@ GRUB_MOD_INIT (linux)
>    cmd_devicetree =
>      grub_register_command ("devicetree", grub_cmd_devicetree, 0,
>  			   N_("Load DTB file."));
> +
> +  grub_arm64_linux_register_xen_boot_command (mod, &loaded);
> +
>    my_mod = mod;
>  }
>  
> @@ -485,4 +489,6 @@ GRUB_MOD_FINI (linux)
>    grub_unregister_command (cmd_linux);
>    grub_unregister_command (cmd_initrd);
>    grub_unregister_command (cmd_devicetree);
> +
> +  grub_arm64_linux_unregister_xen_boot_command ();
>  }
Not needed with separate module.
> diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c
> new file mode 100644
> index 0000000..23bd00e
> --- /dev/null
> +++ b/grub-core/loader/arm64/xen_boot.c
> @@ -0,0 +1,615 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2014  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/cache.h>
> +#include <grub/charset.h>
> +#include <grub/command.h>
> +#include <grub/err.h>
> +#include <grub/file.h>
> +#include <grub/fdt.h>
> +#include <grub/linux.h>
> +#include <grub/list.h>
> +#include <grub/loader.h>
> +#include <grub/misc.h>
> +#include <grub/mm.h>
> +#include <grub/types.h>
> +#include <grub/cpu/linux.h>
> +#include <grub/cpu/xen_boot.h>
> +#include <grub/efi/efi.h>
> +#include <grub/efi/pe32.h>
> +#include <grub/i18n.h>
> +#include <grub/lib/cmdline.h>
> +
> +static grub_dl_t linux_mod;
> +static int *loaded;
> +
> +static struct xen_boot_binary *xen_hypervisor;
> +static struct xen_boot_binary *module_head;
> +static const grub_size_t module_default_align[] = {
> +  MODULE_IMAGE_MIN_ALIGN,
> +  MODULE_INITRD_MIN_ALIGN,
> +  MODULE_OTHER_MIN_ALIGN,
> +  MODULE_CUSTOM_MIN_ALIGN
> +};
> +
> +static void *xen_boot_fdt;
> +static const compat_string_struct_t default_compat_string[] = {
> +  FDT_COMPATIBLE (MODULE_IMAGE_COMPATIBLE),
> +  FDT_COMPATIBLE (MODULE_INITRD_COMPATIBLE),
> +  FDT_COMPATIBLE (MODULE_OTHER_COMPATIBLE)
> +};
> +
> +
> +/* Parse all the options of xen_module command. For now, we support
> +   (1) --type <the compatible stream>
> +   (2) --nounzip
> +   We also set up the type of module in this function.
> +   If there are some "--type" options in the command line,
> +   we make a custom compatible stream in this function. */
> +static grub_err_t
> +set_module_type (struct xen_boot_binary *module, int argc, char *argv[],
> +		 int *file_name_index)
> +{
> +  char **compat_string_temp_array =
> +    (char **) grub_zalloc (sizeof (char *) * argc);
> +  static module_type_t default_type = MODULE_IMAGE;
> +  grub_size_t total_size = 0;
> +  int num_types = 0, i;
> +  char *temp = NULL;
> +
> +  *file_name_index = 0;
> +
> +  /* if there are some options we need to process. */
> +  while (argc > 1 && !grub_strncmp (argv[0], "--", 2))
> +    {
> +      if (!grub_strcmp (argv[0], "--type"))
> +	{
> +	  module->node_info.type = MODULE_CUSTOM;
> +	  ARG_SHIFT (argc, argv);
> +	  total_size += grub_strlen (argv[0]) + 1;
> +	  compat_string_temp_array[num_types++] = argv[0];
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 2;
This (and subsequent) parsing is unecessarily complicated. Please create
separate commands for different types
> +	}
> +      else if (!grub_strcmp (argv[0], "--nounzip"))
> +	{
> +	  grub_file_filter_disable_compression ();
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 1;
> +	}
> +      else			/* we can add more options process code here. */
> +	{
> +	  grub_dprintf ("xen_boot_loader",
> +			"Unknown option %s, skip.\n", argv[0]);
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 1;
> +	}
> +    }
> +
> +  /* To prevent some wrong command lines using "--type" option */
> +  if (!argc)
> +    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +
> +  /* For the default module type :
> +     The implementation is following <Multiboot on ARM Specification>:
> +     Each module will be given a default compatibility property
> +     based on the order in which the modules are added.
> +     The 1st module: compatible = "multiboot,kernel", "multiboot,module"
> +     The 2nd module: compatible = "multiboot,ramdisk", "multiboot,module"
> +     All subsequent modules: compatible = "multiboot,module"
> +     But this order will NOT be interfered with "--type"(MODULE_CUSTOM)
> +     For more detail, please refer to:
> +     http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions/Multiboot */
> +  if (module->node_info.type != MODULE_CUSTOM)
> +    {
> +      /* the module type is set by the load order */
> +      module->node_info.type = default_type;
Please don't make it order-dependent more than necessarry.
> +      switch (default_type)
> +	{
> +	case MODULE_IMAGE:
> +	  default_type = MODULE_INITRD;
> +	  break;
> +
> +	case MODULE_INITRD:
> +	  default_type = MODULE_OTHER;
> +	  break;
> +
> +	case MODULE_OTHER:
> +	  break;
> +
> +	default:
> +	  default_type = MODULE_IMAGE;	/* error, reset the type */
> +	  return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
> +	}
> +    }
> +  else
> +    {
> +      /* the module type is set by "--type"(MODULE_CUSTOM) */
> +      module->node_info.compat_string = temp =
> +	(char *) grub_zalloc (total_size);
> +      module->node_info.compat_string_size = total_size;
> +      for (i = 0; num_types > 0; num_types--, i++, temp++)
> +	{
> +	  grub_strcpy (temp, compat_string_temp_array[i]);
> +	  temp += grub_strlen (compat_string_temp_array[i]);
> +	}
> +    }
> +
> +  grub_free (compat_string_temp_array);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +prepare_xen_hypervisor_params (void)
> +{
> +  int chosen_node = 0;
> +  int retval;
> +
> +  xen_boot_fdt = grub_linux_get_fdt ();
> +  if (!xen_boot_fdt)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get FDT");
> +
> +  chosen_node = grub_fdt_find_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 0)
> +    chosen_node = grub_fdt_add_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 1)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get chosen node in FDT");
> +
BAD_OS means that OS images are invalid. ERR_IO is a generic error for
such cases.
> +  grub_dprintf ("xen_boot_loader",
> +		"Xen Hypervisor cmdline : %s @ %p size:%d\n",
> +		xen_hypervisor->cmdline, xen_hypervisor->cmdline,
> +		xen_hypervisor->cmdline_size);
> +
No need for "boot_". xen_loader is fine and mre consistent.
> +  retval = grub_fdt_set_prop (xen_boot_fdt, chosen_node, "bootargs",
> +			      xen_hypervisor->cmdline,
> +			      xen_hypervisor->cmdline_size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to install/update FDT");
> +
ditto
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +prepare_xen_module_params (struct xen_boot_binary *module)
> +{
> +  int retval, chosen_node = 0, module_node = 0;
> +  char module_name[FDT_NODE_NAME_MAX_SIZE];
> +
> +  retval = grub_snprintf (module_name, FDT_NODE_NAME_MAX_SIZE, "module@%lx",
> +			  xen_boot_address_align (module->start,
> +						  module->align));
> +  grub_dprintf ("xen_boot_loader", "Module node name %s \n", module_name);
> +
> +  if (retval < (int) sizeof ("module@"))
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to get FDT"));
> +
> +  chosen_node = grub_fdt_find_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 0)
> +    chosen_node = grub_fdt_add_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 1)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get chosen node in FDT");
> +
> +  module_node =
> +    grub_fdt_find_subnode (xen_boot_fdt, chosen_node, module_name);
> +  if (module_node < 0)
> +    module_node =
> +      grub_fdt_add_subnode (xen_boot_fdt, chosen_node, module_name);
> +
> +  retval = grub_fdt_set_prop (xen_boot_fdt, module_node, "compatible",
> +			      module->node_info.compat_string,
> +			      (grub_uint32_t) module->node_info.
> +			      compat_string_size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to update FDT"));
> +
> +  grub_dprintf ("xen_boot_loader", "Module %s compatible = %s size = 0x%lx\n",
> +		module->name, module->node_info.compat_string,
> +		module->node_info.compat_string_size);
> +
> +  retval = grub_fdt_set_reg64 (xen_boot_fdt, module_node,
> +			       xen_boot_address_align (module->start,
> +						       module->align),
> +			       module->size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to update FDT"));
> +
> +  if (module->cmdline && module->cmdline_size > 0)
> +    {
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s cmdline : %s @ %p size:%d\n", module->name,
> +		    module->cmdline, module->cmdline, module->cmdline_size);
> +
> +      retval = grub_fdt_set_prop (xen_boot_fdt, module_node, "bootargs",
> +				  module->cmdline, module->cmdline_size + 1);
> +      if (retval)
> +	return grub_error (GRUB_ERR_BAD_OS, "failed to update FDT");
> +    }
> +  else
> +    {
> +      grub_dprintf ("xen_boot_loader", "Module %s has not bootargs!\n",
> +		    module->name);
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +install_all_params (void)
> +{
> +  grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
> +  grub_efi_boot_services_t *b;
> +  grub_efi_status_t status;
> +
> +  b = grub_efi_system_table->boot_services;
> +  status = b->install_configuration_table (&fdt_guid, xen_boot_fdt);
> +  if (status != GRUB_EFI_SUCCESS)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to install FDT");
> +
> +  grub_dprintf ("xen_boot_loader",
> +		"Installed/updated FDT configuration table @ %p\n",
> +		xen_boot_fdt);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +clean_all_params (void)
> +{
> +  if (xen_boot_fdt)
> +    {
> +      grub_efi_free_pages ((grub_efi_physical_address_t) xen_boot_fdt,
> +			   BYTES_TO_PAGES (grub_fdt_get_totalsize
> +					   (xen_boot_fdt)));
> +      xen_boot_fdt = NULL;
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +finalize_params_xen_boot (void)
> +{
> +  struct xen_boot_binary *module;
> +
> +  if (xen_hypervisor)
> +    {
> +      if (prepare_xen_hypervisor_params () != GRUB_ERR_NONE)
> +	goto fail;
> +    }
> +  else
> +    {
> +      grub_dprintf ("xen_boot_loader",
> +		    "Failed to get Xen Hypervisor info!\n");
> +      goto fail;
> +    }
> +
> +  /* Set module params info */
> +  FOR_LIST_ELEMENTS (module, module_head)
> +  {
> +    if (module->start && module->size > 0)
> +      {
> +	grub_dprintf ("xen_boot_loader", "Module %s @ 0x%lx size:0x%lx\n",
> +		      module->name,
> +		      xen_boot_address_align (module->start, module->align),
> +		      module->size);
> +	if (prepare_xen_module_params (module) != GRUB_ERR_NONE)
> +	  goto fail;
> +      }
> +    else
> +      {
> +	grub_dprintf ("xen_boot_loader", "Module info error: %s!\n",
> +		      module->name);
> +	goto fail;
> +      }
> +  }
> +
> +  if (install_all_params () == GRUB_ERR_NONE)
> +    return GRUB_ERR_NONE;
> +
> +fail:
> +  clean_all_params ();
> +
> +  return grub_error (GRUB_ERR_BAD_OS, "failed to install/update FDT");
> +}
> +
> +
> +static grub_err_t
> +xen_boot (void)
> +{
> +  if (finalize_params_xen_boot () != GRUB_ERR_NONE)
> +    return grub_errno;
> +
Better use err = finalize_params_xen_boot (); if (err) return err;
> +  return grub_arm64_uefi_boot_image (xen_hypervisor->start,
> +				     xen_hypervisor->size,
> +				     xen_hypervisor->cmdline);
> +}
> +
> +static void
> +single_binary_unload (struct xen_boot_binary *binary)
> +{
Just put if (!binary) return; It will save a lot of if's.
> +  if (binary && binary->start && binary->size > 0)
> +    {
> +      grub_efi_free_pages ((grub_efi_physical_address_t) binary->start,
> +			   BYTES_TO_PAGES (binary->size + binary->align));
> +    }
> +
> +  if (binary && binary->cmdline && binary->cmdline_size > 0)
> +    {
> +      grub_free (binary->cmdline);
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s cmdline memory free @ %p size: %d\n",
> +		    binary->name, binary->cmdline, binary->cmdline_size);
> +    }
> +
> +  if (binary)
> +    {
> +      if (binary->node_info.type == MODULE_CUSTOM)
> +	grub_free ((void *) binary->node_info.compat_string);
> +      if (grub_strcmp (binary->name, XEN_HYPERVISOR_NAME))
> +	grub_list_remove (GRUB_AS_LIST (binary));
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s struct memory free @ %p size: 0x%lx\n",
> +		    binary->name, binary, sizeof (binary));
> +      grub_free (binary);
> +    }
> +
> +  return;
> +}
> +
> +static void
> +all_binaries_unload (void)
> +{
> +  struct xen_boot_binary *binary;
> +
> +  FOR_LIST_ELEMENTS (binary, module_head)
> +  {
> +    single_binary_unload (binary);
> +  }
> +
> +  if (xen_hypervisor)
> +    single_binary_unload (xen_hypervisor);
> +
> +  return;
> +}
> +
> +static grub_err_t
> +xen_unload (void)
> +{
> +  *loaded = 0;
> +  all_binaries_unload ();
> +  clean_all_params ();
> +  grub_dl_unref (linux_mod);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file,
> +		      int argc, char *argv[])
> +{
> +  binary->size = grub_file_size (file);
> +  grub_dprintf ("xen_boot_loader", "Xen_boot %s file size: 0x%lx\n",
> +		binary->name, binary->size);
> +
> +  binary->start = (grub_addr_t) grub_efi_allocate_pages (0,
> +							 (BYTES_TO_PAGES
> +							  (binary->size +
> +							   binary->align)));
> +  if (!binary->start)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
> +  grub_dprintf ("xen_boot_loader", "Xen_boot %s numpages: 0x%lx\n",
> +		binary->name, BYTES_TO_PAGES (binary->size + binary->align));
> +
> +  if (grub_file_read (file, (void *) xen_boot_address_align (binary->start,
> +							     binary->align),
> +		      binary->size) < (grub_ssize_t) binary->size)
> +    {
We use != throughout. It's safer.
> +      single_binary_unload (binary);
> +      return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
> +			 argv[0]);
> +    }
> +
> +  /* Skip the xen_boot binary file name */
> +  ARG_SHIFT (argc, argv);
> +
There shouldn't be any need for shifting. Just use argc - 1 and argv + 1
> +  if (argc > 0)
> +    {
> +      binary->cmdline_size = grub_loader_cmdline_size (argc, argv);
> +      binary->cmdline = grub_zalloc (binary->cmdline_size);
> +      if (!binary->cmdline)
> +	{
> +	  single_binary_unload (binary);
> +	  return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +	}
> +      grub_create_loader_cmdline (argc, argv, binary->cmdline,
> +				  binary->cmdline_size);
> +      grub_dprintf ("xen_boot_loader",
> +		    "Xen_boot %s cmdline @ %p %s, size: %d\n", binary->name,
> +		    binary->cmdline, binary->cmdline, binary->cmdline_size);
> +    }
> +  else
> +    {
> +      binary->cmdline_size = 0;
> +      binary->cmdline = NULL;
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_cmd_xen_module (grub_command_t cmd __attribute__ ((unused)),
> +		     int argc, char *argv[])
> +{
> +
> +  struct xen_boot_binary *module = NULL;
> +  int file_name_index = 0;
> +  grub_file_t file = 0;
> +
> +  if (!argc)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +      goto fail;
> +    }
> +
> +  if (!*loaded)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT,
> +		  N_("you need to load the Xen Hypervisor first"));
> +      goto fail;
> +    }
> +
> +  module =
> +    (struct xen_boot_binary *) grub_zalloc (sizeof (struct xen_boot_binary));
> +  if (!module)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
Just return grub_errno; zalloc already calls grub_error
> +  /* process all the options and get module type */
> +  if (set_module_type (module, argc, argv, &file_name_index) != GRUB_ERR_NONE)
> +    goto fail;
> +  switch (module->node_info.type)
> +    {
> +    case MODULE_IMAGE:
> +    case MODULE_INITRD:
> +    case MODULE_OTHER:
> +      module->node_info.compat_string =
> +	default_compat_string[module->node_info.type].compat_string;
> +      module->node_info.compat_string_size =
> +	default_compat_string[module->node_info.type].size;
> +      break;
> +
> +    case MODULE_CUSTOM:
> +      /* we have set the node_info in set_module_type */
> +      break;
> +
> +    default:
> +      return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
> +    }
> +  module->name = module->node_info.compat_string;
> +  module->align = module_default_align[module->node_info.type];
> +
> +  grub_dprintf ("xen_boot_loader", "Init %s module and node info:\n"
> +		"compatible %s\ncompat_string_size 0x%lx\n",
> +		module->name, module->node_info.compat_string,
> +		module->node_info.compat_string_size);
> +
> +  file = grub_file_open (argv[file_name_index]);
> +  if (!file)
> +    goto fail;
> +
> +  grub_errno = xen_boot_binary_load (module, file, argc - file_name_index,
> +				     argv + file_name_index);
> +
When you call grub_error. grub_errno is already set
> +  if (grub_errno == GRUB_ERR_NONE)
> +    grub_list_push (GRUB_AS_LIST_P (&module_head), GRUB_AS_LIST (module));
> +
> +fail:
> +  if (file)
> +    grub_file_close (file);
> +  if (grub_errno != GRUB_ERR_NONE)
> +    single_binary_unload (module);
> +
> +  return grub_errno;
> +}
> +
> +static grub_err_t
> +grub_cmd_xen_hypervisor (grub_command_t cmd __attribute__ ((unused)),
> +			 int argc, char *argv[])
> +{
> +  struct xen_hypervisor_header sh;
> +  grub_file_t file = NULL;
> +
> +  grub_dl_ref (linux_mod);
> +
> +  if (!argc)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +      goto fail;
> +    }
> +
> +  /* For now, we don't support any option in xen_hypervisor command.
> +     If there are some options, we skip them. */
> +  while (argc > 1 && !grub_strncmp (argv[0], "--", 2))
> +    {
> +      grub_dprintf ("xen_boot_loader", "Unknown option %s, skip.\n", argv[0]);
> +      ARG_SHIFT (argc, argv);
> +    }
> +
Why do you need this? Just delete it.
> +  file = grub_file_open (argv[0]);
> +  if (!file)
> +    goto fail;
> +
> +  if (grub_file_read (file, &sh, sizeof (sh)) < (long) sizeof (sh))
> +    goto fail;
> +  if (grub_arm64_uefi_check_image
> +      ((struct grub_arm64_linux_kernel_header *) &sh) != GRUB_ERR_NONE)
> +    goto fail;
> +  grub_file_seek (file, 0);
> +
> +  grub_loader_unset ();
> +
This is implicit in loader_set. Please add a comment why it needs to be
explicit. I suppose it's to avoid unloading oneself.
> +  xen_hypervisor =
> +    (struct xen_boot_binary *) grub_zalloc (sizeof (struct xen_boot_binary));
> +  if (!xen_hypervisor)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
Ditto
> +  xen_hypervisor->name = XEN_HYPERVISOR_NAME;
> +  xen_hypervisor->align = (grub_size_t) sh.optional_header.section_alignment;
> +
> +  grub_errno = xen_boot_binary_load (xen_hypervisor, file, argc, argv);
> +  if (grub_errno == GRUB_ERR_NONE)
> +    {
> +      grub_loader_set (xen_boot, xen_unload, 0);
> +      *loaded = 1;
> +    }
> +
> +fail:
> +  if (file)
> +    grub_file_close (file);
> +  if (grub_errno != GRUB_ERR_NONE)
> +    {
> +      *loaded = 0;
> +      all_binaries_unload ();
> +      grub_dl_unref (linux_mod);
> +    }
> +
> +  return grub_errno;
> +}
> +
> +static grub_command_t cmd_xen_hypervisor, cmd_xen_module;
> +
> +void
> +grub_arm64_linux_register_xen_boot_command (grub_dl_t mod, int *linux_loaded)
> +{
> +  cmd_xen_hypervisor =
> +    grub_register_command ("xen_hypervisor", grub_cmd_xen_hypervisor, 0,
> +			   N_("Load a xen hypervisor."));
> +  cmd_xen_module =
> +    grub_register_command ("xen_module", grub_cmd_xen_module, 0,
> +			   N_("Load a xen module."));
> +  linux_mod = mod;
> +  loaded = linux_loaded;
> +}
> +
> +void
> +grub_arm64_linux_unregister_xen_boot_command (void)
> +{
> +  grub_unregister_command (cmd_xen_hypervisor);
> +  grub_unregister_command (cmd_xen_module);
> +}
> diff --git a/include/grub/arm64/xen_boot.h b/include/grub/arm64/xen_boot.h
> new file mode 100644
> index 0000000..8e8f6cb
> --- /dev/null
> +++ b/include/grub/arm64/xen_boot.h
> @@ -0,0 +1,115 @@
> +/*
> + *  xen_boot.h - Xen boot header file for Xen boot via FDT
> + *  on AArch64 architecture.
> + *  Copyright (C) 2014  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef XEN_BOOT_HEADER
> +#define XEN_BOOT_HEADER 1
> +
> +#include <grub/list.h>
> +#include <grub/types.h>
> +#include <grub/efi/pe32.h>	/* required by struct xen_hypervisor_header */
> +
This file doesn't really look like having anything reusable. Please put
it directly into .c
> +#define XEN_HYPERVISOR_NAME  "xen_hypervisor"
> +
> +#define MODULE_DEFAULT_ALIGN  (0x0)
> +#define MODULE_IMAGE_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_INITRD_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_OTHER_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_CUSTOM_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +
> +#define MODULE_IMAGE_COMPATIBLE  "multiboot,kernel\0multiboot,module"
> +#define MODULE_INITRD_COMPATIBLE  "multiboot,ramdisk\0multiboot,module"
> +#define MODULE_OTHER_COMPATIBLE  "multiboot,module"
> +
> +/* This maximum size is defined in Power.org ePAPR V1.1
> + * https://www.power.org/documentation/epapr-version-1-1/
> + * 2.2.1.1 Node Name Requirements
> + * node-name@unit-address
> + * 31 + 1(@) + 16(64bit address in hex format) + 1(\0) = 49
> + */
> +#define FDT_NODE_NAME_MAX_SIZE  (49)
> +
> +#define ARG_SHIFT(argc, argv) \
> +  do { \
> +    (argc)--; \
> +    (argv)++; \
> +  } while (0)
> +
> +struct compat_string_struct
> +{
> +  grub_size_t size;
> +  const char *compat_string;
> +};
> +typedef struct compat_string_struct compat_string_struct_t;
> +#define FDT_COMPATIBLE(x) {.size = sizeof(x), .compat_string = (x)}
> +
> +enum module_type
> +{
> +  MODULE_IMAGE,
> +  MODULE_INITRD,
> +  MODULE_OTHER,
> +  MODULE_CUSTOM
> +};
> +typedef enum module_type module_type_t;
> +
> +struct fdt_node_info
> +{
> +  module_type_t type;
> +
> +  const char *compat_string;
> +  grub_size_t compat_string_size;
> +};
> +
> +struct xen_hypervisor_header
> +{
> +  struct grub_arm64_linux_kernel_header efi_head;
> +
> +  /* This is always PE\0\0.  */
> +  grub_uint8_t signature[GRUB_PE32_SIGNATURE_SIZE];
> +  /* The COFF file header.  */
> +  struct grub_pe32_coff_header coff_header;
> +  /* The Optional header.  */
> +  struct grub_pe64_optional_header optional_header;
> +};
> +
> +struct xen_boot_binary
> +{
> +  struct xen_boot_binary *next;
> +  struct xen_boot_binary **prev;
> +  const char *name;
> +
> +  grub_addr_t start;
> +  grub_size_t size;
> +  grub_size_t align;
> +
> +  char *cmdline;
> +  int cmdline_size;
> +
> +  struct fdt_node_info node_info;
> +};
> +
> +void grub_arm64_linux_register_xen_boot_command (grub_dl_t mod, int *loaded);
> +void grub_arm64_linux_unregister_xen_boot_command (void);
> +
> +static __inline grub_addr_t
> +xen_boot_address_align (grub_addr_t start, grub_size_t align)
> +{
> +  return (align ? (ALIGN_UP (start, align)) : start);
> +}
> +
> +#endif /* ! XEN_BOOT_HEADER */
> 



[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 213 bytes --]

[-- Attachment #2: Type: text/plain, Size: 141 bytes --]

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

WARNING: multiple messages have this Message-ID (diff)
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: fu.wei@linaro.org, grub-devel@gnu.org, arvidjaar@gmail.com
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	stefano.stabellini@eu.citrix.com, jcm@redhat.com,
	leif.lindholm@linaro.org, ryan.harkin@linaro.org,
	linaro-uefi@lists.linaro.org
Subject: Re: [PATCH v2 1/3] arm64: Add Xen boot support file
Date: Wed, 15 Jul 2015 18:18:45 +0200	[thread overview]
Message-ID: <55A687E5.4070106@gmail.com> (raw)
In-Reply-To: <1436777640-31871-2-git-send-email-fu.wei@linaro.org>

[-- Attachment #1: Type: text/plain, Size: 27720 bytes --]

On 13.07.2015 10:53, fu.wei@linaro.org wrote:
> From: Fu Wei <fu.wei@linaro.org>
> 
> This patch adds Xen boot support file:
> grub-core/loader/arm64/xen_boot.c
> include/grub/arm64/xen_boot.h
> 
> This patch also adds commands register code and hearder file into
> grub-core/loader/arm64/linux.c
> 
>   - This adds support for the Xen boot on ARM specification for arm64.
>   - The implementation for Xen is following  <Multiboot on ARM Specification>:
>       http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions/Multiboot
Please don't refer to this protocol as multiboot anywhere in grub or
around because it's NOT multiboot and we don't want to confuse those 2
protocols.
>     and xen/docs/misc/arm/device-tree/booting.txt in Xen source code.
>   - The multiboot/module commands have existed,
>     so we use xen_hypervisor/xen_module instead.
>   - This Xen boot support is built into linux module for aarch64.
>   - Adding this functionality to the existing "linux" module is for
>     reusing the existing code of devicetree.
> 
Please create separate module. Modules are dynamically linked.
> Signed-off-by: Fu Wei <fu.wei@linaro.org>
> ---
>  grub-core/Makefile.core.def       |   1 +
>  grub-core/loader/arm64/linux.c    |   6 +
>  grub-core/loader/arm64/xen_boot.c | 615 ++++++++++++++++++++++++++++++++++++++
>  include/grub/arm64/xen_boot.h     | 115 +++++++
>  4 files changed, 737 insertions(+)
>  create mode 100644 grub-core/loader/arm64/xen_boot.c
>  create mode 100644 include/grub/arm64/xen_boot.h
> 
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index a6101de..01f8261 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -1659,6 +1659,7 @@ module = {
>    ia64_efi = loader/ia64/efi/linux.c;
>    arm = loader/arm/linux.c;
>    arm64 = loader/arm64/linux.c;
> +  arm64 = loader/arm64/xen_boot.c;
>    fdt = lib/fdt.c;
>    common = loader/linux.c;
>    common = lib/cmdline.c;
> diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
> index 987f5b9..7ae9bde 100644
> --- a/grub-core/loader/arm64/linux.c
> +++ b/grub-core/loader/arm64/linux.c
> @@ -26,6 +26,7 @@
>  #include <grub/mm.h>
>  #include <grub/types.h>
>  #include <grub/cpu/linux.h>
> +#include <grub/cpu/xen_boot.h>
>  #include <grub/efi/efi.h>
>  #include <grub/efi/pe32.h>
>  #include <grub/i18n.h>
> @@ -477,6 +478,9 @@ GRUB_MOD_INIT (linux)
>    cmd_devicetree =
>      grub_register_command ("devicetree", grub_cmd_devicetree, 0,
>  			   N_("Load DTB file."));
> +
> +  grub_arm64_linux_register_xen_boot_command (mod, &loaded);
> +
>    my_mod = mod;
>  }
>  
> @@ -485,4 +489,6 @@ GRUB_MOD_FINI (linux)
>    grub_unregister_command (cmd_linux);
>    grub_unregister_command (cmd_initrd);
>    grub_unregister_command (cmd_devicetree);
> +
> +  grub_arm64_linux_unregister_xen_boot_command ();
>  }
Not needed with separate module.
> diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c
> new file mode 100644
> index 0000000..23bd00e
> --- /dev/null
> +++ b/grub-core/loader/arm64/xen_boot.c
> @@ -0,0 +1,615 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2014  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/cache.h>
> +#include <grub/charset.h>
> +#include <grub/command.h>
> +#include <grub/err.h>
> +#include <grub/file.h>
> +#include <grub/fdt.h>
> +#include <grub/linux.h>
> +#include <grub/list.h>
> +#include <grub/loader.h>
> +#include <grub/misc.h>
> +#include <grub/mm.h>
> +#include <grub/types.h>
> +#include <grub/cpu/linux.h>
> +#include <grub/cpu/xen_boot.h>
> +#include <grub/efi/efi.h>
> +#include <grub/efi/pe32.h>
> +#include <grub/i18n.h>
> +#include <grub/lib/cmdline.h>
> +
> +static grub_dl_t linux_mod;
> +static int *loaded;
> +
> +static struct xen_boot_binary *xen_hypervisor;
> +static struct xen_boot_binary *module_head;
> +static const grub_size_t module_default_align[] = {
> +  MODULE_IMAGE_MIN_ALIGN,
> +  MODULE_INITRD_MIN_ALIGN,
> +  MODULE_OTHER_MIN_ALIGN,
> +  MODULE_CUSTOM_MIN_ALIGN
> +};
> +
> +static void *xen_boot_fdt;
> +static const compat_string_struct_t default_compat_string[] = {
> +  FDT_COMPATIBLE (MODULE_IMAGE_COMPATIBLE),
> +  FDT_COMPATIBLE (MODULE_INITRD_COMPATIBLE),
> +  FDT_COMPATIBLE (MODULE_OTHER_COMPATIBLE)
> +};
> +
> +
> +/* Parse all the options of xen_module command. For now, we support
> +   (1) --type <the compatible stream>
> +   (2) --nounzip
> +   We also set up the type of module in this function.
> +   If there are some "--type" options in the command line,
> +   we make a custom compatible stream in this function. */
> +static grub_err_t
> +set_module_type (struct xen_boot_binary *module, int argc, char *argv[],
> +		 int *file_name_index)
> +{
> +  char **compat_string_temp_array =
> +    (char **) grub_zalloc (sizeof (char *) * argc);
> +  static module_type_t default_type = MODULE_IMAGE;
> +  grub_size_t total_size = 0;
> +  int num_types = 0, i;
> +  char *temp = NULL;
> +
> +  *file_name_index = 0;
> +
> +  /* if there are some options we need to process. */
> +  while (argc > 1 && !grub_strncmp (argv[0], "--", 2))
> +    {
> +      if (!grub_strcmp (argv[0], "--type"))
> +	{
> +	  module->node_info.type = MODULE_CUSTOM;
> +	  ARG_SHIFT (argc, argv);
> +	  total_size += grub_strlen (argv[0]) + 1;
> +	  compat_string_temp_array[num_types++] = argv[0];
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 2;
This (and subsequent) parsing is unecessarily complicated. Please create
separate commands for different types
> +	}
> +      else if (!grub_strcmp (argv[0], "--nounzip"))
> +	{
> +	  grub_file_filter_disable_compression ();
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 1;
> +	}
> +      else			/* we can add more options process code here. */
> +	{
> +	  grub_dprintf ("xen_boot_loader",
> +			"Unknown option %s, skip.\n", argv[0]);
> +	  ARG_SHIFT (argc, argv);
> +	  (*file_name_index) += 1;
> +	}
> +    }
> +
> +  /* To prevent some wrong command lines using "--type" option */
> +  if (!argc)
> +    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +
> +  /* For the default module type :
> +     The implementation is following <Multiboot on ARM Specification>:
> +     Each module will be given a default compatibility property
> +     based on the order in which the modules are added.
> +     The 1st module: compatible = "multiboot,kernel", "multiboot,module"
> +     The 2nd module: compatible = "multiboot,ramdisk", "multiboot,module"
> +     All subsequent modules: compatible = "multiboot,module"
> +     But this order will NOT be interfered with "--type"(MODULE_CUSTOM)
> +     For more detail, please refer to:
> +     http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions/Multiboot */
> +  if (module->node_info.type != MODULE_CUSTOM)
> +    {
> +      /* the module type is set by the load order */
> +      module->node_info.type = default_type;
Please don't make it order-dependent more than necessarry.
> +      switch (default_type)
> +	{
> +	case MODULE_IMAGE:
> +	  default_type = MODULE_INITRD;
> +	  break;
> +
> +	case MODULE_INITRD:
> +	  default_type = MODULE_OTHER;
> +	  break;
> +
> +	case MODULE_OTHER:
> +	  break;
> +
> +	default:
> +	  default_type = MODULE_IMAGE;	/* error, reset the type */
> +	  return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
> +	}
> +    }
> +  else
> +    {
> +      /* the module type is set by "--type"(MODULE_CUSTOM) */
> +      module->node_info.compat_string = temp =
> +	(char *) grub_zalloc (total_size);
> +      module->node_info.compat_string_size = total_size;
> +      for (i = 0; num_types > 0; num_types--, i++, temp++)
> +	{
> +	  grub_strcpy (temp, compat_string_temp_array[i]);
> +	  temp += grub_strlen (compat_string_temp_array[i]);
> +	}
> +    }
> +
> +  grub_free (compat_string_temp_array);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +prepare_xen_hypervisor_params (void)
> +{
> +  int chosen_node = 0;
> +  int retval;
> +
> +  xen_boot_fdt = grub_linux_get_fdt ();
> +  if (!xen_boot_fdt)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get FDT");
> +
> +  chosen_node = grub_fdt_find_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 0)
> +    chosen_node = grub_fdt_add_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 1)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get chosen node in FDT");
> +
BAD_OS means that OS images are invalid. ERR_IO is a generic error for
such cases.
> +  grub_dprintf ("xen_boot_loader",
> +		"Xen Hypervisor cmdline : %s @ %p size:%d\n",
> +		xen_hypervisor->cmdline, xen_hypervisor->cmdline,
> +		xen_hypervisor->cmdline_size);
> +
No need for "boot_". xen_loader is fine and mre consistent.
> +  retval = grub_fdt_set_prop (xen_boot_fdt, chosen_node, "bootargs",
> +			      xen_hypervisor->cmdline,
> +			      xen_hypervisor->cmdline_size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to install/update FDT");
> +
ditto
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +prepare_xen_module_params (struct xen_boot_binary *module)
> +{
> +  int retval, chosen_node = 0, module_node = 0;
> +  char module_name[FDT_NODE_NAME_MAX_SIZE];
> +
> +  retval = grub_snprintf (module_name, FDT_NODE_NAME_MAX_SIZE, "module@%lx",
> +			  xen_boot_address_align (module->start,
> +						  module->align));
> +  grub_dprintf ("xen_boot_loader", "Module node name %s \n", module_name);
> +
> +  if (retval < (int) sizeof ("module@"))
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to get FDT"));
> +
> +  chosen_node = grub_fdt_find_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 0)
> +    chosen_node = grub_fdt_add_subnode (xen_boot_fdt, 0, "chosen");
> +  if (chosen_node < 1)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to get chosen node in FDT");
> +
> +  module_node =
> +    grub_fdt_find_subnode (xen_boot_fdt, chosen_node, module_name);
> +  if (module_node < 0)
> +    module_node =
> +      grub_fdt_add_subnode (xen_boot_fdt, chosen_node, module_name);
> +
> +  retval = grub_fdt_set_prop (xen_boot_fdt, module_node, "compatible",
> +			      module->node_info.compat_string,
> +			      (grub_uint32_t) module->node_info.
> +			      compat_string_size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to update FDT"));
> +
> +  grub_dprintf ("xen_boot_loader", "Module %s compatible = %s size = 0x%lx\n",
> +		module->name, module->node_info.compat_string,
> +		module->node_info.compat_string_size);
> +
> +  retval = grub_fdt_set_reg64 (xen_boot_fdt, module_node,
> +			       xen_boot_address_align (module->start,
> +						       module->align),
> +			       module->size);
> +  if (retval)
> +    return grub_error (GRUB_ERR_BAD_OS, N_("failed to update FDT"));
> +
> +  if (module->cmdline && module->cmdline_size > 0)
> +    {
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s cmdline : %s @ %p size:%d\n", module->name,
> +		    module->cmdline, module->cmdline, module->cmdline_size);
> +
> +      retval = grub_fdt_set_prop (xen_boot_fdt, module_node, "bootargs",
> +				  module->cmdline, module->cmdline_size + 1);
> +      if (retval)
> +	return grub_error (GRUB_ERR_BAD_OS, "failed to update FDT");
> +    }
> +  else
> +    {
> +      grub_dprintf ("xen_boot_loader", "Module %s has not bootargs!\n",
> +		    module->name);
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +install_all_params (void)
> +{
> +  grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
> +  grub_efi_boot_services_t *b;
> +  grub_efi_status_t status;
> +
> +  b = grub_efi_system_table->boot_services;
> +  status = b->install_configuration_table (&fdt_guid, xen_boot_fdt);
> +  if (status != GRUB_EFI_SUCCESS)
> +    return grub_error (GRUB_ERR_BAD_OS, "failed to install FDT");
> +
> +  grub_dprintf ("xen_boot_loader",
> +		"Installed/updated FDT configuration table @ %p\n",
> +		xen_boot_fdt);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +clean_all_params (void)
> +{
> +  if (xen_boot_fdt)
> +    {
> +      grub_efi_free_pages ((grub_efi_physical_address_t) xen_boot_fdt,
> +			   BYTES_TO_PAGES (grub_fdt_get_totalsize
> +					   (xen_boot_fdt)));
> +      xen_boot_fdt = NULL;
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +finalize_params_xen_boot (void)
> +{
> +  struct xen_boot_binary *module;
> +
> +  if (xen_hypervisor)
> +    {
> +      if (prepare_xen_hypervisor_params () != GRUB_ERR_NONE)
> +	goto fail;
> +    }
> +  else
> +    {
> +      grub_dprintf ("xen_boot_loader",
> +		    "Failed to get Xen Hypervisor info!\n");
> +      goto fail;
> +    }
> +
> +  /* Set module params info */
> +  FOR_LIST_ELEMENTS (module, module_head)
> +  {
> +    if (module->start && module->size > 0)
> +      {
> +	grub_dprintf ("xen_boot_loader", "Module %s @ 0x%lx size:0x%lx\n",
> +		      module->name,
> +		      xen_boot_address_align (module->start, module->align),
> +		      module->size);
> +	if (prepare_xen_module_params (module) != GRUB_ERR_NONE)
> +	  goto fail;
> +      }
> +    else
> +      {
> +	grub_dprintf ("xen_boot_loader", "Module info error: %s!\n",
> +		      module->name);
> +	goto fail;
> +      }
> +  }
> +
> +  if (install_all_params () == GRUB_ERR_NONE)
> +    return GRUB_ERR_NONE;
> +
> +fail:
> +  clean_all_params ();
> +
> +  return grub_error (GRUB_ERR_BAD_OS, "failed to install/update FDT");
> +}
> +
> +
> +static grub_err_t
> +xen_boot (void)
> +{
> +  if (finalize_params_xen_boot () != GRUB_ERR_NONE)
> +    return grub_errno;
> +
Better use err = finalize_params_xen_boot (); if (err) return err;
> +  return grub_arm64_uefi_boot_image (xen_hypervisor->start,
> +				     xen_hypervisor->size,
> +				     xen_hypervisor->cmdline);
> +}
> +
> +static void
> +single_binary_unload (struct xen_boot_binary *binary)
> +{
Just put if (!binary) return; It will save a lot of if's.
> +  if (binary && binary->start && binary->size > 0)
> +    {
> +      grub_efi_free_pages ((grub_efi_physical_address_t) binary->start,
> +			   BYTES_TO_PAGES (binary->size + binary->align));
> +    }
> +
> +  if (binary && binary->cmdline && binary->cmdline_size > 0)
> +    {
> +      grub_free (binary->cmdline);
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s cmdline memory free @ %p size: %d\n",
> +		    binary->name, binary->cmdline, binary->cmdline_size);
> +    }
> +
> +  if (binary)
> +    {
> +      if (binary->node_info.type == MODULE_CUSTOM)
> +	grub_free ((void *) binary->node_info.compat_string);
> +      if (grub_strcmp (binary->name, XEN_HYPERVISOR_NAME))
> +	grub_list_remove (GRUB_AS_LIST (binary));
> +      grub_dprintf ("xen_boot_loader",
> +		    "Module %s struct memory free @ %p size: 0x%lx\n",
> +		    binary->name, binary, sizeof (binary));
> +      grub_free (binary);
> +    }
> +
> +  return;
> +}
> +
> +static void
> +all_binaries_unload (void)
> +{
> +  struct xen_boot_binary *binary;
> +
> +  FOR_LIST_ELEMENTS (binary, module_head)
> +  {
> +    single_binary_unload (binary);
> +  }
> +
> +  if (xen_hypervisor)
> +    single_binary_unload (xen_hypervisor);
> +
> +  return;
> +}
> +
> +static grub_err_t
> +xen_unload (void)
> +{
> +  *loaded = 0;
> +  all_binaries_unload ();
> +  clean_all_params ();
> +  grub_dl_unref (linux_mod);
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file,
> +		      int argc, char *argv[])
> +{
> +  binary->size = grub_file_size (file);
> +  grub_dprintf ("xen_boot_loader", "Xen_boot %s file size: 0x%lx\n",
> +		binary->name, binary->size);
> +
> +  binary->start = (grub_addr_t) grub_efi_allocate_pages (0,
> +							 (BYTES_TO_PAGES
> +							  (binary->size +
> +							   binary->align)));
> +  if (!binary->start)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
> +  grub_dprintf ("xen_boot_loader", "Xen_boot %s numpages: 0x%lx\n",
> +		binary->name, BYTES_TO_PAGES (binary->size + binary->align));
> +
> +  if (grub_file_read (file, (void *) xen_boot_address_align (binary->start,
> +							     binary->align),
> +		      binary->size) < (grub_ssize_t) binary->size)
> +    {
We use != throughout. It's safer.
> +      single_binary_unload (binary);
> +      return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
> +			 argv[0]);
> +    }
> +
> +  /* Skip the xen_boot binary file name */
> +  ARG_SHIFT (argc, argv);
> +
There shouldn't be any need for shifting. Just use argc - 1 and argv + 1
> +  if (argc > 0)
> +    {
> +      binary->cmdline_size = grub_loader_cmdline_size (argc, argv);
> +      binary->cmdline = grub_zalloc (binary->cmdline_size);
> +      if (!binary->cmdline)
> +	{
> +	  single_binary_unload (binary);
> +	  return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +	}
> +      grub_create_loader_cmdline (argc, argv, binary->cmdline,
> +				  binary->cmdline_size);
> +      grub_dprintf ("xen_boot_loader",
> +		    "Xen_boot %s cmdline @ %p %s, size: %d\n", binary->name,
> +		    binary->cmdline, binary->cmdline, binary->cmdline_size);
> +    }
> +  else
> +    {
> +      binary->cmdline_size = 0;
> +      binary->cmdline = NULL;
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_cmd_xen_module (grub_command_t cmd __attribute__ ((unused)),
> +		     int argc, char *argv[])
> +{
> +
> +  struct xen_boot_binary *module = NULL;
> +  int file_name_index = 0;
> +  grub_file_t file = 0;
> +
> +  if (!argc)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +      goto fail;
> +    }
> +
> +  if (!*loaded)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT,
> +		  N_("you need to load the Xen Hypervisor first"));
> +      goto fail;
> +    }
> +
> +  module =
> +    (struct xen_boot_binary *) grub_zalloc (sizeof (struct xen_boot_binary));
> +  if (!module)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
Just return grub_errno; zalloc already calls grub_error
> +  /* process all the options and get module type */
> +  if (set_module_type (module, argc, argv, &file_name_index) != GRUB_ERR_NONE)
> +    goto fail;
> +  switch (module->node_info.type)
> +    {
> +    case MODULE_IMAGE:
> +    case MODULE_INITRD:
> +    case MODULE_OTHER:
> +      module->node_info.compat_string =
> +	default_compat_string[module->node_info.type].compat_string;
> +      module->node_info.compat_string_size =
> +	default_compat_string[module->node_info.type].size;
> +      break;
> +
> +    case MODULE_CUSTOM:
> +      /* we have set the node_info in set_module_type */
> +      break;
> +
> +    default:
> +      return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
> +    }
> +  module->name = module->node_info.compat_string;
> +  module->align = module_default_align[module->node_info.type];
> +
> +  grub_dprintf ("xen_boot_loader", "Init %s module and node info:\n"
> +		"compatible %s\ncompat_string_size 0x%lx\n",
> +		module->name, module->node_info.compat_string,
> +		module->node_info.compat_string_size);
> +
> +  file = grub_file_open (argv[file_name_index]);
> +  if (!file)
> +    goto fail;
> +
> +  grub_errno = xen_boot_binary_load (module, file, argc - file_name_index,
> +				     argv + file_name_index);
> +
When you call grub_error. grub_errno is already set
> +  if (grub_errno == GRUB_ERR_NONE)
> +    grub_list_push (GRUB_AS_LIST_P (&module_head), GRUB_AS_LIST (module));
> +
> +fail:
> +  if (file)
> +    grub_file_close (file);
> +  if (grub_errno != GRUB_ERR_NONE)
> +    single_binary_unload (module);
> +
> +  return grub_errno;
> +}
> +
> +static grub_err_t
> +grub_cmd_xen_hypervisor (grub_command_t cmd __attribute__ ((unused)),
> +			 int argc, char *argv[])
> +{
> +  struct xen_hypervisor_header sh;
> +  grub_file_t file = NULL;
> +
> +  grub_dl_ref (linux_mod);
> +
> +  if (!argc)
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> +      goto fail;
> +    }
> +
> +  /* For now, we don't support any option in xen_hypervisor command.
> +     If there are some options, we skip them. */
> +  while (argc > 1 && !grub_strncmp (argv[0], "--", 2))
> +    {
> +      grub_dprintf ("xen_boot_loader", "Unknown option %s, skip.\n", argv[0]);
> +      ARG_SHIFT (argc, argv);
> +    }
> +
Why do you need this? Just delete it.
> +  file = grub_file_open (argv[0]);
> +  if (!file)
> +    goto fail;
> +
> +  if (grub_file_read (file, &sh, sizeof (sh)) < (long) sizeof (sh))
> +    goto fail;
> +  if (grub_arm64_uefi_check_image
> +      ((struct grub_arm64_linux_kernel_header *) &sh) != GRUB_ERR_NONE)
> +    goto fail;
> +  grub_file_seek (file, 0);
> +
> +  grub_loader_unset ();
> +
This is implicit in loader_set. Please add a comment why it needs to be
explicit. I suppose it's to avoid unloading oneself.
> +  xen_hypervisor =
> +    (struct xen_boot_binary *) grub_zalloc (sizeof (struct xen_boot_binary));
> +  if (!xen_hypervisor)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> +
Ditto
> +  xen_hypervisor->name = XEN_HYPERVISOR_NAME;
> +  xen_hypervisor->align = (grub_size_t) sh.optional_header.section_alignment;
> +
> +  grub_errno = xen_boot_binary_load (xen_hypervisor, file, argc, argv);
> +  if (grub_errno == GRUB_ERR_NONE)
> +    {
> +      grub_loader_set (xen_boot, xen_unload, 0);
> +      *loaded = 1;
> +    }
> +
> +fail:
> +  if (file)
> +    grub_file_close (file);
> +  if (grub_errno != GRUB_ERR_NONE)
> +    {
> +      *loaded = 0;
> +      all_binaries_unload ();
> +      grub_dl_unref (linux_mod);
> +    }
> +
> +  return grub_errno;
> +}
> +
> +static grub_command_t cmd_xen_hypervisor, cmd_xen_module;
> +
> +void
> +grub_arm64_linux_register_xen_boot_command (grub_dl_t mod, int *linux_loaded)
> +{
> +  cmd_xen_hypervisor =
> +    grub_register_command ("xen_hypervisor", grub_cmd_xen_hypervisor, 0,
> +			   N_("Load a xen hypervisor."));
> +  cmd_xen_module =
> +    grub_register_command ("xen_module", grub_cmd_xen_module, 0,
> +			   N_("Load a xen module."));
> +  linux_mod = mod;
> +  loaded = linux_loaded;
> +}
> +
> +void
> +grub_arm64_linux_unregister_xen_boot_command (void)
> +{
> +  grub_unregister_command (cmd_xen_hypervisor);
> +  grub_unregister_command (cmd_xen_module);
> +}
> diff --git a/include/grub/arm64/xen_boot.h b/include/grub/arm64/xen_boot.h
> new file mode 100644
> index 0000000..8e8f6cb
> --- /dev/null
> +++ b/include/grub/arm64/xen_boot.h
> @@ -0,0 +1,115 @@
> +/*
> + *  xen_boot.h - Xen boot header file for Xen boot via FDT
> + *  on AArch64 architecture.
> + *  Copyright (C) 2014  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef XEN_BOOT_HEADER
> +#define XEN_BOOT_HEADER 1
> +
> +#include <grub/list.h>
> +#include <grub/types.h>
> +#include <grub/efi/pe32.h>	/* required by struct xen_hypervisor_header */
> +
This file doesn't really look like having anything reusable. Please put
it directly into .c
> +#define XEN_HYPERVISOR_NAME  "xen_hypervisor"
> +
> +#define MODULE_DEFAULT_ALIGN  (0x0)
> +#define MODULE_IMAGE_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_INITRD_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_OTHER_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +#define MODULE_CUSTOM_MIN_ALIGN  MODULE_DEFAULT_ALIGN
> +
> +#define MODULE_IMAGE_COMPATIBLE  "multiboot,kernel\0multiboot,module"
> +#define MODULE_INITRD_COMPATIBLE  "multiboot,ramdisk\0multiboot,module"
> +#define MODULE_OTHER_COMPATIBLE  "multiboot,module"
> +
> +/* This maximum size is defined in Power.org ePAPR V1.1
> + * https://www.power.org/documentation/epapr-version-1-1/
> + * 2.2.1.1 Node Name Requirements
> + * node-name@unit-address
> + * 31 + 1(@) + 16(64bit address in hex format) + 1(\0) = 49
> + */
> +#define FDT_NODE_NAME_MAX_SIZE  (49)
> +
> +#define ARG_SHIFT(argc, argv) \
> +  do { \
> +    (argc)--; \
> +    (argv)++; \
> +  } while (0)
> +
> +struct compat_string_struct
> +{
> +  grub_size_t size;
> +  const char *compat_string;
> +};
> +typedef struct compat_string_struct compat_string_struct_t;
> +#define FDT_COMPATIBLE(x) {.size = sizeof(x), .compat_string = (x)}
> +
> +enum module_type
> +{
> +  MODULE_IMAGE,
> +  MODULE_INITRD,
> +  MODULE_OTHER,
> +  MODULE_CUSTOM
> +};
> +typedef enum module_type module_type_t;
> +
> +struct fdt_node_info
> +{
> +  module_type_t type;
> +
> +  const char *compat_string;
> +  grub_size_t compat_string_size;
> +};
> +
> +struct xen_hypervisor_header
> +{
> +  struct grub_arm64_linux_kernel_header efi_head;
> +
> +  /* This is always PE\0\0.  */
> +  grub_uint8_t signature[GRUB_PE32_SIGNATURE_SIZE];
> +  /* The COFF file header.  */
> +  struct grub_pe32_coff_header coff_header;
> +  /* The Optional header.  */
> +  struct grub_pe64_optional_header optional_header;
> +};
> +
> +struct xen_boot_binary
> +{
> +  struct xen_boot_binary *next;
> +  struct xen_boot_binary **prev;
> +  const char *name;
> +
> +  grub_addr_t start;
> +  grub_size_t size;
> +  grub_size_t align;
> +
> +  char *cmdline;
> +  int cmdline_size;
> +
> +  struct fdt_node_info node_info;
> +};
> +
> +void grub_arm64_linux_register_xen_boot_command (grub_dl_t mod, int *loaded);
> +void grub_arm64_linux_unregister_xen_boot_command (void);
> +
> +static __inline grub_addr_t
> +xen_boot_address_align (grub_addr_t start, grub_size_t align)
> +{
> +  return (align ? (ALIGN_UP (start, align)) : start);
> +}
> +
> +#endif /* ! XEN_BOOT_HEADER */
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 213 bytes --]

  reply	other threads:[~2015-07-15 16:18 UTC|newest]

Thread overview: 550+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <=fu.wei@linaro.org>
2015-05-15 11:08 ` [PATCH 0/6] Watchdog: introdouce ARM SBSA watchdog driver fu.wei
2015-05-15 11:08   ` [PATCH 1/6] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-05-15 14:06     ` Arnd Bergmann
2015-05-15 14:06       ` Arnd Bergmann
2015-05-15 14:14       ` Fu Wei
2015-05-15 14:14         ` Fu Wei
2015-05-16 10:29       ` Fu Wei
2015-05-16 10:29         ` Fu Wei
2015-05-15 11:08   ` [PATCH 2/6] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-05-15 11:08   ` [PATCH 3/6] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-05-15 11:08     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-15 14:07   ` [Linaro-acpi] [PATCH 0/6] Watchdog: introdouce ARM SBSA watchdog driver Arnd Bergmann
2015-05-15 14:07     ` Arnd Bergmann
2015-05-16 10:33     ` Fu Wei
2015-05-16 10:33       ` Fu Wei
2015-05-15 11:24 ` [PATCH 4/6] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-05-15 11:24   ` [PATCH 5/6] Watchdog: introdouce ARM SBSA watchdog driver fu.wei
2015-05-15 13:57     ` Arnd Bergmann
2015-05-16 12:01       ` Fu Wei
2015-05-16 12:01         ` Fu Wei
2015-05-16 12:26         ` Timur Tabi
2015-05-15 22:57     ` Guenter Roeck
2015-05-15 22:57       ` Guenter Roeck
2015-05-18 17:38       ` Fu Wei
2015-05-18 17:38         ` Fu Wei
2015-05-15 11:24   ` [PATCH 6/6] ACPI: import watchdog info of GTDT into platform device fu.wei
2015-05-15 13:33   ` [PATCH 4/6] Watchdog: introdouce "pretimeout" into framework Guenter Roeck
2015-05-15 13:49     ` Fu Wei
2015-05-15 13:55       ` Timur Tabi
2015-05-15 13:55         ` Timur Tabi
2015-05-15 17:59         ` Guenter Roeck
2015-05-15 18:01       ` Guenter Roeck
2015-05-15 18:01         ` Guenter Roeck
2015-05-18 17:22         ` Fu Wei
2015-05-18 17:22           ` Fu Wei
2015-05-15 14:04   ` Arnd Bergmann
2015-05-18 17:19     ` Fu Wei
2015-05-18 17:19       ` Fu Wei
2015-05-18 17:23       ` Guenter Roeck
2015-05-18 17:39         ` Fu Wei
2015-05-18 20:03         ` Arnd Bergmann
2015-05-18 20:14           ` Guenter Roeck
2015-05-18 20:14             ` Guenter Roeck
2015-05-19  1:12             ` Fu Wei
2015-05-19  1:12               ` Fu Wei
2015-05-21  8:32 ` [PATCH v2 0/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-05-21  8:32   ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-21  8:32   ` [PATCH v2 1/7] clocksource: export "arch_timer_get_rate" for the other drivers fu.wei
2015-05-21  8:32     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-22 14:02     ` Hanjun Guo
2015-05-22 14:09     ` Timur Tabi
2015-05-22 15:16       ` Guenter Roeck
2015-05-22 16:22         ` Timur Tabi
2015-05-21  8:32   ` [PATCH v2 2/7] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-05-21  8:32   ` [PATCH v2 3/7] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-05-21  8:45     ` Arnd Bergmann
2015-05-21  8:49       ` Fu Wei
2015-05-21  8:49         ` Fu Wei
2015-05-21  8:32   ` [PATCH v2 4/7] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-05-21 20:33     ` Suravee Suthikulpanit
2015-05-21 20:33       ` Suravee Suthikulpanit
2015-05-21  8:32   ` [PATCH v2 5/7] Watchdog: introduce "pretimeout" into framework fu.wei
2015-05-21  9:04     ` Guenter Roeck
2015-05-21 10:05       ` Fu Wei
2015-05-21 10:05         ` Fu Wei
2015-05-21 10:17         ` Guenter Roeck
2015-05-21 10:50           ` Fu Wei
2015-05-21 10:50             ` Fu Wei
2015-05-21 13:28             ` Guenter Roeck
2015-05-21 10:11     ` Guenter Roeck
2015-05-21 15:32     ` Guenter Roeck
2015-05-21 15:32       ` Guenter Roeck
2015-05-22  5:17       ` Fu Wei
2015-05-25  3:09       ` Fu Wei
2015-05-25  3:09         ` Fu Wei
2015-05-22  6:30     ` Timo Kokkonen
2015-05-22  8:23       ` Fu Wei
2015-05-22  8:59         ` Timo Kokkonen
2015-05-22 10:46           ` Fu Wei
2015-05-22 10:46             ` Fu Wei
2015-05-22 12:14             ` Timo Kokkonen
2015-05-22 13:37               ` Guenter Roeck
2015-05-22 13:23             ` Guenter Roeck
2015-05-22 14:38               ` Fu Wei
2015-05-22 14:38                 ` Fu Wei
2015-05-22 15:05                 ` Guenter Roeck
2015-05-24 16:17                   ` Fu Wei
2015-05-21  8:32   ` [PATCH v2 6/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-05-21  8:32     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-21 10:34     ` Guenter Roeck
2015-05-21 10:34       ` Guenter Roeck
2015-05-21 11:08       ` Fu Wei
2015-05-21 15:18         ` Guenter Roeck
2015-05-21 15:18           ` Guenter Roeck
2015-05-21 15:46           ` Fu Wei
2015-05-21 15:59             ` Guenter Roeck
2015-05-21 16:12               ` Fu Wei
2015-05-21 16:12                 ` Fu Wei
2015-05-21 16:33                 ` Timur Tabi
2015-05-21 16:33                   ` Timur Tabi
2015-05-22  5:05                   ` Fu Wei
2015-05-22  5:05                     ` Fu Wei
2015-05-21 13:09       ` Timur Tabi
2015-05-21 15:28         ` Guenter Roeck
2015-05-21 15:28           ` Guenter Roeck
2015-05-25  3:43           ` Fu Wei
2015-05-25  3:43             ` Fu Wei
2015-05-25  3:46             ` Timur Tabi
2015-05-25  3:46               ` Timur Tabi
2015-05-25  4:11               ` Fu Wei
2015-05-25  4:11                 ` Fu Wei
2015-05-21 15:42     ` Timur Tabi
2015-05-21 15:42       ` Timur Tabi
2015-05-23 16:28       ` Fu Wei
2015-05-23 16:50         ` Fu Wei
2015-05-23 19:40         ` Timur Tabi
2015-05-23 19:40           ` Timur Tabi
2015-05-23 20:01           ` Guenter Roeck
2015-05-23 20:01             ` Guenter Roeck
2015-05-23 20:27             ` Timur Tabi
2015-05-23 20:27               ` Timur Tabi
2015-05-23 20:44               ` Guenter Roeck
2015-05-24 10:50                 ` Fu Wei
2015-05-24 10:15             ` Fu Wei
2015-05-24 14:15               ` Guenter Roeck
2015-05-24 14:15                 ` Guenter Roeck
2015-05-24 15:50                 ` Fu Wei
2015-05-24 15:50                   ` Fu Wei
2015-05-24 16:23                   ` Guenter Roeck
2015-05-24 16:47                     ` Fu Wei
2015-05-24 16:58                       ` Guenter Roeck
2015-05-24 16:58                         ` Guenter Roeck
2015-05-24 17:04                         ` Fu Wei
2015-05-24 17:04                           ` Fu Wei
2015-05-24 15:02               ` Timur Tabi
2015-05-24 16:04                 ` Fu Wei
2015-05-24 16:04                   ` Fu Wei
2015-05-24 16:13                   ` Timur Tabi
2015-05-24 16:13                     ` Timur Tabi
2015-05-24 16:29                     ` Guenter Roeck
2015-05-24 16:29                       ` Guenter Roeck
2015-05-24 16:33                       ` Fu Wei
2015-05-24 16:44                       ` Timur Tabi
2015-05-24 16:50                         ` Guenter Roeck
2015-05-24 16:52                         ` Fu Wei
2015-05-24 17:19                           ` Timur Tabi
2015-05-24 17:19                             ` Timur Tabi
2015-05-24 17:23                             ` Fu Wei
2015-05-24 17:32                             ` Guenter Roeck
2015-05-24 17:32                               ` Guenter Roeck
2015-05-24 17:47                               ` Timur Tabi
2015-05-25  2:03                                 ` Fu Wei
2015-05-25  2:00                               ` Fu Wei
2015-05-24 16:29                     ` Fu Wei
2015-05-22 14:50     ` Hanjun Guo
2015-05-22 14:50       ` Hanjun Guo
2015-05-22 14:55       ` Arnd Bergmann
2015-05-22 15:01         ` Guenter Roeck
2015-05-22 15:01           ` Guenter Roeck
2015-05-22 15:18           ` Hanjun Guo
2015-05-22 15:18             ` Hanjun Guo
2015-05-22 15:24             ` [Linaro-acpi] " Arnd Bergmann
2015-05-22 15:24               ` Arnd Bergmann
2015-05-22 16:19               ` Timur Tabi
2015-05-22 20:13                 ` Arnd Bergmann
2015-05-22 20:17                   ` Timur Tabi
2015-05-23  7:25               ` Fu Wei
2015-05-23  7:25                 ` Fu Wei
2015-05-22 16:19           ` Timur Tabi
2015-05-23 14:47           ` Fu Wei
2015-05-22 16:18         ` Timur Tabi
2015-05-23 15:08         ` Timur Tabi
2015-05-23 15:08           ` Timur Tabi
2015-05-23 17:26           ` Fu Wei
2015-05-23 18:35             ` Guenter Roeck
2015-05-23 18:37               ` Timur Tabi
2015-05-23 19:03                 ` Fu Wei
2015-05-23 19:51                 ` Guenter Roeck
2015-05-24  9:58                   ` Fu Wei
2015-05-24 14:06                     ` Guenter Roeck
2015-05-24 14:06                       ` Guenter Roeck
2015-05-24 15:06                       ` Timur Tabi
2015-05-24 15:06                         ` Timur Tabi
2015-05-24 15:37                       ` Fu Wei
2015-05-24 15:37                         ` Fu Wei
2015-05-23 18:40             ` Timur Tabi
2015-05-23 19:14               ` Fu Wei
2015-05-23 19:14                 ` Fu Wei
2015-05-23 19:21                 ` Timur Tabi
2015-05-21  8:32   ` [PATCH v2 7/7] ACPI: import watchdog info of GTDT into platform device fu.wei
2015-05-22 15:38     ` Hanjun Guo
2015-05-22 15:38       ` Hanjun Guo
2015-05-23 19:46     ` Timur Tabi
2015-05-23 19:46       ` Timur Tabi
2015-05-21  8:46   ` [Linaro-acpi] [PATCH v2 0/7] Watchdog: introduce ARM SBSA watchdog driver Arnd Bergmann
2015-05-21  8:46     ` Arnd Bergmann
2015-05-21  9:01     ` Fu Wei
2015-05-21  9:01       ` Fu Wei
2015-05-21 20:36   ` Suravee Suthikulpanit
2015-05-21 20:36     ` Suravee Suthikulpanit
2015-05-22  5:08     ` Fu Wei
2015-05-25 10:03 ` [PATCH v3 0/6] " fu.wei
2015-05-25 10:03   ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-25 10:03   ` [PATCH v3 1/6] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-05-25 10:03     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-05-25 10:03   ` [PATCH v3 2/6] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-05-25 10:03   ` [PATCH v3 3/6] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-05-25 10:03   ` [PATCH v3 4/6] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-05-25 19:28     ` Guenter Roeck
2015-05-25 19:28       ` Guenter Roeck
2015-05-25 10:03   ` [PATCH v3 5/6] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-05-25 19:39     ` Guenter Roeck
2015-05-25 19:39       ` Guenter Roeck
2015-05-29  9:11       ` Fu Wei
2015-05-29  9:11         ` Fu Wei
2015-05-29 14:54         ` Guenter Roeck
2015-05-29 15:05           ` Fu Wei
2015-05-26 16:50     ` Timur Tabi
2015-05-29 10:17       ` Fu Wei
2015-05-29 10:17         ` Fu Wei
2015-05-29 13:28         ` Timur Tabi
2015-05-29 13:28           ` Timur Tabi
2015-05-29 14:32           ` Fu Wei
2015-05-29 14:32             ` Fu Wei
2015-05-29 15:46             ` Timur Tabi
2015-05-29 15:46               ` Timur Tabi
2015-05-29 17:53               ` Fu Wei
2015-05-29 18:27                 ` Timur Tabi
2015-05-29 18:27                   ` Timur Tabi
2015-05-29 22:10               ` Guenter Roeck
2015-05-29 22:10                 ` Guenter Roeck
2015-06-01  7:50                 ` Fu Wei
2015-05-25 10:03   ` [PATCH v3 6/6] ACPI: import watchdog info of GTDT into platform device fu.wei
2015-05-26  8:28     ` Hanjun Guo
2015-05-26 16:35       ` Timur Tabi
2015-05-26 18:24         ` Guenter Roeck
2015-05-26 18:24           ` Guenter Roeck
2015-05-27  3:01         ` Hanjun Guo
2015-05-27  3:08           ` Timur Tabi
2015-05-27  3:08             ` Timur Tabi
2015-05-26 12:28     ` Will Deacon
2015-05-26 12:28       ` Will Deacon
2015-05-26 15:02       ` Ashwin Chaugule
2015-05-26 15:02         ` Ashwin Chaugule
2015-05-26 15:18         ` Will Deacon
2015-05-26 15:18           ` Will Deacon
2015-05-26 15:35           ` Ashwin Chaugule
2015-05-26 15:35             ` Ashwin Chaugule
2015-05-26 15:35             ` Ashwin Chaugule
2015-05-26 15:36           ` Guenter Roeck
2015-05-26 15:36             ` Guenter Roeck
2015-05-26 16:27             ` Fu Wei
2015-05-26 16:27               ` Fu Wei
2015-05-27 10:44               ` Will Deacon
2015-05-27 10:44                 ` Will Deacon
2015-05-29 11:13                 ` Fu Wei
2015-05-29 11:13                   ` Fu Wei
2015-06-02  4:05 ` [PATCH v4 0/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-02  4:05   ` [PATCH v4 1/7] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-06-02  4:05   ` [PATCH v4 2/7] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-06-02  4:05   ` [PATCH v4 3/7] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-06-02  4:05     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-02  4:05   ` [PATCH v4 4/7] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-06-02  4:05     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-02 16:12     ` Guenter Roeck
2015-06-02 16:12       ` Guenter Roeck
2015-06-08 16:44       ` Fu Wei
2015-06-02  4:05   ` [PATCH v4 5/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-02  4:05     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-02 15:32     ` Timur Tabi
2015-06-02 15:32       ` Timur Tabi
2015-06-02 15:37       ` Guenter Roeck
2015-06-02 15:37         ` Guenter Roeck
2015-06-02 16:55       ` Fu Wei
2015-06-02 16:55         ` Fu Wei
2015-06-02 17:07         ` Guenter Roeck
2015-06-02 17:07           ` Guenter Roeck
2015-06-08 16:05           ` Fu Wei
2015-06-08 16:05             ` Fu Wei
2015-06-08 18:26             ` Guenter Roeck
2015-06-08 18:26               ` Guenter Roeck
2015-06-09  3:59               ` Fu Wei
2015-06-09  4:37                 ` Guenter Roeck
2015-06-09  4:37                   ` Guenter Roeck
2015-06-09  6:37                   ` Fu Wei
2015-06-09  6:37                     ` Fu Wei
2015-06-09  8:04                     ` Guenter Roeck
2015-06-09  8:04                       ` Guenter Roeck
2015-06-09 10:46                       ` Fu Wei
2015-06-09 16:22                         ` Guenter Roeck
2015-06-09 16:29                           ` Timur Tabi
2015-06-09 16:29                             ` Timur Tabi
2015-06-09 16:45                             ` Guenter Roeck
2015-06-09 16:53                               ` Timur Tabi
2015-06-09 16:53                                 ` Timur Tabi
2015-06-10  3:41                               ` Fu Wei
2015-06-10  3:41                                 ` Fu Wei
2015-06-10  4:20                                 ` Fu Wei
2015-06-10 14:22                                   ` Timur Tabi
2015-06-10 14:22                                     ` Timur Tabi
2015-06-10 14:36                                     ` Fu Wei
2015-06-10 14:36                                       ` Fu Wei
2015-06-10 14:41                                       ` Fu Wei
2015-06-10 14:41                                         ` Fu Wei
2015-06-10 14:41                                         ` Fu Wei
2015-06-10 15:38                                 ` Fu Wei
2015-06-10 15:38                                   ` Fu Wei
2015-06-10 17:54                                   ` Fu Wei
2015-06-10 17:54                                     ` Fu Wei
2015-06-11  0:22                                 ` Timur Tabi
2015-06-11  0:22                                   ` Timur Tabi
2015-06-11  3:00                                   ` Fu Wei
2015-06-11  3:45                                     ` Timur Tabi
2015-06-11  3:45                                       ` Timur Tabi
2015-06-11  5:13                                       ` Guenter Roeck
2015-06-11  5:13                                         ` Guenter Roeck
2015-06-11  5:33                                         ` Fu Wei
2015-06-11  5:32                                       ` Fu Wei
2015-06-11  5:32                                         ` Fu Wei
2015-06-02 17:21         ` Timur Tabi
2015-06-02 17:21           ` Timur Tabi
2015-06-03 18:16     ` Timur Tabi
2015-06-03 18:16       ` Timur Tabi
2015-06-03 18:25       ` Guenter Roeck
2015-06-03 18:25         ` Guenter Roeck
2015-06-03 18:53         ` Timur Tabi
2015-06-03 18:53           ` Timur Tabi
2015-06-03 19:29           ` Arnd Bergmann
2015-09-10 22:45           ` Jon Masters
2015-09-14  4:21             ` Pratyush Anand
2015-09-14 15:27               ` Fu Wei
2015-09-14 15:27                 ` Fu Wei
2015-09-14  8:51             ` Catalin Marinas
2015-09-15  3:16             ` Fu Wei
2015-09-15  3:16               ` Fu Wei
2015-06-08 16:10         ` Fu Wei
2015-06-02  4:05   ` [PATCH v4 6/7] ACPI: add GTDT table parse driver into ACPI driver fu.wei
2015-06-02  4:05   ` [PATCH v4 7/7] clocksource: simplify ACPI code in arm_arch_timer.c fu.wei
2015-06-10 13:41 ` [PATCH v5 0/8] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-10 13:41   ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 1/8] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-06-10 13:41   ` [PATCH v5 2/8] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-06-10 13:41     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 3/8] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-06-10 13:41     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 4/8] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-06-10 16:21     ` Guenter Roeck
2015-06-10 16:21       ` Guenter Roeck
2015-06-11 11:22       ` Fu Wei
2015-06-11 16:38         ` Guenter Roeck
2015-06-11 16:38           ` Guenter Roeck
2015-06-10 13:41   ` [PATCH v5 5/8] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-10 13:41     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 6/8] ACPI: add GTDT table parse driver into ACPI driver fu.wei
2015-06-10 13:41     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 7/8] Watchdog: enable ACPI GTDT support for ARM SBSA watchdog driver fu.wei
2015-06-10 13:41     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 13:41   ` [PATCH v5 8/8] clocksource: simplify ACPI code in arm_arch_timer.c fu.wei
2015-06-10 17:47 ` [PATCH non-pretimeout 0/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-10 17:47   ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 17:47   ` [PATCH non-pretimeout 1/7] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-06-10 17:47     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-10 17:47   ` [PATCH non-pretimeout 2/7] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-06-10 17:47   ` [PATCH non-pretimeout 3/7] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-06-10 17:47     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-12 20:54     ` Timur Tabi
2015-06-12 20:54       ` Timur Tabi
2015-06-14 10:05       ` Fu Wei
2015-06-14 13:17         ` Timur Tabi
2015-06-14 13:17           ` Timur Tabi
2015-06-14 13:57         ` Guenter Roeck
2015-06-15 11:00           ` Fu Wei
2015-06-10 17:47   ` [PATCH non-pretimeout 4/7] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-11  5:33     ` Guenter Roeck
2015-06-11  5:33       ` Guenter Roeck
2015-06-11  5:44       ` Fu Wei
2015-06-11  5:49         ` Guenter Roeck
2015-06-11  5:59           ` Fu Wei
2015-06-11  5:59             ` Fu Wei
2015-06-11 16:28     ` [non-pretimeout,4/7] " Guenter Roeck
2015-06-23 13:26       ` Fu Wei
2015-06-23 15:21         ` Guenter Roeck
2015-06-23 15:21           ` Guenter Roeck
2015-06-23 16:17           ` Fu Wei
2015-06-23 16:43             ` Guenter Roeck
2015-06-23 17:01               ` Fu Wei
2015-06-23 17:01                 ` Fu Wei
2015-06-12  3:57     ` [PATCH non-pretimeout 4/7] " Timur Tabi
2015-06-12  3:57       ` Timur Tabi
2015-06-14 10:15       ` Fu Wei
2015-06-14 10:15         ` Fu Wei
2015-06-10 17:47   ` [PATCH non-pretimeout 5/7] ACPI: add GTDT table parse driver into ACPI driver fu.wei
2015-06-11 11:14     ` Hanjun Guo
2015-06-10 17:47   ` [PATCH non-pretimeout 6/7] Watchdog: enable ACPI GTDT support for ARM SBSA watchdog driver fu.wei
2015-06-10 17:47     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-12 13:16     ` Timur Tabi
2015-06-10 17:47   ` [PATCH non-pretimeout 7/7] clocksource: simplify ACPI code in arm_arch_timer.c fu.wei
2015-06-10 17:47     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-23 14:16 ` [PATCH v6 0/8] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-06-23 14:16   ` [PATCH v6 1/8] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-06-23 14:16     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-07-14 14:49     ` Rob Herring
2015-07-14 14:49       ` Rob Herring
2015-07-14 15:48       ` Fu Wei
2015-07-14 15:48         ` Fu Wei
2015-07-15 12:52         ` Fu Wei
2015-07-15 12:52           ` Fu Wei
2015-06-23 14:16   ` [PATCH v6 2/8] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-06-23 14:16     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-23 14:16   ` [PATCH v6 3/8] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-06-23 14:16   ` [PATCH v6 4/8] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-06-23 14:16     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-29 16:53   ` [PATCH v6 0/8] Watchdog: introduce ARM SBSA watchdog driver Fu Wei
2015-06-29 16:53     ` Fu Wei
2015-06-29 19:16     ` Guenter Roeck
2015-06-30 23:47       ` Fu Wei
2015-07-13  9:09       ` Fu Wei
2015-07-13  9:09         ` Fu Wei
2015-07-13 15:34         ` Guenter Roeck
2015-07-14  0:42           ` Fu Wei
2015-07-14  0:42             ` Fu Wei
2015-06-23 15:59 ` [PATCH v6 5/8] " fu.wei
2015-06-23 15:59   ` [PATCH v6 6/8] ACPI: add GTDT table parse driver into ACPI driver fu.wei
2015-06-23 15:59     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-07-23  8:32     ` Fu Wei
2015-07-23  8:32       ` Fu Wei
2015-07-23  8:32       ` Fu Wei
2015-06-23 15:59   ` [PATCH v6 7/8] Watchdog: enable ACPI GTDT support for ARM SBSA watchdog driver fu.wei
2015-06-23 15:59     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-06-23 15:59   ` [PATCH v6 8/8] clocksource: simplify ACPI code in arm_arch_timer.c fu.wei
2015-06-23 15:59     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-07-13  8:53 ` [PATCH v2 0/3] arm64: Add multiboot support (via fdt) for Xen boot fu.wei
2015-07-13  8:53   ` [PATCH v2 1/3] arm64: Add Xen boot support file fu.wei
2015-07-15 16:18     ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2015-07-15 16:18       ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-16 16:46       ` Ian Campbell
2015-07-16 16:46         ` Ian Campbell
2015-07-23 10:16       ` Fu Wei
2015-07-23 10:16         ` Fu Wei
2015-07-13  8:53   ` [PATCH v2 2/3] util/grub.d/20_linux_xen.in: Add arm64 support fu.wei
2015-07-14  3:53     ` Andrei Borzenkov
2015-07-14  3:53       ` Andrei Borzenkov
2015-07-14  9:41       ` Ian Campbell
2015-07-14 15:23         ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-07-14 13:09       ` Fu Wei
2015-07-14 13:09         ` Fu Wei
2015-07-15 16:24         ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-15 16:24           ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-13  8:54   ` [PATCH v2 3/3] arm64: Add the introduction of Xen boot command fu.wei
2015-07-14  9:29   ` [Xen-devel] [PATCH v2 0/3] arm64: Add multiboot support (via fdt) for Xen boot Ian Campbell
2015-07-14  9:29     ` Ian Campbell
2015-07-14 11:56     ` Fu Wei
2015-07-15 15:56   ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-15 15:56     ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-23  5:16 ` [PATCH v3 0/4] arm64: Add Xen boot support (via fdt) fu.wei
2015-07-23  5:16   ` [PATCH v3 1/4] arm64: Add and export some accessor functions for xen boot fu.wei
2015-10-29 12:03     ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-29 12:03       ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-30  7:11       ` Fu Wei
2015-10-30  7:11         ` Fu Wei
2015-07-23  5:16   ` [PATCH v3 2/4] arm64: Add xen_boot module file fu.wei
2015-10-29 14:27     ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-29 14:27       ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-30  8:08       ` Fu Wei
2015-10-30  8:08         ` Fu Wei
2015-11-03 14:57         ` Fu Wei
2015-11-03 14:57           ` Fu Wei
2015-11-03 15:22           ` Ian Campbell
2015-11-03 15:22             ` Ian Campbell
2015-11-05  9:46             ` Fu Wei
2015-07-23  5:16   ` [PATCH v3 3/4] * util/grub.d/20_linux_xen.in: Add support of the XEN boot on aarch64 fu.wei
2015-10-29 15:25     ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-29 15:25       ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-29 19:53       ` Andrei Borzenkov
2015-10-29 19:53         ` Andrei Borzenkov
2015-10-30  8:44       ` Fu Wei
2015-10-30  8:44         ` Fu Wei
2015-10-30  9:50         ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-30  9:50           ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-10-30 10:07           ` Andrei Borzenkov
2015-10-30 10:07             ` Andrei Borzenkov
     [not found]             ` <CAEaD8JOHR9QXa=ySc36a-ECF-7MUBgvaSVFw_BZxrXrvZA5u_A@mail.gmail.com>
     [not found]               ` <CAA91j0XKvpgVVWuv79AEv6bguxrQrV4q+eG5Xtw+UBvMSmDF-w@mail.gmail.com>
2015-11-12 10:43                 ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-07-23  5:16   ` [PATCH v3 4/4] arm64: Add the introduction of xen boot commands in docs/grub.texi fu.wei
2015-08-04  8:34   ` [PATCH v3 0/4] arm64: Add Xen boot support (via fdt) Fu Wei
2015-09-08  3:38     ` Fu Wei
2015-09-30 16:00       ` Stefano Stabellini
2015-10-01 16:19         ` Stefano Stabellini
2015-10-29  2:43           ` Fu Wei
2015-10-29  6:06         ` Fu Wei
2015-10-29 11:00           ` Stefano Stabellini
2015-08-14 12:35 ` [PATCH] acpi, apei, arm64: APEI initial support for aarch64 fu.wei
2015-08-14 12:39   ` Fu Wei
2015-08-14 18:27     ` Zhang, Jonathan Zhixiong
2015-08-15  6:45       ` Fu Wei
2015-08-17 10:01   ` Will Deacon
2015-08-17 23:19     ` Zhang, Jonathan Zhixiong
2015-08-18  8:31       ` Will Deacon
2015-08-18  9:26         ` Fu Wei
2015-08-18 16:44 ` [PATCH v2 0/2] acpi, apei: add BERT support fu.wei
2015-08-18 16:44   ` [PATCH v2 1/2] acpi, apei: add Boot Error Record Table (BERT) support fu.wei
2015-12-16 10:29     ` Borislav Petkov
2016-01-06 18:21       ` Fu Wei
2016-01-06 18:31         ` Borislav Petkov
2015-08-18 16:44   ` [PATCH v2 2/2] acpi, apei, bert: Clear error status at the end of error handling fu.wei
2015-12-16 10:30     ` Borislav Petkov
2015-12-15 16:39   ` [Linaro-acpi] [PATCH v2 0/2] acpi, apei: add BERT support Timur Tabi
2016-01-06 18:24     ` Fu Wei
2015-08-24 17:01 ` [PATCH v7 0/8] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-08-24 17:01   ` [PATCH v7 1/8] Documentation: add sbsa-gwdt.txt documentation fu.wei
2015-08-24 17:01   ` [PATCH v7 2/8] ARM64: add SBSA Generic Watchdog device node in foundation-v8.dts fu.wei
2015-09-15  8:43     ` Dave Young
2015-09-15  8:43       ` Dave Young
2015-09-15  9:44       ` Pratyush Anand
2015-09-15 10:23         ` Fu Wei
2015-09-15 10:15       ` Fu Wei
2015-08-24 17:01   ` [PATCH v7 3/8] ARM64: add SBSA Generic Watchdog device node in amd-seattle-soc.dtsi fu.wei
2015-08-24 17:01   ` [PATCH v7 4/8] Watchdog: introdouce "pretimeout" into framework fu.wei
2015-08-24 17:01   ` [PATCH v7 5/8] Watchdog: introduce ARM SBSA watchdog driver fu.wei
2015-09-10 22:29     ` Jon Masters
2015-09-11  2:05       ` Guenter Roeck
2015-09-11  2:50       ` Guenter Roeck
2015-09-11  2:50         ` Guenter Roeck
2015-09-14 17:11         ` Fu Wei
2015-09-15  8:38     ` Dave Young
2015-09-15 10:07       ` Fu Wei
2015-09-16  1:57         ` Dave Young
2015-10-13  8:34           ` Fu Wei
2015-10-13  8:34             ` Fu Wei
2015-08-24 17:01   ` [PATCH v7 6/8] ACPI: add GTDT table parse driver into ACPI driver fu.wei
2015-08-24 17:01   ` [PATCH v7 7/8] Watchdog: enable ACPI GTDT support for ARM SBSA watchdog driver fu.wei
2015-08-24 17:01   ` [PATCH v7 8/8] clocksource: simplify ACPI code in arm_arch_timer.c fu.wei
2015-08-24 17:01     ` fu.wei-QSEj5FYQhm4dnm+yROfE0A
2015-08-24 17:50     ` Thomas Gleixner
2015-08-25 17:19       ` Fu Wei
2015-08-25 19:17         ` Thomas Gleixner
2015-08-25 19:17           ` Thomas Gleixner
2015-08-27 12:02           ` Hanjun Guo
2015-08-27 12:02             ` Hanjun Guo
2015-08-27 12:08             ` Thomas Gleixner
2015-08-27 12:28               ` Hanjun Guo
2015-08-27 12:28                 ` Hanjun Guo
2015-08-27 13:36                 ` Hanjun Guo
2015-08-27 13:40                   ` Thomas Gleixner
2015-08-27 13:40                     ` Thomas Gleixner
2015-08-27 13:51                     ` Fu Wei
2015-09-14 18:05                       ` Marc Zyngier
2015-09-14 18:05                         ` Marc Zyngier
2015-09-30 17:13   ` [PATCH v7 0/8] Watchdog: introduce ARM SBSA watchdog driver Pratyush Anand
2015-09-30 17:22     ` Fu Wei
2016-02-25  6:50 ` [PATCH v2 0/4] arm64,xen: add xen_boot support into grup-mkconfig fu.wei

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=55A687E5.4070106@gmail.com \
    --to=phcoder@gmail.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=arvidjaar@gmail.com \
    --cc=fu.wei@linaro.org \
    --cc=grub-devel@gnu.org \
    --cc=jcm@redhat.com \
    --cc=leif.lindholm@linaro.org \
    --cc=linaro-uefi@lists.linaro.org \
    --cc=ryan.harkin@linaro.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /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.