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:
parent
73c0a766ff
commit
b04ab8dd8a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue