
On 11/4/20 6:26 PM, Ilias Apalodimas wrote:
Hi Heinrich,
On Wed, Nov 04, 2020 at 05:50:16PM +0100, Heinrich Schuchardt wrote:
On 04.11.20 16:56, Ilias Apalodimas wrote:
u32 tpm2_get_capability(struct udevice *dev, u32 capability, u32 property,
void *buf, size_t prop_count)
void *buf, size_t prop_count, bool get_count)
The implementation would be more stable if we would derive the offset from field property instead of adding get_count.
We are not defining the tpmv2 internal structures anywhere in U-Boot. That's why the code is doing static sizeof(uX) instead of using offsetof. In the EFI part of the patchset, I've done exaclty that. Working with offsets on well defined struct is better, but out of scope for this patchset imho. We can look into refactoring the generic tpmv2 code once I add the rest of the EFI protocol parts?
Can't we add the structures that we need to tpm-v2.h and use their size here?
Yes we can, but the scope of the patch is adding EFI_TCG2_PROTOCOL, not re-factor the tpmv2 code along the way. Since the only change on the existing code to support the functionality needed for the EFI_TCG2_PROTOCOL protocol is just 4 bytes on an existing buffer, can we stick to that and think of refactoring the tpm stuff afterwards?
You expect a TPML_PCR_SELECTION when capabilities is TPM_CAP_PCRS.
typedef struct { UINT32 count; TPMS_PCR_SELECTION pcrSelections[TPM2_NUM_PCR_BANKS]; } TPML_PCR_SELECTION;
Why do you have to skip over the UINT32 here?
You just have to define this one structure in preparation of patch 2 and then you can correctly parse the response in your implementation of the EFI protocol.
I suggest not to change tpm2_get_capability() at all.
Best regards
Heinrich
Regards /Ilias
Best regards
Heinrich
{ u8 command_v2[COMMAND_BUFFER_SIZE] = {
Shouldn't COMMAND_BUFFER_SIZE be changed to something with TPM in the name, e.g TPM_COMMAND_BUFFER_SIZE?
tpm_u16(TPM2_ST_NO_SESSIONS), /* TAG */
@@ -181,13 +181,17 @@ u32 tpm2_get_capability(struct udevice *dev, u32 capability, u32 property, if (ret) return ret;
- /* When reading PCR properties we need the count */
- properties_off = sizeof(u16) + sizeof(u32) + sizeof(u32) +
/*sizeof(u8) + sizeof(u32);
*/
- In the response buffer, the properties are located after the:
- tag (u16), response size (u32), response code (u32),
- YES/NO flag (u8), TPM_CAP (u32) and TPMU_CAPABILITIES (u32).
This comment should be above 'properties_off ='. 'get_count' related field should be mentioned.
Sure, I'll fix this
Regards /Ilias
Best regards
Heinrich
- properties_off = sizeof(u16) + sizeof(u32) + sizeof(u32) +
sizeof(u8) + sizeof(u32) + sizeof(u32);
if (!get_count)
properties_off += sizeof(u32);
memcpy(buf, &response[properties_off], response_len - properties_off);
return 0;