int read_hypervisor_dmi(void) { int rc = HYPER_NONE; uint8_t *buf = NULL; size_t fp = 0; if (sizeof(uint8_t) != 1 || sizeof(uint16_t) != 2 || sizeof(uint32_t) != 4 || '\0' != 0) return rc; rc = hypervisor_decode_sysfw(); if (rc >= 0) return rc; /* First try EFI (ia64, Intel-based Mac) */ switch (address_from_efi(&fp)) { case EFI_NOT_FOUND: goto memory_scan; case EFI_NO_SMBIOS: goto done; } buf = get_mem_chunk(fp, 0x20, _PATH_DEV_MEM); if (!buf) goto done; rc = hypervisor_decode_smbios(buf, _PATH_DEV_MEM); if (rc) goto done; free(buf); buf = NULL; memory_scan: #if defined(__x86_64__) || defined(__i386__) /* Fallback to memory scan (x86, x86_64) */ buf = get_mem_chunk(0xF0000, 0x10000, _PATH_DEV_MEM); if (!buf) goto done; for (fp = 0; fp <= 0xFFF0; fp += 16) { if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0) { rc = hypervisor_decode_smbios(buf + fp, _PATH_DEV_MEM); if (rc == -1) fp += 16; } else if (memcmp(buf + fp, "_DMI_", 5) == 0) rc = hypervisor_decode_legacy(buf + fp, _PATH_DEV_MEM); if (rc >= 0) break; } #endif done: free(buf); return rc; }
int read_hypervisor_dmi(void) { int ret = HYPER_NONE; uint8_t *buf = NULL; size_t fp = 0; if (sizeof(uint8_t) != 1 || sizeof(uint16_t) != 2 || sizeof(uint32_t) != 4 || '\0' != 0) return ret; /* First try EFI (ia64, Intel-based Mac) */ switch (address_from_efi(&fp)) { case EFI_NOT_FOUND: goto memory_scan; case EFI_NO_SMBIOS: goto exit_free; } buf = get_mem_chunk(fp, 0x20, _PATH_DEV_MEM); if (!buf) goto exit_free; if (hypervisor_decode_smbios(buf, _PATH_DEV_MEM)) goto done; memory_scan: /* Fallback to memory scan (x86, x86_64) */ buf = get_mem_chunk(0xF0000, 0x10000, _PATH_DEV_MEM); if (!buf) goto exit_free; for (fp = 0; fp <= 0xFFF0; fp += 16) { if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0) { if ((ret = hypervisor_decode_smbios(buf + fp, _PATH_DEV_MEM)) == -1) fp += 16; } else if (memcmp(buf + fp, "_DMI_", 5) == 0) ret = hypervisor_decode_legacy(buf + fp, _PATH_DEV_MEM); } done: free(buf); exit_free: return ret; }