On 04/06/2018 12:43 AM, Alexander Graf wrote:
> 
> 
> On 05.04.18 23:28, Ivan Gorinov wrote:
>> Check FileHeader.Machine to make sure the EFI executable image is built
>> for the same architecture. For example, 32-bit U-Boot on x86 will print
>> an error message instead of loading an x86_64 image and crashing.
>>
>> Signed-off-by: Ivan Gorinov <ivan.gori...@intel.com>
>> ---
>>  include/pe.h                      | 24 ++++++++++++++++++++++++
>>  lib/efi_loader/efi_image_loader.c | 24 ++++++++++++------------
>>  2 files changed, 36 insertions(+), 12 deletions(-)
>>
>> diff --git a/include/pe.h b/include/pe.h
>> index c3a19ce..0dc33f0 100644
>> --- a/include/pe.h
>> +++ b/include/pe.h
>> @@ -38,11 +38,35 @@ typedef struct _IMAGE_DOS_HEADER {
>>  #define IMAGE_DOS_SIGNATURE         0x5A4D     /* MZ   */
>>  #define IMAGE_NT_SIGNATURE          0x00004550 /* PE00 */
>>  
>> +#define IMAGE_FILE_MACHINE_I386             0x014c
>>  #define IMAGE_FILE_MACHINE_ARM              0x01c0
>>  #define IMAGE_FILE_MACHINE_THUMB    0x01c2
>>  #define IMAGE_FILE_MACHINE_ARMNT    0x01c4
>>  #define IMAGE_FILE_MACHINE_AMD64    0x8664
>>  #define IMAGE_FILE_MACHINE_ARM64    0xaa64
>> +#define IMAGE_FILE_MACHINE_RISCV32  0x5032
>> +#define IMAGE_FILE_MACHINE_RISCV64  0x5064
>> +
>> +#if defined(CONFIG_ARM64)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_ARM64
>> +#elif defined(CONFIG_ARM)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_THUMB
> 
> Are you sure we always have thumb as machine type here? Aren't we
> compatible with either ARM or THUMB?

The value 0x01c2 means ARM or THUMB
It is used by Linux, GRUB, iPXE.

Regards

Heinrich

> 
>> +#endif
>> +
>> +#if defined(CONFIG_X86_64)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_AMD64
>> +#elif defined(CONFIG_X86)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_I386
>> +#endif
>> +
>> +#if defined(CONFIG_CPU_RISCV_32)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_RISCV32
>> +#endif
>> +
>> +#if defined(CONFIG_CPU_RISCV_64)
>> +#define TARGET_PE_MACHINE_TYPE IMAGE_FILE_MACHINE_RISCV64
>> +#endif
>> +
>>  #define IMAGE_NT_OPTIONAL_HDR32_MAGIC       0x10b
>>  #define IMAGE_NT_OPTIONAL_HDR64_MAGIC       0x20b
>>  #define IMAGE_SUBSYSTEM_EFI_APPLICATION     10
>> diff --git a/lib/efi_loader/efi_image_loader.c 
>> b/lib/efi_loader/efi_image_loader.c
>> index f588576..ac20488 100644
>> --- a/lib/efi_loader/efi_image_loader.c
>> +++ b/lib/efi_loader/efi_image_loader.c
>> @@ -172,14 +172,6 @@ void *efi_load_pe(void *efi, struct efi_loaded_image 
>> *loaded_image_info)
>>      void *entry;
>>      uint64_t image_size;
>>      unsigned long virt_size = 0;
>> -    bool can_run_nt64 = true;
>> -    bool can_run_nt32 = true;
>> -
>> -#if defined(CONFIG_ARM64)
>> -    can_run_nt32 = false;
>> -#elif defined(CONFIG_ARM)
>> -    can_run_nt64 = false;
>> -#endif
>>  
>>      dos = efi;
>>      if (dos->e_magic != IMAGE_DOS_SIGNATURE) {
>> @@ -193,6 +185,16 @@ void *efi_load_pe(void *efi, struct efi_loaded_image 
>> *loaded_image_info)
>>              return NULL;
>>      }
>>  
>> +#ifdef TARGET_PE_MACHINE_TYPE
> 
> I don't think we should have the #ifdef here. Let' make sure we always
> know which platform we want to run on.
> 
> 
> Alex
> 
>> +
>> +    if (nt->FileHeader.Machine != TARGET_PE_MACHINE_TYPE) {
>> +            printf("%s: Machine type 0x%04x is not supported\n",
>> +                   __func__, nt->FileHeader.Machine);
>> +            return NULL;
>> +    }
>> +
>> +#endif
>> +
>>      /* Calculate upper virtual address boundary */
>>      num_sections = nt->FileHeader.NumberOfSections;
>>      sections = (void *)&nt->OptionalHeader +
>> @@ -205,8 +207,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image 
>> *loaded_image_info)
>>      }
>>  
>>      /* Read 32/64bit specific header bits */
>> -    if (can_run_nt64 &&
>> -        (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)) {
>> +    if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
>>              IMAGE_NT_HEADERS64 *nt64 = (void *)nt;
>>              IMAGE_OPTIONAL_HEADER64 *opt = &nt64->OptionalHeader;
>>              image_size = opt->SizeOfImage;
>> @@ -222,8 +223,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image 
>> *loaded_image_info)
>>              rel_size = opt->DataDirectory[rel_idx].Size;
>>              rel = efi_reloc + opt->DataDirectory[rel_idx].VirtualAddress;
>>              virt_size = ALIGN(virt_size, opt->SectionAlignment);
>> -    } else if (can_run_nt32 &&
>> -               (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)) 
>> {
>> +    } else if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
>>              IMAGE_OPTIONAL_HEADER32 *opt = &nt->OptionalHeader;
>>              image_size = opt->SizeOfImage;
>>              efi_set_code_and_data_type(loaded_image_info, opt->Subsystem);
>>
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to