lscpu-virt: split hypervisor_from_dmi_table()

Split hypervisor_from_dmi_table() to parsing dmi table and checking the
hypervisor vendor.

Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
This commit is contained in:
Masayoshi Mizuma 2020-11-20 00:06:06 -05:00 committed by Karel Zak
parent 73c0a766ff
commit b04ab8dd8a
2 changed files with 40 additions and 20 deletions

View File

@ -76,20 +76,13 @@ nothing:
return NULL; return NULL;
} }
static int hypervisor_from_dmi_table(uint32_t base, uint16_t len, static int parse_dmi_table(uint16_t len, uint16_t num,
uint16_t num, const char *devmem) uint8_t *data,
struct dmi_info *di)
{ {
uint8_t *buf; uint8_t *buf = data;
uint8_t *data; int rc = -1;
int i = 0; int i = 0;
char *vendor = NULL;
char *product = NULL;
char *manufacturer = NULL;
int rc = VIRT_VENDOR_NONE;
data = buf = get_mem_chunk(base, len, devmem);
if (!buf)
goto done;
/* 4 is the length of an SMBIOS structure header */ /* 4 is the length of an SMBIOS structure header */
while (i < num && data + 4 <= buf + len) { while (i < num && data + 4 <= buf + len) {
@ -113,11 +106,11 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
next += 2; next += 2;
switch (h.type) { switch (h.type) {
case 0: case 0:
vendor = dmi_string(&h, data[0x04]); di->vendor = dmi_string(&h, data[0x04]);
break; break;
case 1: case 1:
manufacturer = dmi_string(&h, data[0x04]); di->manufacturer = dmi_string(&h, data[0x04]);
product = dmi_string(&h, data[0x05]); di->product = dmi_string(&h, data[0x05]);
break; break;
default: default:
break; break;
@ -126,15 +119,36 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
data = next; data = next;
i++; i++;
} }
if (manufacturer && !strcmp(manufacturer, "innotek GmbH")) rc = 0;
done:
return rc;
}
static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
uint16_t num, const char *devmem)
{
uint8_t *data;
int rc = VIRT_VENDOR_NONE;
struct dmi_info di;
data = get_mem_chunk(base, len, devmem);
if (!data)
return rc;
memset(&di, 0, sizeof(struct dmi_info));
rc = parse_dmi_table(len, num, data, &di);
if (rc < 0)
goto done;
if (di.manufacturer && !strcmp(di.manufacturer, "innotek GmbH"))
rc = VIRT_VENDOR_INNOTEK; rc = VIRT_VENDOR_INNOTEK;
else if (manufacturer && strstr(manufacturer, "HITACHI") && else if (di.manufacturer && strstr(di.manufacturer, "HITACHI") &&
product && strstr(product, "LPAR")) di.product && strstr(di.product, "LPAR"))
rc = VIRT_VENDOR_HITACHI; rc = VIRT_VENDOR_HITACHI;
else if (vendor && !strcmp(vendor, "Parallels")) else if (di.vendor && !strcmp(di.vendor, "Parallels"))
rc = VIRT_VENDOR_PARALLELS; rc = VIRT_VENDOR_PARALLELS;
done: done:
free(buf); free(data);
return rc; return rc;
} }

View File

@ -305,6 +305,12 @@ struct lscpu_dmi_header
uint8_t *data; uint8_t *data;
}; };
struct dmi_info {
char *vendor;
char *product;
char *manufacturer;
};
static inline void to_dmi_header(struct lscpu_dmi_header *h, uint8_t *data) static inline void to_dmi_header(struct lscpu_dmi_header *h, uint8_t *data)
{ {
h->type = data[0]; h->type = data[0];