fwupd/plugins/cpu/fu-cpu-device.c
Mario Limonciello 983263bc8d cpu: Add support for a security attribute related to Intel TME
This only checks that it was available from the CPU.
To be complete an additional check should be made to show that it
was actually enabled from the firmware.

This will require a kernel modification though because MSR access
will be forbidden from userland while in kernel lockdown.
2020-05-15 07:16:17 -05:00

108 lines
3.2 KiB
C

/*
* Copyright (C) 2019 Mario Limonciello <mario.limonciello@dell.com>
*
* SPDX-License-Identifier: GPL-2+
*/
#include "config.h"
#include "fu-cpu-device.h"
struct _FuCpuDevice {
FuDevice parent_instance;
FuCpuDeviceFlag flags;
};
G_DEFINE_TYPE (FuCpuDevice, fu_cpu_device, FU_TYPE_DEVICE)
gboolean
fu_cpu_device_has_flag (FuCpuDevice *self, FuCpuDeviceFlag flag)
{
return (self->flags & flag) > 0;
}
static void
fu_cpu_device_to_string (FuDevice *device, guint idt, GString *str)
{
FuCpuDevice *self = FU_CPU_DEVICE (device);
fu_common_string_append_kb (str, idt, "HasSHSTK",
fu_cpu_device_has_flag (self, FU_CPU_DEVICE_FLAG_SHSTK));
fu_common_string_append_kb (str, idt, "HasIBT",
fu_cpu_device_has_flag (self, FU_CPU_DEVICE_FLAG_IBT));
fu_common_string_append_kb (str, idt, "HasTME",
fu_cpu_device_has_flag (self, FU_CPU_DEVICE_FLAG_TME));
}
static void
fu_cpu_device_parse_flags (FuCpuDevice *self, const gchar *data)
{
g_auto(GStrv) flags = g_strsplit (data, " ", -1);
for (guint i = 0; flags[i] != NULL; i++) {
if (g_strcmp0 (flags[i], "shstk") == 0)
self->flags |= FU_CPU_DEVICE_FLAG_SHSTK;
if (g_strcmp0 (flags[i], "ibt") == 0)
self->flags |= FU_CPU_DEVICE_FLAG_IBT;
if (g_strcmp0 (flags[i], "tme") == 0)
self->flags |= FU_CPU_DEVICE_FLAG_TME;
}
}
static void
fu_cpu_device_parse_section (FuDevice *dev, const gchar *data)
{
g_auto(GStrv) lines = NULL;
FuCpuDevice *self = FU_CPU_DEVICE (dev);
lines = g_strsplit (data, "\n", 0);
for (guint i = 0; lines[i] != NULL; i++) {
if (g_str_has_prefix (lines[i], "vendor_id")) {
g_auto(GStrv) fields = g_strsplit (lines[i], ":", -1);
if (fields[1] != NULL)
fu_device_set_vendor (dev, g_strchug (fields[1]));
} else if (g_str_has_prefix (lines[i], "model name")) {
g_auto(GStrv) fields = g_strsplit (lines[i], ":", -1);
if (fields[1] != NULL)
fu_device_set_name (dev, g_strchug (fields[1]));
} else if (g_str_has_prefix (lines[i], "microcode")) {
g_auto(GStrv) fields = g_strsplit (lines[i], ":", -1);
if (fields[1] != NULL)
fu_device_set_version (dev, g_strchug (fields[1]));
} else if (g_str_has_prefix (lines[i], "physical id")) {
g_auto(GStrv) fields = g_strsplit (lines[i], ":", -1);
if (fields[1] != NULL) {
g_autofree gchar *tmp = g_strdup_printf ("cpu:%s", g_strchug (fields[1]));
fu_device_set_physical_id (dev, tmp);
}
} else if (g_str_has_prefix (lines[i], "flags")) {
g_auto(GStrv) fields = g_strsplit (lines[i], ":", -1);
if (fields[1] != NULL)
fu_cpu_device_parse_flags (self, fields[1]);
}
}
}
static void
fu_cpu_device_init (FuCpuDevice *self)
{
fu_device_add_guid (FU_DEVICE (self), "cpu");
fu_device_add_flag (FU_DEVICE (self), FWUPD_DEVICE_FLAG_INTERNAL);
fu_device_add_icon (FU_DEVICE (self), "computer");
fu_device_set_version_format (FU_DEVICE (self), FWUPD_VERSION_FORMAT_HEX);
}
static void
fu_cpu_device_class_init (FuCpuDeviceClass *klass)
{
FuDeviceClass *klass_device = FU_DEVICE_CLASS (klass);
klass_device->to_string = fu_cpu_device_to_string;
}
FuCpuDevice *
fu_cpu_device_new (const gchar *section)
{
FuCpuDevice *device = NULL;
device = g_object_new (FU_TYPE_CPU_DEVICE, NULL);
fu_cpu_device_parse_section (FU_DEVICE (device), section);
return device;
}