Fix cpuid test failure on HyperEnclave
This commit is contained in:
		
							parent
							
								
									78ef07cbb4
								
							
						
					
					
						commit
						72aaa47445
					
				| @ -28,7 +28,8 @@ static inline void native_cpuid(int leaf, int subleaf, t_cpuid_t *p) { | |||||||
|                  : "a" (leaf), "c" (subleaf)); |                  : "a" (leaf), "c" (subleaf)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool is_cpuidinfo_equal(int leaf, t_cpuid_t *cpu, t_cpuid_t *cpu_sgx) { | static bool is_cpuidinfo_equal_with_host(uint32_t leaf, uint32_t subleaf, t_cpuid_t *cpu, | ||||||
|  |         t_cpuid_t *cpu_sgx) { | ||||||
|     /* Leaf 01H CPUID.EBX is related with logical processor. */ |     /* Leaf 01H CPUID.EBX is related with logical processor. */ | ||||||
|     if (leaf == 1) { |     if (leaf == 1) { | ||||||
|         return ((cpu->eax == cpu_sgx->eax) && |         return ((cpu->eax == cpu_sgx->eax) && | ||||||
| @ -41,6 +42,15 @@ static bool is_cpuidinfo_equal(int leaf, t_cpuid_t *cpu, t_cpuid_t *cpu_sgx) { | |||||||
|                 (cpu->ebx == cpu_sgx->ebx) && |                 (cpu->ebx == cpu_sgx->ebx) && | ||||||
|                 (cpu->ecx == cpu_sgx->ecx)); |                 (cpu->ecx == cpu_sgx->ecx)); | ||||||
|     } |     } | ||||||
|  |     /* Leaf 0DH subleaf 0x0/0x1, CPUID.EBX is related with the size of XSAVE based on enabled features in XCR0, e.g. PKU.
 | ||||||
|  |        And can be different for host OS and enclave. For SGX platform, it is fine because CPUID is executed via host ocall. | ||||||
|  |        However, for HyperEnclave, CPUID is trapped by hypervisor and return the exact value based on the actual | ||||||
|  |        enabled features of the enclave. And can be different from host Linux. Thus skip the check of EBX. */ | ||||||
|  |     if (leaf == 0xd && (subleaf == 0x0 || subleaf == 0x1)) { | ||||||
|  |         return ((cpu->eax == cpu_sgx->eax) && | ||||||
|  |                 (cpu->ecx == cpu_sgx->ecx) && | ||||||
|  |                 (cpu->edx == cpu_sgx->edx)); | ||||||
|  |     } | ||||||
|     /* Leaf 0x8000001E is for threads/core_id/apic_ids/socket_id */ |     /* Leaf 0x8000001E is for threads/core_id/apic_ids/socket_id */ | ||||||
|     if (leaf == 0x8000001E) { |     if (leaf == 0x8000001E) { | ||||||
|         return cpu->edx == cpu_sgx->edx; |         return cpu->edx == cpu_sgx->edx; | ||||||
| @ -271,7 +281,7 @@ static int test_cpuid_with_host_cpuidinfo() { | |||||||
|         } |         } | ||||||
|         t_cpuid_t cpu_sgx = {0}; |         t_cpuid_t cpu_sgx = {0}; | ||||||
|         native_cpuid(leaf, subleaf, &cpu_sgx); |         native_cpuid(leaf, subleaf, &cpu_sgx); | ||||||
|         if (!is_cpuidinfo_equal(leaf, &cpu, &cpu_sgx)) { |         if (!is_cpuidinfo_equal_with_host(leaf, subleaf, &cpu, &cpu_sgx)) { | ||||||
|             printf("leaf:0x%x subleaf:0x%x\n", leaf, subleaf); |             printf("leaf:0x%x subleaf:0x%x\n", leaf, subleaf); | ||||||
|             printf("ori_eax:0x%x ori_ebx:0x%x ori_ecx:0x%x ori_edx:0x%x\n", |             printf("ori_eax:0x%x ori_ebx:0x%x ori_ecx:0x%x ori_edx:0x%x\n", | ||||||
|                    cpu.eax, cpu.ebx, cpu.ecx, cpu.edx); |                    cpu.eax, cpu.ebx, cpu.ecx, cpu.edx); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user