mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: anis chali <chalianis1@gmail.com>, s.hauer@pengutronix.de
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH 6/7] efi: payload: add support for efi stub boot and fit image.
Date: Fri, 5 Sep 2025 21:10:04 +0200	[thread overview]
Message-ID: <d7915489-2adb-4da9-8c39-99b501654f94@pengutronix.de> (raw)
In-Reply-To: <f5589de4f42267db92032c2b599053fbf5e05e23.camel@gmail.com>

Hi,

On 9/5/25 12:44 AM, anis chali wrote:
> Hi,
> 
>> We should rename the existing image.c to handover.c and keep it x86 only
>> and add your code without the historical baggage IMO.
> Ok, We can rename the file, do we need to create a shared file between them,
> beacuse we have all the code for reading the image and allocating in common 
> between the handover.c (comming) and the image.c, An option would be refactoring
> the handover to become just a branch that we take if a config is enabled, Knowing
> that we meybe can support efi stub in x86 with the same code in image.c, in that case 
> we maybe should just name it efi/payload/bootm.c and it will cover linux as efi application
> fitImage on all supported architectures??

I think it would be easiest if you just rename image.c to handover.c,
duplicate all its code in a new bootm.c, throw away all the x86/handover
specific stuff and implement the spec-conforming protocol without the
handover baggage. Consolidation can happen separately, once we have
something that works and is upstream.

>> Given that Sascha already commented on some things, I want to ask you to
>> squash your latest changes into this commit, have two separate files
>> (maybe call this one boot.c) and resend.
> 
> Okay, I’ll wait for your feedback before proceeding.

Sorry, I should have been clearer; The usual workflow is that you squash
requested changes into the original patch and then send a v2 (or v3, ...
etc.). I see that you addressed Sascha's feedback in a separate patch.

Please resend the series fully with feedback applied for the next round
of review.

Thanks,
Ahmad

> 
>> Thanks,
>> Ahmad
>>
>> This code is tested on many qemu EFI compilations comming from ovmf ubuntu
>>> package, tianocore efi for qemu, local edk2 build, and also tested on RPi3b
>>> 64 bit EFI from tianocore and a local build of edk2, more mchines will be
>>> tested soon. the test was for a full boot chain on RPi3b booting a fit image
>>> containing a kernel, an fdt, and a ramdisk with ostree initrd to mount an
>>> ostree root filesystem. for contribution in short term,
>>> 1. it would be nice to test with more hardware,
>>> 2. linux global checkup of efivars, efi capsule update, efi runtime services
>>> 3. The state.dtb to support barebox state to manage multiple system boot
>>>    and a recovery.
>>>    the case would be sys1 = new ostree commit, sys2 = old commit (rollback)
>>>    and a recovery boot system on readonly disk.
>>> 4. secure boot, PoC to check if there is a way to load TF-A from EFI
>>> and then load the efi payload from it and launch optee??
>>>
>> Signed-off-by: Chali Anis <[chalianis1@gmail.com](mailto:chalianis1@gmail.com)>
>>> ---
>>>  efi/payload/image.c | 457 ++++++++++++++++++++++++++++++++++++++------
>>>  1 file changed, 403 insertions(+), 54 deletions(-)
>>>
>> diff --git a/efi/payload/image.c b/efi/payload/image.c
>>> index 33c5e18dac27..38d52a32ea64 100644
>>> --- a/efi/payload/image.c
>>> +++ b/efi/payload/image.c
>>> @@ -25,6 +25,7 @@
>>>  #include <libfile.h>
>>>  #include <binfmt.h>
>>>  #include <wchar.h>
>>> +#include <image-fit.h>
>>>  #include <efi/efi-payload.h>
>>>  #include <efi/efi-device.h>
>>>  
>>> @@ -77,42 +78,41 @@ struct linux_kernel_header {
>>>  	uint32_t handover_offset;	/** */
>>>  } __attribute__ ((packed));
>>>  
>>> -static void *efi_read_file(const char *file, size_t *size)
>>> -{
>>> -	efi_physical_addr_t mem;
>>> -	efi_status_t efiret;
>>> -	struct stat s;
>>> -	char *buf;
>>> -	ssize_t ret;
>>> +struct efi_mem_resource {
>>> +	efi_physical_addr_t base;
>>> +	size_t size;
>>> +} __attribute__ ((packed));
>>>  
>>> -	buf = read_file(file, size);
>>> -	if (buf || errno != ENOMEM)
>>> -		return buf;
>>> +struct efi_image_data {
>>> +	struct image_data *data;
>>>  
>>> -	ret = stat(file, &s);
>>> -	if (ret)
>>> -		return NULL;
>>> +	efi_handle_t handle;
>>> +	struct efi_loaded_image *loaded_image;
>>>  
>>> -	efiret = BS->allocate_pages(EFI_ALLOCATE_ANY_PAGES,
>>> -				    EFI_LOADER_CODE,
>>> -				    DIV_ROUND_UP(s.st_size, EFI_PAGE_SIZE),
>>> -				    &mem);
>>> +	struct efi_mem_resource image_res;
>>> +	struct efi_mem_resource oftree_res;
>>> +	struct efi_mem_resource *initrd_res;
>>> +};
>>> +
>>> +
>>> +static void *efi_allocate_pages(efi_physical_addr_t *mem,
>>> +				size_t size,
>>> +				enum efi_allocate_type allocate_type,
>>> +				enum efi_memory_type mem_type)
>>> +{
>>> +	efi_status_t efiret;
>>> +
>>> +	efiret = BS->allocate_pages(allocate_type, mem_type,
>>> +				    DIV_ROUND_UP(size, EFI_PAGE_SIZE), mem);
>>>  	if (EFI_ERROR(efiret)) {
>>>  		errno = efi_errno(efiret);
>>>  		return NULL;
>>>  	}
>>>  
>>> -	buf = efi_phys_to_virt(mem);
>>> -
>>> -	ret = read_file_into_buf(file, buf, s.st_size);
>>> -	if (ret < 0)
>>> -		return NULL;
>>> -
>>> -	*size = ret;
>>> -	return buf;
>>> +	return efi_phys_to_virt(*mem);
>>>  }
>>>  
>>> -static void efi_free_file(void *_mem, size_t size)
>>> +static void efi_free_pages(void *_mem, size_t size)
>>>  {
>>>  	efi_physical_addr_t mem = efi_virt_to_phys(_mem);
>>>  
>>> @@ -122,28 +122,40 @@ static void efi_free_file(void *_mem, size_t size)
>>>  		BS->free_pages(mem, DIV_ROUND_UP(size, EFI_PAGE_SIZE));
>>>  }
>>>  
>>> -static int efi_load_image(const char *file, struct efi_loaded_image **loaded_image,
>>> -		efi_handle_t *h)
>>> +static int efi_load_file_image(const char *file,
>>> +			       struct efi_loaded_image **loaded_image,
>>> +			       efi_handle_t *h)
>>>  {
>>> +	efi_physical_addr_t mem;
>>>  	void *exe;
>>> +	char *buf;
>>>  	size_t size;
>>>  	efi_handle_t handle;
>>>  	efi_status_t efiret = EFI_SUCCESS;
>>>  
>>> -	exe = efi_read_file(file, &size);
>>> -	if (!exe)
>>> -		return -errno;
>>> +	buf = read_file(file, &size);
>>> +	if (!buf)
>>> +		return -ENOMEM;
>>>  
>>> -	efiret = BS->load_image(false, efi_parent_image, efi_device_path, exe, size,
>>> -			&handle);
>>> +	exe = efi_allocate_pages(&mem, size, EFI_ALLOCATE_ANY_PAGES,
>>> +				 EFI_LOADER_CODE);
>>> +	if (!exe) {
>>> +		pr_err("Failed to allocate pages for image\n");
>>> +		return -ENOMEM;
>>> +	}
>>> +
>>> +	memcpy(exe, buf, size);
>>> +
>>> +	efiret = BS->load_image(false, efi_parent_image, efi_device_path, exe,
>>> +				size, &handle);
>>>  	if (EFI_ERROR(efiret)) {
>>>  		pr_err("failed to LoadImage: %s\n", efi_strerror(efiret));
>>>  		goto out;
>>>  	};
>>>  
>>>  	efiret = BS->open_protocol(handle, &efi_loaded_image_protocol_guid,
>>> -			(void **)loaded_image,
>>> -			efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
>>> +				   (void **)loaded_image, efi_parent_image,
>>> +				   NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
>>>  	if (EFI_ERROR(efiret)) {
>>>  		pr_err("failed to OpenProtocol: %s\n", efi_strerror(efiret));
>>>  		BS->unload_image(handle);
>>> @@ -151,8 +163,10 @@ static int efi_load_image(const char *file, struct efi_loaded_image **loaded_ima
>>>  	}
>>>  
>>>  	*h = handle;
>>> +
>>> +	return 0;
>>>  out:
>>> -	efi_free_file(exe, size);
>>> +	efi_free_pages(exe, size);
>>>  	return -efi_errno(efiret);
>>>  }
>>>  
>>> @@ -171,20 +185,16 @@ static bool is_linux_image(enum filetype filetype, const void *base)
>>>  	return false;
>>>  }
>>>  
>>> -static int efi_execute_image(enum filetype filetype, const char *file)
>>> +static int efi_execute_image(efi_handle_t handle,
>>> +			     struct efi_loaded_image *loaded_image,
>>> +			     enum filetype filetype)
>>>  {
>>> -	efi_handle_t handle;
>>> -	struct efi_loaded_image *loaded_image;
>>>  	efi_status_t efiret;
>>>  	const char *options;
>>>  	bool is_driver;
>>> -	int ret;
>>> -
>>> -	ret = efi_load_image(file, &loaded_image, &handle);
>>> -	if (ret)
>>> -		return ret;
>>>  
>>> -	is_driver = (loaded_image->image_code_type == EFI_BOOT_SERVICES_CODE) ||
>>> +	is_driver =
>>> +		(loaded_image->image_code_type == EFI_BOOT_SERVICES_CODE) ||
>>>  		(loaded_image->image_code_type == EFI_RUNTIME_SERVICES_CODE);
>>>  
>>>  	if (is_linux_image(filetype, loaded_image->image_base)) {
>>> @@ -192,7 +202,8 @@ static int efi_execute_image(enum filetype filetype, const char *file)
>>>  		options = linux_bootargs_get();
>>>  		pr_info("add linux options '%s'\n", options);
>>>  		if (options) {
>>> -			loaded_image->load_options = xstrdup_char_to_wchar(options);
>>> +			loaded_image->load_options =
>>> +				xstrdup_char_to_wchar(options);
>>>  			loaded_image->load_options_size =
>>>  				(strlen(options) + 1) * sizeof(wchar_t);
>>>  		}
>>> @@ -216,11 +227,11 @@ static int efi_execute_image(enum filetype filetype, const char *file)
>>>  	return -efi_errno(efiret);
>>>  }
>>>  
>>> -typedef void(*handover_fn)(void *image, struct efi_system_table *table,
>>> -		struct linux_kernel_header *header);
>>> +typedef void (*handover_fn)(void *image, struct efi_system_table *table,
>>> +			    struct linux_kernel_header *header);
>>>  
>>>  static inline void linux_efi_handover(efi_handle_t handle,
>>> -		struct linux_kernel_header *header)
>>> +				      struct linux_kernel_header *header)
>>>  {
>>>  	handover_fn handover;
>>>  	uintptr_t addr;
>>> @@ -244,7 +255,7 @@ static int do_bootm_efi(struct image_data *data)
>>>  	struct efi_loaded_image *loaded_image;
>>>  	struct linux_kernel_header *image_header, *boot_header;
>>>  
>>> -	ret = efi_load_image(data->os_file, &loaded_image, &handle);
>>> +	ret = efi_load_file_image(data->os_file, &loaded_image, &handle);
>>>  	if (ret)
>>>  		return ret;
>>>  
>>> @@ -284,8 +295,9 @@ static int do_bootm_efi(struct image_data *data)
>>>  		boot_header->cmdline_size = strlen(options);
>>>  	}
>>>  
>>> -	boot_header->code32_start = efi_virt_to_phys(loaded_image->image_base +
>>> -			(image_header->setup_sects+1) * 512);
>>> +	boot_header->code32_start =
>>> +		efi_virt_to_phys(loaded_image->image_base +
>>> +				 (image_header->setup_sects + 1) * 512);
>>>  
>>>  	if (bootm_verbose(data)) {
>>>  		printf("\nStarting kernel at 0x%p", loaded_image->image_base);
>>> @@ -311,15 +323,350 @@ static int do_bootm_efi(struct image_data *data)
>>>  	return 0;
>>>  }
>>>  
>>> +static bool ramdisk_is_fit(struct image_data *data)
>>> +{
>>> +	struct stat st;
>>> +
>>> +	if (bootm_signed_images_are_forced())
>>> +		return true;
>>> +
>>> +	if (data->initrd_file) {
>>> +		if (!stat(data->initrd_file, &st) && st.st_size > 0)
>>> +			return false;
>>> +	}
>>> +
>>> +	return data->os_fit ? (bool)fit_has_image(data->os_fit,
>>> +			data->fit_config, "ramdisk") : false;
>>> +}
>>> +
>>> +static bool fdt_is_fit(struct image_data *data)
>>> +{
>>> +	struct stat st;
>>> +
>>> +	if (bootm_signed_images_are_forced())
>>> +		return true;
>>> +
>>> +	if (data->oftree_file) {
>>> +		if (!stat(data->initrd_file, &st) && st.st_size > 0)
>>> +			return false;
>>> +	}
>>> +
>>> +	return data->os_fit ? (bool)fit_has_image(data->os_fit,
>>> +			data->fit_config, "fdt") : false;
>>> +}
>>> +
>>> +static int efi_load_os(struct efi_image_data *e)
>>> +{
>>> +	efi_status_t efiret = EFI_SUCCESS;
>>> +	efi_physical_addr_t mem;
>>> +	size_t image_size = 0;
>>> +	void *image = NULL;
>>> +	void *vmem = NULL;
>>> +	int ret = 0;
>>> +
>>> +	if (e->data->os_fit) {
>>> +		image = (void *)e->data->fit_kernel;
>>> +		image_size = e->data->fit_kernel_size;
>>> +	} else if (e->data->os_file)
>>> +		return efi_load_file_image(e->data->os_file,
>>> +				&e->loaded_image, &e->handle);
>>> +
>>> +	vmem = efi_allocate_pages(&mem, image_size, EFI_ALLOCATE_ANY_PAGES,
>>> +				 EFI_LOADER_CODE);
>>> +	if (!vmem) {
>>> +		pr_err("Failed to allocate pages for image\n");
>>> +		return -ENOMEM;
>>> +	}
>>> +
>>> +	memcpy(vmem, image, image_size);
>>> +
>>> +	efiret = BS->load_image(false, efi_parent_image, efi_device_path, image,
>>> +				image_size, &e->handle);
>>> +	if (EFI_ERROR(efiret)) {
>>> +		ret = -efi_errno(efiret);
>>> +		pr_err("failed to LoadImage: %s\n", efi_strerror(efiret));
>>> +		goto out_mem;
>>> +	};
>>> +
>>> +	efiret = BS->open_protocol(e->handle, &efi_loaded_image_protocol_guid,
>>> +				   (void **)&e->loaded_image, efi_parent_image,
>>> +				   NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
>>> +	if (EFI_ERROR(efiret)) {
>>> +		ret = -efi_errno(efiret);
>>> +		pr_err("failed to OpenProtocol: %s\n", efi_strerror(efiret));
>>> +		goto out_unload;
>>> +	}
>>> +
>>> +	e->image_res.base = mem;
>>> +	e->image_res.size = image_size;
>>> +
>>> +	return 0;
>>> +
>>> +out_mem:
>>> +	efi_free_pages(vmem, image_size);
>>> +out_unload:
>>> +	BS->unload_image(e->handle);
>>> +	return ret;
>>> +}
>>> +
>>> +static void efi_unload_os(struct efi_image_data *e)
>>> +{
>>> +	BS->close_protocol(e->handle, &efi_loaded_image_protocol_guid,
>>> +				 efi_parent_image, NULL);
>>> +
>>> +	BS->unload_image(e->handle);
>>> +	efi_free_pages(efi_phys_to_virt(e->image_res.base),
>>> +				 e->image_res.size);
>>> +}
>>> +
>>> +static int efi_load_ramdisk(struct efi_image_data *e)
>>> +{
>>> +	void *vmem, *tmp = NULL;
>>> +	efi_physical_addr_t mem;
>>> +	efi_status_t efiret = EFI_SUCCESS;
>>> +	const void *initrd;
>>> +	unsigned long initrd_size;
>>> +	bool from_fit;
>>> +	int ret;
>>> +
>>> +	from_fit = ramdisk_is_fit(e->data);
>>> +
>>> +	if (from_fit) {
>>> +		ret = fit_open_image(e->data->os_fit, e->data->fit_config,
>>> +				     "ramdisk", &initrd, &initrd_size);
>>> +		if (ret) {
>>> +			pr_err("Cannot open ramdisk image in FIT image: %pe\n",
>>> +			       ERR_PTR(ret));
>>> +			return ret;
>>> +		}
>>> +	}
>>> +
>>> +	if (!from_fit) {
>>> +		if (!e->data->initrd_file)
>>> +			return 0;
>>> +
>>> +		pr_info("Loading ramdisk from '%s'\n", e->data->initrd_file);
>>> +		tmp = read_file(e->data->initrd_file, &initrd_size);
>>> +		if (!tmp || initrd_size <= 0) {
>>> +			pr_err("Failed to read initrd from file: %s\n",
>>> +				e->data->initrd_file);
>>> +			return -EINVAL;
>>> +		}
>>> +		initrd = tmp;
>>> +	}
>>> +
>>> +	efiret = BS->allocate_pool(EFI_LOADER_DATA,
>>> +			sizeof(struct efi_mem_resource),
>>> +			(void **)&e->initrd_res);
>>> +	if (EFI_ERROR(efiret) || !e->initrd_res) {
>>> +		ret = -efi_errno(efiret);
>>> +		pr_err("Failed to allocate initrd %s/n", efi_strerror(efiret));
>>> +		goto free_mem;
>>> +	}
>>> +
>>> +	vmem = efi_allocate_pages(&mem, initrd_size,
>>> +				 EFI_ALLOCATE_MAX_ADDRESS, EFI_LOADER_DATA);
>>> +	if (!vmem) {
>>> +		pr_err("Failed to allocate pages for initrd data\n");
>>> +		ret = -ENOMEM;
>>> +		goto free_pool;
>>> +	}
>>> +
>>> +	memcpy(vmem, (void *)initrd, initrd_size);
>>> +	e->initrd_res->base = (uint64_t)mem;
>>> +	e->initrd_res->size = (uint64_t)initrd_size;
>>> +
>>> +	if (IS_ENABLED(CONFIG_EFI_INITRD_INSTALL)) {
>>> +		efiret = BS->install_configuration_table(
>>> +			&efi_linux_initrd_media_guid,
>>> +			(void *)e->initrd_res);
>>> +		if (EFI_ERROR(efiret)) {
>>> +			ret = -efi_errno(efiret);
>>> +			pr_err("Failed to install INITRD %s/n",
>>> +					efi_strerror(efiret));
>>> +			goto free_pages;
>>> +		}
>>> +	} else {
>>> +		ret = efi_initrd_register(vmem, initrd_size);
>>> +		if (ret) {
>>> +			pr_err("Failed to register INITRD %s/n",
>>> +				strerror(efiret));
>>> +			goto free_pages;
>>> +		}
>>> +	}
>>> +
>>> +	if (!from_fit && tmp)
>>> +		free(tmp);
>>> +
>>> +	return 0;
>>> +
>>> +free_pages:
>>> +	efi_free_pages(vmem, initrd_size);
>>> +free_pool:
>>> +	BS->free_pool(e->initrd_res);
>>> +free_mem:
>>> +	if (!from_fit && tmp)
>>> +		free(tmp);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static void efi_unload_ramdisk(struct efi_image_data *e)
>>> +{
>>> +
>>> +	if (IS_ENABLED(CONFIG_EFI_INITRD_INSTALL))
>>> +		BS->install_configuration_table(
>>> +			&efi_linux_initrd_media_guid, NULL);
>>> +	else
>>> +		efi_initrd_unregister();
>>> +
>>> +	efi_free_pages(efi_phys_to_virt(e->initrd_res->base),
>>> +				 e->initrd_res->size);
>>> +
>>> +	BS->free_pool(e->initrd_res);
>>> +	e->initrd_res = NULL;
>>> +}
>>> +
>>> +static int efi_load_fdt(struct efi_image_data *e)
>>> +{
>>> +	efi_status_t efiret = EFI_SUCCESS;
>>> +	efi_physical_addr_t mem;
>>> +	void *vmem, *tmp = NULL;
>>> +	const void *of_tree;
>>> +	unsigned long of_size;
>>> +	bool from_fit;
>>> +	int ret;
>>> +
>>> +	if (IS_ENABLED(CONFIG_EFI_FDT_FORCE))
>>> +		return 0;
>>> +
>>> +	from_fit = fdt_is_fit(e->data);
>>> +	if (from_fit) {
>>> +		ret = fit_open_image(e->data->os_fit, e->data->fit_config,
>>> +				     "fdt", &of_tree, &of_size);
>>> +		if (ret) {
>>> +			pr_err("Cannot open FDT image in FIT image: %pe\n",
>>> +			       ERR_PTR(ret));
>>> +			return ret;
>>> +		}
>>> +	}
>>> +
>>> +	if (!from_fit) {
>>> +		if (!e->data->oftree_file)
>>> +			return 0;
>>> +
>>> +		pr_info("Loading devicetree from '%s'\n", e->data->oftree_file);
>>> +		tmp = read_file(e->data->oftree_file, &of_size);
>>> +		if (!tmp || of_size <= 0) {
>>> +			pr_err("Failed to read initrd from file: %s\n",
>>> +				e->data->initrd_file);
>>> +			return -EINVAL;
>>> +		}
>>> +		of_tree = tmp;
>>> +	}
>>> +
>>> +	vmem = efi_allocate_pages(&mem, of_size + CONFIG_FDT_PADDING,
>>> +				 EFI_ALLOCATE_ANY_PAGES,
>>> +				 EFI_ACPI_RECLAIM_MEMORY);
>>> +	if (!vmem) {
>>> +		pr_err("Failed to allocate pages for FDT\n");
>>> +		goto free_file;
>>> +		return -ENOMEM;
>>> +	}
>>> +
>>> +	memcpy(vmem, of_tree, of_size);
>>> +
>>> +	efiret = BS->install_configuration_table(&efi_fdt_guid,
>>> +			(void *)mem);
>>> +	if (EFI_ERROR(efiret)) {
>>> +		pr_err("Failed to install FDT %s/n", efi_strerror(efiret));
>>> +		ret = -efi_errno(efiret);
>>> +		goto free_mem;
>>> +	}
>>> +
>>> +	e->oftree_res.base = mem;
>>> +	e->oftree_res.size = of_size + CONFIG_FDT_PADDING;
>>> +
>>> +	if (!from_fit && tmp)
>>> +		free(tmp);
>>> +
>>> +	return 0;
>>> +
>>> +free_mem:
>>> +	efi_free_pages(vmem, of_size);
>>> +free_file:
>>> +	if (!from_fit && tmp)
>>> +		free(tmp);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static void efi_unload_fdt(struct efi_image_data *e)
>>> +{
>>> +	BS->install_configuration_table(&efi_fdt_guid, NULL);
>>> +
>>> +	efi_free_pages(efi_phys_to_virt(e->oftree_res.base),
>>> +				 e->oftree_res.size);
>>> +}
>>> +
>>> +static int do_bootm_efi_stub(struct image_data *data)
>>> +{
>>> +	struct efi_image_data e = {.data = data};
>>> +	enum filetype type;
>>> +	int ret = 0;
>>> +
>>> +	ret = efi_load_os(&e);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +	ret = efi_load_fdt(&e);
>>> +	if (ret)
>>> +		goto unload_os;
>>> +
>>> +	ret = efi_load_ramdisk(&e);
>>> +	if (ret)
>>> +		goto unload_oftree;
>>> +
>>> +	type = file_detect_type(e.loaded_image->image_base, PAGE_SIZE);
>>> +	ret = efi_execute_image(e.handle, e.loaded_image, type);
>>> +	if (ret)
>>> +		goto unload_ramdisk;
>>> +
>>> +	return 0;
>>> +
>>> +unload_ramdisk:
>>> +	if (e.initrd_res)
>>> +		efi_unload_ramdisk(&e);
>>> +unload_oftree:
>>> +	efi_unload_fdt(&e);
>>> +unload_os:
>>> +	efi_unload_os(&e);
>>> +	return ret;
>>> +}
>>> +
>>>  static struct image_handler efi_handle_tr = {
>>>  	.name = "EFI Application",
>>>  	.bootm = do_bootm_efi,
>>>  	.filetype = filetype_exe,
>>>  };
>>>  
>>> +static struct image_handler efi_arm64_handle_tr = {
>>> +	.name = "EFI ARM64 Linux kernel",
>>> +	.bootm = do_bootm_efi_stub,
>>> +	.filetype = filetype_arm64_efi_linux_image,
>>> +};
>>> +
>>>  static int efi_execute(struct binfmt_hook *b, char *file, int argc, char **argv)
>>>  {
>>> -	return efi_execute_image(b->type, file);
>>> +	int ret;
>>> +	efi_handle_t handle;
>>> +	struct efi_loaded_image *loaded_image;
>>> +
>>> +	ret = efi_load_file_image(file, &loaded_image, &handle);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +	return efi_execute_image(handle, loaded_image, b->type);
>>>  }
>>>  
>>>  static struct binfmt_hook binfmt_efi_hook = {
>>> @@ -360,8 +707,10 @@ static int efi_register_image_handler(void)
>>>  	if (IS_ENABLED(CONFIG_X86))
>>>  		register_image_handler(&non_efi_handle_linux_x86);
>>>  
>>> -	if (IS_ENABLED(CONFIG_ARM64))
>>> +	if (IS_ENABLED(CONFIG_ARM64)) {
>>> +		register_image_handler(&efi_arm64_handle_tr);
>>>  		binfmt_register(&binfmt_arm64_efi_hook);
>>> +	}
>>>  
>>>  	return 0;
>>>  }
>>>
>>
>> ```
> 

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |




  reply	other threads:[~2025-09-06  0:13 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-31  3:55 [PATCH 1/7] drivers: video: efi-gop: fix null reference pointer chalianis1
2025-08-31  3:55 ` [PATCH 2/7] efi: video: gop: remove dependency to x86 chalianis1
2025-09-02  9:20   ` Ahmad Fatoum
2025-08-31  3:55 ` [PATCH 3/7] efi: payload: initrd: implement efi initrd media protocol chalianis1
2025-08-31  3:55 ` [PATCH 4/7] arm: efi: add a generic efi machine chalianis1
2025-09-03  7:14   ` Sascha Hauer
2025-09-04  8:20   ` Ahmad Fatoum
2025-09-05  0:16     ` anis chali
2025-09-05 19:04       ` Ahmad Fatoum
2025-08-31  3:55 ` [PATCH 5/7] lib: fdt: add lib fdt padding size chalianis1
2025-08-31  3:55 ` [PATCH 6/7] efi: payload: add support for efi stub boot and fit image chalianis1
2025-09-03  7:11   ` Sascha Hauer
     [not found]     ` <CAL+1fyD6Jevxx_wP00caRoXe0yRmM6uScJN8W3fkRVNVfLRj1Q@mail.gmail.com>
     [not found]       ` <aLksEfZ3-YiEL-xN@pengutronix.de>
     [not found]         ` <CAL+1fyA5FtjLfRDbF-dpxr=T6kL=hrF8pr6wJk5aR1X=5CEFUg@mail.gmail.com>
2025-09-04  6:48           ` Sascha Hauer
2025-09-04  6:55             ` Ahmad Fatoum
2025-09-04  9:03   ` Ahmad Fatoum
2025-09-04 22:44     ` anis chali
2025-09-05 19:10       ` Ahmad Fatoum [this message]
2025-09-05 19:24   ` Ahmad Fatoum
2025-08-31  3:55 ` [PATCH 7/7] efi: payload: add options for FDT force and initrd direct install chalianis1
2025-09-04  9:19   ` Ahmad Fatoum
2025-09-04 22:30     ` anis chali
2025-09-05 19:18       ` Ahmad Fatoum

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=d7915489-2adb-4da9-8c39-99b501654f94@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=chalianis1@gmail.com \
    --cc=s.hauer@pengutronix.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox