[PATCH v4] drivers/misc: vm_gen_counter: initial driver implementation
From: Or IdgarThis patch is a driver which expose the Virtual Machine Generation ID via sysfs. The ID is a UUID value used to differentiate between virtual machines. The VM-Generation ID is a feature defined by Microsoft (paper: http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple hypervisor vendors. Signed-off-by: Or Idgar --- Changes in v4: - variable phy_addr changed to phys_addr (nit) - using iomem functions to support arch portability Documentation/ABI/testing/sysfs-hypervisor | 13 +++ drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/vmgenid.c | 142 + 4 files changed, 162 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-hypervisor create mode 100644 drivers/misc/vmgenid.c diff --git a/Documentation/ABI/testing/sysfs-hypervisor b/Documentation/ABI/testing/sysfs-hypervisor new file mode 100644 index ..2f9a7b8eab70 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-hypervisor @@ -0,0 +1,13 @@ +What: /sys/hypervisor/vm_gen_counter +Date: February 2018 +Contact: Or Idgar + Gal Hammer +Description: Expose the virtual machine generation ID. The directory + contains two files: "generation_id" and "raw". Both files + represent the same information. + + "generation_id" file is a UUID string + representation. + + "raw" file is a 128-bit integer + representation (binary). diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 03605f8fc0dc..5a74802bdfb4 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -500,6 +500,12 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config VMGENID + tristate "Virtual Machine Generation ID driver" + help + This is a Virtual Machine Generation ID driver which provides + a virtual machine unique identifier. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index c3c8624f4d95..067aa666bb6a 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX)+= cardreader/ +obj-$(CONFIG_VMGENID) += vmgenid.o lkdtm-$(CONFIG_LKDTM) += lkdtm_core.o lkdtm-$(CONFIG_LKDTM) += lkdtm_bugs.o diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c new file mode 100644 index ..6c8d8fe75335 --- /dev/null +++ b/drivers/misc/vmgenid.c @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Virtual Machine Generation ID driver + * + * Copyright (C) 2018 Red Hat, Inc. All rights reserved. + * Authors: + * Or Idgar + * Gal Hammer + * + */ +#include +#include +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Or Idgar "); +MODULE_AUTHOR("Gal Hammer "); +MODULE_DESCRIPTION("Virtual Machine Generation ID"); +MODULE_VERSION("0.1"); + +ACPI_MODULE_NAME("vmgenid"); + +static u64 phys_addr; + +static ssize_t generation_id_show(struct device *_d, + struct device_attribute *attr, char *buf) +{ + void __iomem *uuid_map; + uuid_t uuid; + ssize_t result; + + uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t)); + if (!uuid_map) + return -EFAULT; + + memcpy_fromio(, uuid_map, sizeof(uuid_t)); + result = sprintf(buf, "%pUl\n", ); + acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t)); + return result; +} +static DEVICE_ATTR_RO(generation_id); + +static ssize_t raw_show(struct device *_d, + struct device_attribute *attr, + char *buf) +{ + void __iomem *uuid_map; + + uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t)); + if (!uuid_map) + return -EFAULT; + memcpy_fromio(buf, uuid_map, sizeof(uuid_t)); + acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t)); + return sizeof(uuid_t); +} +static DEVICE_ATTR_RO(raw); + +static struct attribute *vmgenid_attrs[] = { + _attr_generation_id.attr, + _attr_raw.attr, + NULL, +}; +static const struct attribute_group vmgenid_group = { + .name = "vm_gen_counter", + .attrs = vmgenid_attrs, +}; + +static int get_vmgenid(acpi_handle handle) +{ + int i; + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + acpi_status status; + union acpi_object *pss; +
[PATCH v4] drivers/misc: vm_gen_counter: initial driver implementation
From: Or Idgar This patch is a driver which expose the Virtual Machine Generation ID via sysfs. The ID is a UUID value used to differentiate between virtual machines. The VM-Generation ID is a feature defined by Microsoft (paper: http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple hypervisor vendors. Signed-off-by: Or Idgar --- Changes in v4: - variable phy_addr changed to phys_addr (nit) - using iomem functions to support arch portability Documentation/ABI/testing/sysfs-hypervisor | 13 +++ drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/vmgenid.c | 142 + 4 files changed, 162 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-hypervisor create mode 100644 drivers/misc/vmgenid.c diff --git a/Documentation/ABI/testing/sysfs-hypervisor b/Documentation/ABI/testing/sysfs-hypervisor new file mode 100644 index ..2f9a7b8eab70 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-hypervisor @@ -0,0 +1,13 @@ +What: /sys/hypervisor/vm_gen_counter +Date: February 2018 +Contact: Or Idgar + Gal Hammer +Description: Expose the virtual machine generation ID. The directory + contains two files: "generation_id" and "raw". Both files + represent the same information. + + "generation_id" file is a UUID string + representation. + + "raw" file is a 128-bit integer + representation (binary). diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 03605f8fc0dc..5a74802bdfb4 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -500,6 +500,12 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config VMGENID + tristate "Virtual Machine Generation ID driver" + help + This is a Virtual Machine Generation ID driver which provides + a virtual machine unique identifier. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index c3c8624f4d95..067aa666bb6a 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX)+= cardreader/ +obj-$(CONFIG_VMGENID) += vmgenid.o lkdtm-$(CONFIG_LKDTM) += lkdtm_core.o lkdtm-$(CONFIG_LKDTM) += lkdtm_bugs.o diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c new file mode 100644 index ..6c8d8fe75335 --- /dev/null +++ b/drivers/misc/vmgenid.c @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Virtual Machine Generation ID driver + * + * Copyright (C) 2018 Red Hat, Inc. All rights reserved. + * Authors: + * Or Idgar + * Gal Hammer + * + */ +#include +#include +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Or Idgar "); +MODULE_AUTHOR("Gal Hammer "); +MODULE_DESCRIPTION("Virtual Machine Generation ID"); +MODULE_VERSION("0.1"); + +ACPI_MODULE_NAME("vmgenid"); + +static u64 phys_addr; + +static ssize_t generation_id_show(struct device *_d, + struct device_attribute *attr, char *buf) +{ + void __iomem *uuid_map; + uuid_t uuid; + ssize_t result; + + uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t)); + if (!uuid_map) + return -EFAULT; + + memcpy_fromio(, uuid_map, sizeof(uuid_t)); + result = sprintf(buf, "%pUl\n", ); + acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t)); + return result; +} +static DEVICE_ATTR_RO(generation_id); + +static ssize_t raw_show(struct device *_d, + struct device_attribute *attr, + char *buf) +{ + void __iomem *uuid_map; + + uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t)); + if (!uuid_map) + return -EFAULT; + memcpy_fromio(buf, uuid_map, sizeof(uuid_t)); + acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t)); + return sizeof(uuid_t); +} +static DEVICE_ATTR_RO(raw); + +static struct attribute *vmgenid_attrs[] = { + _attr_generation_id.attr, + _attr_raw.attr, + NULL, +}; +static const struct attribute_group vmgenid_group = { + .name = "vm_gen_counter", + .attrs = vmgenid_attrs, +}; + +static int get_vmgenid(acpi_handle handle) +{ + int i; + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + acpi_status status; + union acpi_object *pss; + union acpi_object *element; + + status = acpi_evaluate_object(handle, "ADDR", NULL, ); + if (ACPI_FAILURE(status)) { +