[SeaBIOS] [PATCH v8 4/8] Support for BIOS interrupt handler

Kevin O'Connor kevin at koconnor.net
Tue Aug 26 16:46:00 CEST 2014


On Wed, Jul 02, 2014 at 11:38:48AM -0400, Stefan Berger wrote:
> This patch implements the TCG BIOS interrupt handler 1ah. It is for
> example used by trusted grub.
> 
> This patch adds an implementation of SHA1 (following NIST specs., IETF RFC 3147
> and Wikipedia) for speeding up measurements of code. Trusted Grub for example
> makes use of this interface and measures (calculates SHA1) of the Linux kernel
> and initrd. Those files can be rather large and hunting their bytes through
> the TIS interface as part of the int handler commands invoked by trusted grub
> does take quite some time due to the many vmexits the interface is creating
> (one per byte).
> 
> There is also a threshold for the size of data to hash (100k) below which
> the TPM is used and above the internal faster SHA1 algorithm is used.
> 
> This patch for example enables trusted grub to interact with the TPM
> and take additional measurements.
[...]
> --- a/src/tcgbios.h
> +++ b/src/tcgbios.h
> @@ -373,6 +373,10 @@ enum ipltype {
>      IPL_EL_TORITO_2
>  };
>  
> +
> +void tcpa_interrupt_handler32(struct bregs *regs);
> +void _cfunc32flat_tcpa_interrupt_handler32(struct bregs *regs);

The _cfunc32flat_XXX functions shouldn't be put in headers.  Just put
the declaration next to where it is used.

> --- a/src/util.h
> +++ b/src/util.h
> @@ -76,6 +76,7 @@ u32 find_resume_vector(void);
>  void acpi_reboot(void);
>  void find_acpi_features(void);
>  extern struct smbios_entry_point *SMBiosAddr;
> +struct smbios_entry_point *get_smbios_entry_point();
>  void copy_smbios(void *pos);
>  void display_uuid(void);
>  void copy_table(void *pos);
> @@ -234,4 +235,34 @@ void vgahook_setup(struct pci_device *pci);
>  // version (auto generated file out/version.c)
>  extern const char VERSION[];
>  
> +
> +static inline u32 rol(u32 val, u16 rol)
> +{
> +    u32 res;
> +
> +    __asm__ __volatile__ ("rol %%cl, %%eax"
> +                          : "=a" (res)
> +                          : "a" (val), "c" (rol));
> +
> +    return res;
> +}

This should go in x86.h.

> +static inline u64 bswap_64(u64 val)
> +{
> +    u32 hi = (u32)(val >> 32);
> +    u32 lo = (u32)val;
> +
> +    __asm__ __volatile__ ("bswap %%eax"
> +                          : "=a" (lo)
> +                          : "a" (lo));
> +
> +    __asm__ __volatile__ ("bswap %%eax"
> +                          : "=a" (hi)
> +                          : "a" (hi));
> +
> +    return ((u64)lo << 32 | hi);
> +}

An equivalent of the above is already in byteorder.h.

-Kevin



More information about the SeaBIOS mailing list