All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [PATCH 1/2] efi_loader: move load options to new module
Date: Mon, 18 Jan 2021 11:17:25 +0900	[thread overview]
Message-ID: <20210118021725.GC16614@laputa> (raw)
In-Reply-To: <20210115180250.154660-2-xypron.glpk@gmx.de>

On Fri, Jan 15, 2021 at 07:02:49PM +0100, Heinrich Schuchardt wrote:
> Move all load options related functions to a new module. So that they can
> be compiled independently.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  lib/efi_loader/efi_load_options.c | 151 ++++++++++++++++++++++++++++++
>  1 file changed, 151 insertions(+)
>  create mode 100644 lib/efi_loader/efi_load_options.c
> 
> diff --git a/lib/efi_loader/efi_load_options.c b/lib/efi_loader/efi_load_options.c
> new file mode 100644
> index 0000000000..9f0e25b6e9
> --- /dev/null
> +++ b/lib/efi_loader/efi_load_options.c
> @@ -0,0 +1,151 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + *  EFI boot manager
> + *
> + *  Copyright (c) 2017 Rob Clark

Some part of the code in this file was originally written by me.

-Takahiro Akashi

> + */
> +
> +#define LOG_CATEGORY LOGC_EFI
> +
> +#include <common.h>
> +#include <charset.h>
> +#include <log.h>
> +#include <malloc.h>
> +#include <efi_loader.h>
> +//#include <efi_variable.h>
> +#include <asm/unaligned.h>
> +
> +/**
> + * efi_set_load_options() - set the load options of a loaded image
> + *
> + * @handle:		the image handle
> + * @load_options_size:	size of load options
> + * @load_options:	pointer to load options
> + * Return:		status code
> + */
> +efi_status_t efi_set_load_options(efi_handle_t handle,
> +				  efi_uintn_t load_options_size,
> +				  void *load_options)
> +{
> +	struct efi_loaded_image *loaded_image_info;
> +	efi_status_t ret;
> +
> +	ret = EFI_CALL(systab.boottime->open_protocol(
> +					handle,
> +					&efi_guid_loaded_image,
> +					(void **)&loaded_image_info,
> +					efi_root, NULL,
> +					EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL));
> +	if (ret != EFI_SUCCESS)
> +		return EFI_INVALID_PARAMETER;
> +
> +	loaded_image_info->load_options = load_options;
> +	loaded_image_info->load_options_size = load_options_size;
> +
> +	return EFI_CALL(systab.boottime->close_protocol(handle,
> +							&efi_guid_loaded_image,
> +							efi_root, NULL));
> +}
> +
> +/**
> + * efi_deserialize_load_option() - parse serialized data
> + *
> + * Parse serialized data describing a load option and transform it to the
> + * efi_load_option structure.
> + *
> + * @lo:		pointer to target
> + * @data:	serialized data
> + * @size:	size of the load option, on return size of the optional data
> + * Return:	status code
> + */
> +efi_status_t efi_deserialize_load_option(struct efi_load_option *lo, u8 *data,
> +					 efi_uintn_t *size)
> +{
> +	efi_uintn_t len;
> +
> +	len = sizeof(u32);
> +	if (*size < len + 2 * sizeof(u16))
> +		return EFI_INVALID_PARAMETER;
> +	lo->attributes = get_unaligned_le32(data);
> +	data += len;
> +	*size -= len;
> +
> +	len = sizeof(u16);
> +	lo->file_path_length = get_unaligned_le16(data);
> +	data += len;
> +	*size -= len;
> +
> +	lo->label = (u16 *)data;
> +	len = u16_strnlen(lo->label, *size / sizeof(u16) - 1);
> +	if (lo->label[len])
> +		return EFI_INVALID_PARAMETER;
> +	len = (len + 1) * sizeof(u16);
> +	if (*size < len)
> +		return EFI_INVALID_PARAMETER;
> +	data += len;
> +	*size -= len;
> +
> +	len = lo->file_path_length;
> +	if (*size < len)
> +		return EFI_INVALID_PARAMETER;
> +	lo->file_path = (struct efi_device_path *)data;
> +	if (efi_dp_check_length(lo->file_path, len) < 0)
> +		return EFI_INVALID_PARAMETER;
> +	data += len;
> +	*size -= len;
> +
> +	lo->optional_data = data;
> +
> +	return EFI_SUCCESS;
> +}
> +
> +/**
> + * efi_serialize_load_option() - serialize load option
> + *
> + * Serialize efi_load_option structure into byte stream for BootXXXX.
> + *
> + * @data:	buffer for serialized data
> + * @lo:		load option
> + * Return:	size of allocated buffer
> + */
> +unsigned long efi_serialize_load_option(struct efi_load_option *lo, u8 **data)
> +{
> +	unsigned long label_len;
> +	unsigned long size;
> +	u8 *p;
> +
> +	label_len = (u16_strlen(lo->label) + 1) * sizeof(u16);
> +
> +	/* total size */
> +	size = sizeof(lo->attributes);
> +	size += sizeof(lo->file_path_length);
> +	size += label_len;
> +	size += lo->file_path_length;
> +	if (lo->optional_data)
> +		size += (utf8_utf16_strlen((const char *)lo->optional_data)
> +					   + 1) * sizeof(u16);
> +	p = malloc(size);
> +	if (!p)
> +		return 0;
> +
> +	/* copy data */
> +	*data = p;
> +	memcpy(p, &lo->attributes, sizeof(lo->attributes));
> +	p += sizeof(lo->attributes);
> +
> +	memcpy(p, &lo->file_path_length, sizeof(lo->file_path_length));
> +	p += sizeof(lo->file_path_length);
> +
> +	memcpy(p, lo->label, label_len);
> +	p += label_len;
> +
> +	memcpy(p, lo->file_path, lo->file_path_length);
> +	p += lo->file_path_length;
> +
> +	if (lo->optional_data) {
> +		utf8_utf16_strcpy((u16 **)&p, (const char *)lo->optional_data);
> +		p += sizeof(u16); /* size of trailing \0 */
> +	}
> +	return size;
> +}
> +
> --
> 2.29.2
> 

  reply	other threads:[~2021-01-18  2:17 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 18:02 [PATCH 0/2] efi_loader: make the UEFI boot manager configurable Heinrich Schuchardt
2021-01-15 18:02 ` [PATCH 1/2] efi_loader: move load options to new module Heinrich Schuchardt
2021-01-18  2:17   ` AKASHI Takahiro [this message]
2021-01-18  7:38     ` Heinrich Schuchardt
2021-01-19  7:42   ` Ilias Apalodimas
2021-01-19 11:03     ` Heinrich Schuchardt
2021-01-15 18:02 ` [PATCH 2/2] efi_loader: make the UEFI boot manager configurable Heinrich Schuchardt
2021-01-15 18:43   ` Tom Rini
2021-01-15 20:31     ` Heinrich Schuchardt
2021-01-18 16:21       ` Tom Rini
2021-01-18  2:33 ` [PATCH 0/2] " AKASHI Takahiro
2021-01-18 12:54   ` Heinrich Schuchardt

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=20210118021725.GC16614@laputa \
    --to=takahiro.akashi@linaro.org \
    --cc=u-boot@lists.denx.de \
    /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.