diff mbox series

[7/7] WIP: efi: debugging

Message ID 20231121113557.800353-8-sjg@chromium.org
State RFC
Delegated to: Tom Rini
Headers show
Series efi: Partial attempt at a test for EFI bootmeth | expand

Commit Message

Simon Glass Nov. 21, 2023, 11:35 a.m. UTC
This works when run outside a test:

good:

/tmp/b/sandbox/u-boot -T
    -c "bootfl scan mmc; bootfl sel 1; bootfl list; bootfl b"

** Booting bootflow 'mmc7.bootdev.part_1' with efi
desc = 0000000018c86ee0
dev=mmc, devnr=7:1, path=efi/boot/bootsbox.efi, buffer=0000000011001000, size=1600
- boot device /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
- image /efi\boot\bootsbox.efi
No EFI system partition
No EFI system partition
Failed to persist EFI variables
EFI using ACPI tables at 8ef8000
WARNING: Can't have ACPI table and device tree - ignoring DT.
Loaded from disk
Booting /efi\boot\bootsbox.efi
EFI: Call: efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
info->device_handle = 0000000018f180e0
loaded_image info for 0000000018f184e0: 0000000018f18470

EFI: 0 returned by efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
EFI: Call: efi_start_image(handle, &exit_data_size, &exit_data)
Hello, world!
Running on UEFI 2.10
Have ACPI 2.0 table
Have SMBIOS table
18f18470
Load options: <none>
finding
- search 0000000018c931a0 ret=0
File path: /efi\boot\bootsbox.efi
Vendor: Das U-Boot
Boot device: /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
Exiting boot sevices
EFI: 5 returned by efi_start_image(handle, &exit_data_size, &exit_data)
Boot failed (err=-22)

bad:

rtv bootflow_efi

** Booting bootflow 'mmc7.bootdev.part_1' with efi
desc = 0000000018c86ee0
dev=mmc, devnr=8:1, path=efi/boot/bootsbox.efi, buffer=0000000011001000, size=1600
- boot device /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
- image /efi\boot\bootsbox.efi
No EFI system partition
No EFI system partition
Failed to persist EFI variables
EFI using ACPI tables at 8ef8000
WARNING: Can't have ACPI table and device tree - ignoring DT.
Loaded from disk
Booting /efi\boot\bootsbox.efi
EFI: Call: efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
info->device_handle = 0000000000000000
loaded_image info for 0000000018c924e0: 0000000018f15080

EFI: 0 returned by efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
EFI: Call: efi_start_image(handle, &exit_data_size, &exit_data)
Hello, world!
Running on UEFI 2.10
Have ACPI 2.0 table
Have SMBIOS table
18f15080
Load options: <none>
finding
- search 0000000018c931a0 ret=0
File path: /efi\boot\bootsbox.efi
Missing device handle
Exiting boot sevices
EFI: 5 returned by efi_start_image(handle, &exit_data_size, &exit_data)
Boot failed (err=-22)
test/boot/bootflow.c:1091, bootflow_efi(): console:
Expected 'No EFI system partition',
     got 'desc = 0000000018c86ee0'
Test bootflow_efi failed 1 times
Failures: 1

(see 'Missing device handle')

It seems that the device number is inconsistent between generation and
decoding.

function rt_get_suite_and_name() {
	local arg
	#echo arg $arg
	suite=
	name=

	if [ "$1" = "-f" ]; then
		force="-f"
		shift
	fi
	arg="$1"
	rest="$2"

	# The symbol is something like this:
	#	_u_boot_list_2_ut_bootstd_test_2_vbe_simple_test_base
	# Split it into the suite name (bootstd) and test name
	# (vbe_simple_test_base)
	read suite name < \
		<(nm /tmp/b/$exec/u-boot |grep "list_2_ut.*$arg.*" \
			| cut -d' ' -f3 \
			| head -1 \
			| sed -n 's/_u_boot_list_2_ut_\(.*\)_test_2_/\1 /p')
	#echo suite $suite
	#echo name $name
	#name=${1#dm_test_}
	#name=${name#ut_dm_}
}

function rtv() {
	local exec=sandbox
	local suite name force rest
	rt_get_suite_and_name $*

	U_BOOT_PERSISTENT_DATA_DIR=/tmp/b/sandbox/persistent-data \
	/tmp/b/$exec/u-boot -v -T $rest -c "ut $suite $force $name"
}

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 boot/bootflow.c               | 2 ++
 boot/bootmeth_efi.c           | 1 +
 cmd/bootefi.c                 | 1 +
 lib/efi_loader/efi_boottime.c | 5 +++++
 test/boot/bootflow.c          | 2 +-
 5 files changed, 10 insertions(+), 1 deletion(-)

Comments

Heinrich Schuchardt Nov. 21, 2023, 5:20 p.m. UTC | #1
On 11/21/23 12:35, Simon Glass wrote:
> This works when run outside a test:
>
> good:
>
> /tmp/b/sandbox/u-boot -T
>      -c "bootfl scan mmc; bootfl sel 1; bootfl list; bootfl b"
>
> ** Booting bootflow 'mmc7.bootdev.part_1' with efi
> desc = 0000000018c86ee0
> dev=mmc, devnr=7:1, path=efi/boot/bootsbox.efi, buffer=0000000011001000, size=1600
> - boot device /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
> - image /efi\boot\bootsbox.efi
> No EFI system partition
> No EFI system partition
> Failed to persist EFI variables
> EFI using ACPI tables at 8ef8000
> WARNING: Can't have ACPI table and device tree - ignoring DT.
> Loaded from disk
> Booting /efi\boot\bootsbox.efi
> EFI: Call: efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> info->device_handle = 0000000018f180e0
> loaded_image info for 0000000018f184e0: 0000000018f18470
>
> EFI: 0 returned by efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> EFI: Call: efi_start_image(handle, &exit_data_size, &exit_data)
> Hello, world!
> Running on UEFI 2.10
> Have ACPI 2.0 table
> Have SMBIOS table
> 18f18470
> Load options: <none>
> finding
> - search 0000000018c931a0 ret=0
> File path: /efi\boot\bootsbox.efi
> Vendor: Das U-Boot
> Boot device: /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
> Exiting boot sevices
> EFI: 5 returned by efi_start_image(handle, &exit_data_size, &exit_data)
> Boot failed (err=-22)
>
> bad:
>
> rtv bootflow_efi
>
> ** Booting bootflow 'mmc7.bootdev.part_1' with efi

Should we have an ESP on the MMC image to persist UEFI variables?

Best regards

Heinrich

> desc = 0000000018c86ee0
> dev=mmc, devnr=8:1, path=efi/boot/bootsbox.efi, buffer=0000000011001000, size=1600
> - boot device /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
> - image /efi\boot\bootsbox.efi
> No EFI system partition
> No EFI system partition
> Failed to persist EFI variables
> EFI using ACPI tables at 8ef8000
> WARNING: Can't have ACPI table and device tree - ignoring DT.
> Loaded from disk
> Booting /efi\boot\bootsbox.efi
> EFI: Call: efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> info->device_handle = 0000000000000000
> loaded_image info for 0000000018c924e0: 0000000018f15080
>
> EFI: 0 returned by efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> EFI: Call: efi_start_image(handle, &exit_data_size, &exit_data)
> Hello, world!
> Running on UEFI 2.10
> Have ACPI 2.0 table
> Have SMBIOS table
> 18f15080
> Load options: <none>
> finding
> - search 0000000018c931a0 ret=0
> File path: /efi\boot\bootsbox.efi
> Missing device handle
> Exiting boot sevices
> EFI: 5 returned by efi_start_image(handle, &exit_data_size, &exit_data)
> Boot failed (err=-22)
> test/boot/bootflow.c:1091, bootflow_efi(): console:
> Expected 'No EFI system partition',
>       got 'desc = 0000000018c86ee0'
> Test bootflow_efi failed 1 times
> Failures: 1
>
> (see 'Missing device handle')
>
> It seems that the device number is inconsistent between generation and
> decoding.
>
> function rt_get_suite_and_name() {
> 	local arg
> 	#echo arg $arg
> 	suite=
> 	name=
>
> 	if [ "$1" = "-f" ]; then
> 		force="-f"
> 		shift
> 	fi
> 	arg="$1"
> 	rest="$2"
>
> 	# The symbol is something like this:
> 	#	_u_boot_list_2_ut_bootstd_test_2_vbe_simple_test_base
> 	# Split it into the suite name (bootstd) and test name
> 	# (vbe_simple_test_base)
> 	read suite name < \
> 		<(nm /tmp/b/$exec/u-boot |grep "list_2_ut.*$arg.*" \
> 			| cut -d' ' -f3 \
> 			| head -1 \
> 			| sed -n 's/_u_boot_list_2_ut_\(.*\)_test_2_/\1 /p')
> 	#echo suite $suite
> 	#echo name $name
> 	#name=${1#dm_test_}
> 	#name=${name#ut_dm_}
> }
>
> function rtv() {
> 	local exec=sandbox
> 	local suite name force rest
> 	rt_get_suite_and_name $*
>
> 	U_BOOT_PERSISTENT_DATA_DIR=/tmp/b/sandbox/persistent-data \
> 	/tmp/b/$exec/u-boot -v -T $rest -c "ut $suite $force $name"
> }
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>   boot/bootflow.c               | 2 ++
>   boot/bootmeth_efi.c           | 1 +
>   cmd/bootefi.c                 | 1 +
>   lib/efi_loader/efi_boottime.c | 5 +++++
>   test/boot/bootflow.c          | 2 +-
>   5 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/boot/bootflow.c b/boot/bootflow.c
> index 6922e7e0c4e7..0513522a7ec4 100644
> --- a/boot/bootflow.c
> +++ b/boot/bootflow.c
> @@ -464,6 +464,8 @@ void bootflow_init(struct bootflow *bflow, struct udevice *bootdev,
>
>   void bootflow_free(struct bootflow *bflow)
>   {
> +	/* this is where we want to get to (will only happen with USB) */
> +	printf("bootflow free\n");
>   	free(bflow->name);
>   	free(bflow->subdir);
>   	free(bflow->fname);
> diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
> index ae936c8daa18..edee9e62a458 100644
> --- a/boot/bootmeth_efi.c
> +++ b/boot/bootmeth_efi.c
> @@ -127,6 +127,7 @@ static void set_efi_bootdev(struct blk_desc *desc, struct bootflow *bflow)
>   	 * this can go away.
>   	 */
>   	media_dev = dev_get_parent(bflow->dev);
> +	printf("desc = %p\n", desc);
>   	snprintf(devnum_str, sizeof(devnum_str), "%x:%x",
>   		 desc ? desc->devnum : dev_seq(media_dev),
>   		 bflow->part);
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index 20e5c94a33a4..3c014e5684aa 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -5,6 +5,7 @@
>    *  Copyright (c) 2016 Alexander Graf
>    */
>
> +#define LOG_DEBUG
>   #define LOG_CATEGORY LOGC_EFI
>
>   #include <common.h>
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 0b7579cb5af1..149da5798740 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1820,6 +1820,7 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
>
>   	if (device_path) {
>   		info->device_handle = efi_dp_find_obj(device_path, NULL, NULL);
> +		printf("info->device_handle = %p\n", info->device_handle);
>
>   		dp = efi_dp_append(device_path, file_path);
>   		if (!dp) {
> @@ -1828,6 +1829,7 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
>   		}
>   	} else {
>   		dp = NULL;
> +		printf("\nno device handle\n");
>   	}
>   	ret = efi_add_protocol(&obj->header,
>   			       &efi_guid_loaded_image_device_path, dp);
> @@ -1842,6 +1844,7 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
>   			       &efi_guid_loaded_image, info);
>   	if (ret != EFI_SUCCESS)
>   		goto failure;
> +	printf("loaded_image info for %p: %p\n\n", &obj->header, info);
>
>   	*info_ptr = info;
>   	*handle_ptr = obj;
> @@ -2665,8 +2668,10 @@ static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol,
>   		if (ret == EFI_SUCCESS)
>   			goto found;
>   	} else {
> +		printf("finding\n");
>   		list_for_each_entry(efiobj, &efi_obj_list, link) {
>   			ret = efi_search_protocol(efiobj, protocol, &handler);
> +			printf("- search %p ret=%lx\n", efiobj, ret);
>   			if (ret == EFI_SUCCESS)
>   				goto found;
>   		}
> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> index ad54ef6eaabc..76c65c46cc01 100644
> --- a/test/boot/bootflow.c
> +++ b/test/boot/bootflow.c
> @@ -536,7 +536,7 @@ static int prep_mmc_bootdev(struct unit_test_state *uts, const char *mmc_dev,
>
>   	order[2] = mmc_dev;
>
> -	/* Enable the mmc4 node since we need a second bootflow */
> +	/* Enable the requested mmc node since we need a second bootflow */
>   	root = oftree_root(oftree_default());
>   	node = ofnode_find_subnode(root, mmc_dev);
>   	ut_assert(ofnode_valid(node));
Simon Glass Nov. 21, 2023, 10:10 p.m. UTC | #2
Hi Heinrich,

On Tue, 21 Nov 2023 at 10:20, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 11/21/23 12:35, Simon Glass wrote:
> > This works when run outside a test:
> >
> > good:
> >
> > /tmp/b/sandbox/u-boot -T
> >      -c "bootfl scan mmc; bootfl sel 1; bootfl list; bootfl b"
> >
> > ** Booting bootflow 'mmc7.bootdev.part_1' with efi
> > desc = 0000000018c86ee0
> > dev=mmc, devnr=7:1, path=efi/boot/bootsbox.efi, buffer=0000000011001000, size=1600
> > - boot device /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
> > - image /efi\boot\bootsbox.efi
> > No EFI system partition
> > No EFI system partition
> > Failed to persist EFI variables
> > EFI using ACPI tables at 8ef8000
> > WARNING: Can't have ACPI table and device tree - ignoring DT.
> > Loaded from disk
> > Booting /efi\boot\bootsbox.efi
> > EFI: Call: efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> > info->device_handle = 0000000018f180e0
> > loaded_image info for 0000000018f184e0: 0000000018f18470
> >
> > EFI: 0 returned by efi_load_image(false, efi_root, file_path, source_buffer, source_size, &handle)
> > EFI: Call: efi_start_image(handle, &exit_data_size, &exit_data)
> > Hello, world!
> > Running on UEFI 2.10
> > Have ACPI 2.0 table
> > Have SMBIOS table
> > 18f18470
> > Load options: <none>
> > finding
> > - search 0000000018c931a0 ret=0
> > File path: /efi\boot\bootsbox.efi
> > Vendor: Das U-Boot
> > Boot device: /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b,0000000000000000)/SD(7)/SD(3)/HD(1,MBR,0x2f7d9756,0x800,0x9000)
> > Exiting boot sevices
> > EFI: 5 returned by efi_start_image(handle, &exit_data_size, &exit_data)
> > Boot failed (err=-22)
> >
> > bad:
> >
> > rtv bootflow_efi
> >
> > ** Booting bootflow 'mmc7.bootdev.part_1' with efi
>
> Should we have an ESP on the MMC image to persist UEFI variables?

That would be a good enhancement, but I would like to get the basics
going first.

Regards,
Simon
diff mbox series

Patch

diff --git a/boot/bootflow.c b/boot/bootflow.c
index 6922e7e0c4e7..0513522a7ec4 100644
--- a/boot/bootflow.c
+++ b/boot/bootflow.c
@@ -464,6 +464,8 @@  void bootflow_init(struct bootflow *bflow, struct udevice *bootdev,
 
 void bootflow_free(struct bootflow *bflow)
 {
+	/* this is where we want to get to (will only happen with USB) */
+	printf("bootflow free\n");
 	free(bflow->name);
 	free(bflow->subdir);
 	free(bflow->fname);
diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
index ae936c8daa18..edee9e62a458 100644
--- a/boot/bootmeth_efi.c
+++ b/boot/bootmeth_efi.c
@@ -127,6 +127,7 @@  static void set_efi_bootdev(struct blk_desc *desc, struct bootflow *bflow)
 	 * this can go away.
 	 */
 	media_dev = dev_get_parent(bflow->dev);
+	printf("desc = %p\n", desc);
 	snprintf(devnum_str, sizeof(devnum_str), "%x:%x",
 		 desc ? desc->devnum : dev_seq(media_dev),
 		 bflow->part);
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 20e5c94a33a4..3c014e5684aa 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -5,6 +5,7 @@ 
  *  Copyright (c) 2016 Alexander Graf
  */
 
+#define LOG_DEBUG
 #define LOG_CATEGORY LOGC_EFI
 
 #include <common.h>
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 0b7579cb5af1..149da5798740 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -1820,6 +1820,7 @@  efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
 
 	if (device_path) {
 		info->device_handle = efi_dp_find_obj(device_path, NULL, NULL);
+		printf("info->device_handle = %p\n", info->device_handle);
 
 		dp = efi_dp_append(device_path, file_path);
 		if (!dp) {
@@ -1828,6 +1829,7 @@  efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
 		}
 	} else {
 		dp = NULL;
+		printf("\nno device handle\n");
 	}
 	ret = efi_add_protocol(&obj->header,
 			       &efi_guid_loaded_image_device_path, dp);
@@ -1842,6 +1844,7 @@  efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
 			       &efi_guid_loaded_image, info);
 	if (ret != EFI_SUCCESS)
 		goto failure;
+	printf("loaded_image info for %p: %p\n\n", &obj->header, info);
 
 	*info_ptr = info;
 	*handle_ptr = obj;
@@ -2665,8 +2668,10 @@  static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol,
 		if (ret == EFI_SUCCESS)
 			goto found;
 	} else {
+		printf("finding\n");
 		list_for_each_entry(efiobj, &efi_obj_list, link) {
 			ret = efi_search_protocol(efiobj, protocol, &handler);
+			printf("- search %p ret=%lx\n", efiobj, ret);
 			if (ret == EFI_SUCCESS)
 				goto found;
 		}
diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index ad54ef6eaabc..76c65c46cc01 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -536,7 +536,7 @@  static int prep_mmc_bootdev(struct unit_test_state *uts, const char *mmc_dev,
 
 	order[2] = mmc_dev;
 
-	/* Enable the mmc4 node since we need a second bootflow */
+	/* Enable the requested mmc node since we need a second bootflow */
 	root = oftree_root(oftree_default());
 	node = ofnode_find_subnode(root, mmc_dev);
 	ut_assert(ofnode_valid(node));