diff mbox

[U-Boot,v4,1/1] efi_loader: write protocol GUID in OpenProtocol

Message ID 20170818154516.12375-1-xypron.glpk@gmx.de
State Accepted
Commit ae0bd3a983023aeb48b4ab3f417e5a62f8f72c37
Delegated to: Alexander Graf
Headers show

Commit Message

Heinrich Schuchardt Aug. 18, 2017, 3:45 p.m. UTC
To understand what is happening in OpenProtocol or LocateProtocol
it is necessary to know the protocol interface GUID.
Let's write a debug message.

Cc: Rob Clark <robdclark@gmail.com>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v4:
	use %pUl format string
	correct indention of output
v3:
	commit message changed
v2:
	fix typo in commit message
---
 include/efi_loader.h          |  8 ++++++++
 lib/efi_loader/efi_boottime.c | 11 +++++++++++
 2 files changed, 19 insertions(+)

Comments

Heinrich Schuchardt Aug. 23, 2017, 9:44 p.m. UTC | #1
On 08/18/2017 05:45 PM, Heinrich Schuchardt wrote:
> To understand what is happening in OpenProtocol or LocateProtocol
> it is necessary to know the protocol interface GUID.
> Let's write a debug message.
> 
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v4:
> 	use %pUl format string
> 	correct indention of output
> v3:
> 	commit message changed
> v2:
> 	fix typo in commit message
> ---
>  include/efi_loader.h          |  8 ++++++++
>  lib/efi_loader/efi_boottime.c | 11 +++++++++++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 870854fb61..5b20af808b 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -17,6 +17,7 @@
>  
>  int __efi_entry_check(void);
>  int __efi_exit_check(void);
> +const char *__efi_nesting(void);
>  const char *__efi_nesting_inc(void);
>  const char *__efi_nesting_dec(void);
>  
> @@ -64,6 +65,13 @@ const char *__efi_nesting_dec(void);
>  	debug("%sEFI: Return From: %s\n", __efi_nesting_dec(), #exp); \
>  	} while(0)
>  
> +/*
> + * Write GUID
> + */
> +#define EFI_PRINT_GUID(txt, guid) ({ \
> +	debug("%sEFI: %s %pUl\n", __efi_nesting(), txt, guid); \
> +	})
> +
>  extern struct efi_runtime_services efi_runtime_services;
>  extern struct efi_system_table systab;
>  
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 5aeaeeca75..6af033458b 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -112,6 +112,11 @@ static const char *indent_string(int level)
>  	return &indent[max - level];
>  }
>  
> +const char *__efi_nesting(void)
> +{
> +	return indent_string(nesting_level);
> +}
> +
>  const char *__efi_nesting_inc(void)
>  {
>  	return indent_string(nesting_level++);
> @@ -1163,6 +1170,8 @@ static efi_status_t EFIAPI efi_locate_protocol(efi_guid_t *protocol,
>  	if (!protocol || !protocol_interface)
>  		return EFI_EXIT(EFI_INVALID_PARAMETER);
>  
> +	EFI_PRINT_GUID("protocol", protocol);
> +
>  	list_for_each(lhandle, &efi_obj_list) {
>  		struct efi_object *efiobj;
>  
> @@ -1366,6 +1375,8 @@ static efi_status_t EFIAPI efi_open_protocol(
>  		goto out;
>  	}
>  
> +	EFI_PRINT_GUID("protocol", protocol);
> +
>  	switch (attributes) {
>  	case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:
>  	case EFI_OPEN_PROTOCOL_GET_PROTOCOL:
> 

Hello Rob,

with the patch installed I sometimes got failures on Travis when grub is
loaded.
https://travis-ci.org/xypron2/u-boot/builds/267753128?utm_source=github_status&utm_medium=notification

I added some code for debugging and found that after efi_exit is called
it opens the EFI_LOADED_IMAGE_PROTOCOL.

This leads to an error in __efi_entry_check():

do_bootefi_exec:270 Jumping to 0x9ee22400

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(869)
efi_exit, ret = 0

  EFI: protocol 5b1b31a1-9562-11d2-8e3f-00a0c969723b

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1567)
efi_open_protocol, ret = 0

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1365)
efi_locate_protocol, ret = 0

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_console.c(54)
efi_cin_get_mode, ret = 0

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1365)
efi_locate_protocol, ret = 0

previous call
/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_console.c(54)
efi_cin_get_mode, ret = 0

/home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c:227:
efi_allocate_pages_ext: Assertion `__efi_entry_check()' failed.

resetting ...

I will work on a patch to fix it.

Regards

Heinrich
Rob Clark Aug. 24, 2017, 12:20 p.m. UTC | #2
On Wed, Aug 23, 2017 at 5:44 PM, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> On 08/18/2017 05:45 PM, Heinrich Schuchardt wrote:
>> To understand what is happening in OpenProtocol or LocateProtocol
>> it is necessary to know the protocol interface GUID.
>> Let's write a debug message.
>>
>> Cc: Rob Clark <robdclark@gmail.com>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> ---
>> v4:
>>       use %pUl format string
>>       correct indention of output
>> v3:
>>       commit message changed
>> v2:
>>       fix typo in commit message
>> ---
>>  include/efi_loader.h          |  8 ++++++++
>>  lib/efi_loader/efi_boottime.c | 11 +++++++++++
>>  2 files changed, 19 insertions(+)
>>
>> diff --git a/include/efi_loader.h b/include/efi_loader.h
>> index 870854fb61..5b20af808b 100644
>> --- a/include/efi_loader.h
>> +++ b/include/efi_loader.h
>> @@ -17,6 +17,7 @@
>>
>>  int __efi_entry_check(void);
>>  int __efi_exit_check(void);
>> +const char *__efi_nesting(void);
>>  const char *__efi_nesting_inc(void);
>>  const char *__efi_nesting_dec(void);
>>
>> @@ -64,6 +65,13 @@ const char *__efi_nesting_dec(void);
>>       debug("%sEFI: Return From: %s\n", __efi_nesting_dec(), #exp); \
>>       } while(0)
>>
>> +/*
>> + * Write GUID
>> + */
>> +#define EFI_PRINT_GUID(txt, guid) ({ \
>> +     debug("%sEFI: %s %pUl\n", __efi_nesting(), txt, guid); \
>> +     })
>> +
>>  extern struct efi_runtime_services efi_runtime_services;
>>  extern struct efi_system_table systab;
>>
>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
>> index 5aeaeeca75..6af033458b 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -112,6 +112,11 @@ static const char *indent_string(int level)
>>       return &indent[max - level];
>>  }
>>
>> +const char *__efi_nesting(void)
>> +{
>> +     return indent_string(nesting_level);
>> +}
>> +
>>  const char *__efi_nesting_inc(void)
>>  {
>>       return indent_string(nesting_level++);
>> @@ -1163,6 +1170,8 @@ static efi_status_t EFIAPI efi_locate_protocol(efi_guid_t *protocol,
>>       if (!protocol || !protocol_interface)
>>               return EFI_EXIT(EFI_INVALID_PARAMETER);
>>
>> +     EFI_PRINT_GUID("protocol", protocol);
>> +
>>       list_for_each(lhandle, &efi_obj_list) {
>>               struct efi_object *efiobj;
>>
>> @@ -1366,6 +1375,8 @@ static efi_status_t EFIAPI efi_open_protocol(
>>               goto out;
>>       }
>>
>> +     EFI_PRINT_GUID("protocol", protocol);
>> +
>>       switch (attributes) {
>>       case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:
>>       case EFI_OPEN_PROTOCOL_GET_PROTOCOL:
>>
>
> Hello Rob,
>
> with the patch installed I sometimes got failures on Travis when grub is
> loaded.
> https://travis-ci.org/xypron2/u-boot/builds/267753128?utm_source=github_status&utm_medium=notification
>
> I added some code for debugging and found that after efi_exit is called
> it opens the EFI_LOADED_IMAGE_PROTOCOL.
>
> This leads to an error in __efi_entry_check():
>
> do_bootefi_exec:270 Jumping to 0x9ee22400
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(869)
> efi_exit, ret = 0
>
>   EFI: protocol 5b1b31a1-9562-11d2-8e3f-00a0c969723b
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1567)
> efi_open_protocol, ret = 0
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1365)
> efi_locate_protocol, ret = 0
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_console.c(54)
> efi_cin_get_mode, ret = 0
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c(1365)
> efi_locate_protocol, ret = 0
>
> previous call
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_console.c(54)
> efi_cin_get_mode, ret = 0
>
> /home/travis/build/xypron2/u-boot/lib/efi_loader/efi_boottime.c:227:
> efi_allocate_pages_ext: Assertion `__efi_entry_check()' failed.
>
> resetting ...
>
> I will work on a patch to fix it.
>

hmm, odd that this patch would trigger it..

maybe adding 'ccflags-y += -DDEBUG=1' in efi_loader/Makefile (and then
possibly an #undef DEBUG at top of efi_console.c to make the debug
spam not *too* much) would help track it down?

I probably need to rebase my stack of patches again.  I've been busy
on other things and haven't had time for u-boot for last couple
weeks..

BR,
-R
diff mbox

Patch

diff --git a/include/efi_loader.h b/include/efi_loader.h
index 870854fb61..5b20af808b 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -17,6 +17,7 @@ 
 
 int __efi_entry_check(void);
 int __efi_exit_check(void);
+const char *__efi_nesting(void);
 const char *__efi_nesting_inc(void);
 const char *__efi_nesting_dec(void);
 
@@ -64,6 +65,13 @@  const char *__efi_nesting_dec(void);
 	debug("%sEFI: Return From: %s\n", __efi_nesting_dec(), #exp); \
 	} while(0)
 
+/*
+ * Write GUID
+ */
+#define EFI_PRINT_GUID(txt, guid) ({ \
+	debug("%sEFI: %s %pUl\n", __efi_nesting(), txt, guid); \
+	})
+
 extern struct efi_runtime_services efi_runtime_services;
 extern struct efi_system_table systab;
 
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 5aeaeeca75..6af033458b 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -112,6 +112,11 @@  static const char *indent_string(int level)
 	return &indent[max - level];
 }
 
+const char *__efi_nesting(void)
+{
+	return indent_string(nesting_level);
+}
+
 const char *__efi_nesting_inc(void)
 {
 	return indent_string(nesting_level++);
@@ -1163,6 +1170,8 @@  static efi_status_t EFIAPI efi_locate_protocol(efi_guid_t *protocol,
 	if (!protocol || !protocol_interface)
 		return EFI_EXIT(EFI_INVALID_PARAMETER);
 
+	EFI_PRINT_GUID("protocol", protocol);
+
 	list_for_each(lhandle, &efi_obj_list) {
 		struct efi_object *efiobj;
 
@@ -1366,6 +1375,8 @@  static efi_status_t EFIAPI efi_open_protocol(
 		goto out;
 	}
 
+	EFI_PRINT_GUID("protocol", protocol);
+
 	switch (attributes) {
 	case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:
 	case EFI_OPEN_PROTOCOL_GET_PROTOCOL: