
Hi Eddie,
[...]
But at least the kernel can find the EFI config tables properly.
Also, note that the ret is efi_status_t and the new function you added returns an int. Just switch the ret here accordingly.
* platforms can use different ways to do so. */ ret = tcg2_init_log(dev, &elog);
if (ret != EFI_SUCCESS)
goto free_pool;
memcpy(event_log.buffer, elog.log, elog.log_position);
event_log.pos = elog.log_position;
if (ret == EFI_SUCCESS) {
memcpy(event_log.buffer, elog.log, elog.log_position);
event_log.pos = elog.log_position;
}
I'll try digging into the EFI issues more once I get some time
Ok Ignore the previous mail. I just noticed that the specid event is generated by tcg2_log_init() and that's where the errors come from.
OK, I think I understand the problem. One problem with your solution below is that it's only useful for EFI; writing the event log to a temporary buffer in the non-EFI case is a waste of time, since it can't go anywhere.
It's not even a 'solution', it's just an ugly hack to help you understand where things go sideways.
I have a solution where the user can pass in their buffer in the tcg2_event_log structure in the event that no memory region is discovered. EFI can use that path.
Yep that sounds sane, that way EFI can pass the efi allocated memory and you can call call that with NULL for non-efi code. Please keep in mind that the EventLog, if it comes from TF-A, needs to be replayed into hardware as well, since TF-A doesn't extend PCRs.
Thanks for the debugging effort!
yw
Cheers /Ilias
Eddie
So something like the *really ugly hack* fixes EFI. Can you please turn it into human-readable code
#include <linux/unaligned/be_byteshift.h> #include <linux/unaligned/generic.h> #include <linux/unaligned/le_byteshift.h> +#include <malloc.h>
#include "tpm-utils.h"
@@ -634,7 +635,7 @@ __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size)
if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0, &args))
return -ENODEV;
goto alloc; a = ofnode_get_addr_size(args.node, "reg", &s); if (a == FDT_ADDR_T_NONE)
@@ -643,6 +644,9 @@ __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size) *addr = map_physmem(a, s, MAP_NOCACHE); *size = (u32)s; } +alloc:
*addr = calloc(1, 4096);
*size = 4096; return 0;
}
Cheers /Ilias
Cheers /Ilias
Thanks! /Ilias