|
@@ -32,6 +32,9 @@ struct efi __read_mostly efi = {
|
|
.hcdp = EFI_INVALID_TABLE_ADDR,
|
|
.hcdp = EFI_INVALID_TABLE_ADDR,
|
|
.uga = EFI_INVALID_TABLE_ADDR,
|
|
.uga = EFI_INVALID_TABLE_ADDR,
|
|
.uv_systab = EFI_INVALID_TABLE_ADDR,
|
|
.uv_systab = EFI_INVALID_TABLE_ADDR,
|
|
|
|
+ .fw_vendor = EFI_INVALID_TABLE_ADDR,
|
|
|
|
+ .runtime = EFI_INVALID_TABLE_ADDR,
|
|
|
|
+ .config_table = EFI_INVALID_TABLE_ADDR,
|
|
};
|
|
};
|
|
EXPORT_SYMBOL(efi);
|
|
EXPORT_SYMBOL(efi);
|
|
|
|
|
|
@@ -71,13 +74,49 @@ static ssize_t systab_show(struct kobject *kobj,
|
|
static struct kobj_attribute efi_attr_systab =
|
|
static struct kobj_attribute efi_attr_systab =
|
|
__ATTR(systab, 0400, systab_show, NULL);
|
|
__ATTR(systab, 0400, systab_show, NULL);
|
|
|
|
|
|
|
|
+#define EFI_FIELD(var) efi.var
|
|
|
|
+
|
|
|
|
+#define EFI_ATTR_SHOW(name) \
|
|
|
|
+static ssize_t name##_show(struct kobject *kobj, \
|
|
|
|
+ struct kobj_attribute *attr, char *buf) \
|
|
|
|
+{ \
|
|
|
|
+ return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+EFI_ATTR_SHOW(fw_vendor);
|
|
|
|
+EFI_ATTR_SHOW(runtime);
|
|
|
|
+EFI_ATTR_SHOW(config_table);
|
|
|
|
+
|
|
|
|
+static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
|
|
|
|
+static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
|
|
|
|
+static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
|
|
|
|
+
|
|
static struct attribute *efi_subsys_attrs[] = {
|
|
static struct attribute *efi_subsys_attrs[] = {
|
|
&efi_attr_systab.attr,
|
|
&efi_attr_systab.attr,
|
|
- NULL, /* maybe more in the future? */
|
|
|
|
|
|
+ &efi_attr_fw_vendor.attr,
|
|
|
|
+ &efi_attr_runtime.attr,
|
|
|
|
+ &efi_attr_config_table.attr,
|
|
|
|
+ NULL,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static umode_t efi_attr_is_visible(struct kobject *kobj,
|
|
|
|
+ struct attribute *attr, int n)
|
|
|
|
+{
|
|
|
|
+ umode_t mode = attr->mode;
|
|
|
|
+
|
|
|
|
+ if (attr == &efi_attr_fw_vendor.attr)
|
|
|
|
+ return (efi.fw_vendor == EFI_INVALID_TABLE_ADDR) ? 0 : mode;
|
|
|
|
+ else if (attr == &efi_attr_runtime.attr)
|
|
|
|
+ return (efi.runtime == EFI_INVALID_TABLE_ADDR) ? 0 : mode;
|
|
|
|
+ else if (attr == &efi_attr_config_table.attr)
|
|
|
|
+ return (efi.config_table == EFI_INVALID_TABLE_ADDR) ? 0 : mode;
|
|
|
|
+
|
|
|
|
+ return mode;
|
|
|
|
+}
|
|
|
|
+
|
|
static struct attribute_group efi_subsys_attr_group = {
|
|
static struct attribute_group efi_subsys_attr_group = {
|
|
.attrs = efi_subsys_attrs,
|
|
.attrs = efi_subsys_attrs,
|
|
|
|
+ .is_visible = efi_attr_is_visible,
|
|
};
|
|
};
|
|
|
|
|
|
static struct efivars generic_efivars;
|
|
static struct efivars generic_efivars;
|