static u32 __initdata efi_dmi_address;
static u32 __initdata efi_dmi_size;
+static u32 __initdata efi_smbios_address;
+static u32 __initdata efi_smbios_size;
static u64 __initdata efi_smbios3_address;
static u32 __initdata efi_smbios3_size;
const struct smbios_eps *eps = smbios;
const struct smbios3_eps *eps3 = smbios3;
- if (eps3 && memcmp(eps3->anchor, "_SM3_", 5) &&
+ if (eps3 && memcmp(eps3->anchor, "_SM3_", 5) == 0 &&
eps3->length >= sizeof(*eps3) &&
dmi_checksum(eps3, eps3->length)) {
efi_smbios3_address = eps3->address;
return;
}
- if (eps && memcmp(eps->anchor, "_SM_", 4) &&
+ if (eps && memcmp(eps->anchor, "_SM_", 4) == 0 &&
eps->length >= sizeof(*eps) &&
- dmi_checksum(eps, eps->length) &&
- memcmp(eps->dmi.anchor, "_DMI_", 5) == 0 &&
- dmi_checksum(&eps->dmi, sizeof(eps->dmi))) {
- efi_dmi_address = eps->dmi.address;
- efi_dmi_size = eps->dmi.size;
+ dmi_checksum(eps, eps->length)) {
+ efi_smbios_address = (u32)(long)eps;
+ efi_smbios_size = eps->length;
+
+ if (memcmp(eps->dmi.anchor, "_DMI_", 5) == 0 &&
+ dmi_checksum(&eps->dmi, sizeof(eps->dmi))) {
+ efi_dmi_address = eps->dmi.address;
+ efi_dmi_size = eps->dmi.size;
+ }
}
}
instance |= 2;
return "DMI";
}
+ if (efi_smbios_size && !(instance & 4)) {
+ *base = efi_smbios_address;
+ *len = efi_smbios_size;
+ instance |= 4;
+ return "SMBIOS";
+ }
} else {
char __iomem *p = maddr_to_virt(0xF0000), *q;
union {