cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dmi_scan.c (29776B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2#include <linux/types.h>
      3#include <linux/string.h>
      4#include <linux/init.h>
      5#include <linux/module.h>
      6#include <linux/ctype.h>
      7#include <linux/dmi.h>
      8#include <linux/efi.h>
      9#include <linux/memblock.h>
     10#include <linux/random.h>
     11#include <asm/dmi.h>
     12#include <asm/unaligned.h>
     13
     14#ifndef SMBIOS_ENTRY_POINT_SCAN_START
     15#define SMBIOS_ENTRY_POINT_SCAN_START 0xF0000
     16#endif
     17
     18struct kobject *dmi_kobj;
     19EXPORT_SYMBOL_GPL(dmi_kobj);
     20
     21/*
     22 * DMI stands for "Desktop Management Interface".  It is part
     23 * of and an antecedent to, SMBIOS, which stands for System
     24 * Management BIOS.  See further: https://www.dmtf.org/standards
     25 */
     26static const char dmi_empty_string[] = "";
     27
     28static u32 dmi_ver __initdata;
     29static u32 dmi_len;
     30static u16 dmi_num;
     31static u8 smbios_entry_point[32];
     32static int smbios_entry_point_size;
     33
     34/* DMI system identification string used during boot */
     35static char dmi_ids_string[128] __initdata;
     36
     37static struct dmi_memdev_info {
     38	const char *device;
     39	const char *bank;
     40	u64 size;		/* bytes */
     41	u16 handle;
     42	u8 type;		/* DDR2, DDR3, DDR4 etc */
     43} *dmi_memdev;
     44static int dmi_memdev_nr;
     45
     46static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
     47{
     48	const u8 *bp = ((u8 *) dm) + dm->length;
     49	const u8 *nsp;
     50
     51	if (s) {
     52		while (--s > 0 && *bp)
     53			bp += strlen(bp) + 1;
     54
     55		/* Strings containing only spaces are considered empty */
     56		nsp = bp;
     57		while (*nsp == ' ')
     58			nsp++;
     59		if (*nsp != '\0')
     60			return bp;
     61	}
     62
     63	return dmi_empty_string;
     64}
     65
     66static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
     67{
     68	const char *bp = dmi_string_nosave(dm, s);
     69	char *str;
     70	size_t len;
     71
     72	if (bp == dmi_empty_string)
     73		return dmi_empty_string;
     74
     75	len = strlen(bp) + 1;
     76	str = dmi_alloc(len);
     77	if (str != NULL)
     78		strcpy(str, bp);
     79
     80	return str;
     81}
     82
     83/*
     84 *	We have to be cautious here. We have seen BIOSes with DMI pointers
     85 *	pointing to completely the wrong place for example
     86 */
     87static void dmi_decode_table(u8 *buf,
     88			     void (*decode)(const struct dmi_header *, void *),
     89			     void *private_data)
     90{
     91	u8 *data = buf;
     92	int i = 0;
     93
     94	/*
     95	 * Stop when we have seen all the items the table claimed to have
     96	 * (SMBIOS < 3.0 only) OR we reach an end-of-table marker (SMBIOS
     97	 * >= 3.0 only) OR we run off the end of the table (should never
     98	 * happen but sometimes does on bogus implementations.)
     99	 */
    100	while ((!dmi_num || i < dmi_num) &&
    101	       (data - buf + sizeof(struct dmi_header)) <= dmi_len) {
    102		const struct dmi_header *dm = (const struct dmi_header *)data;
    103
    104		/*
    105		 *  We want to know the total length (formatted area and
    106		 *  strings) before decoding to make sure we won't run off the
    107		 *  table in dmi_decode or dmi_string
    108		 */
    109		data += dm->length;
    110		while ((data - buf < dmi_len - 1) && (data[0] || data[1]))
    111			data++;
    112		if (data - buf < dmi_len - 1)
    113			decode(dm, private_data);
    114
    115		data += 2;
    116		i++;
    117
    118		/*
    119		 * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
    120		 * For tables behind a 64-bit entry point, we have no item
    121		 * count and no exact table length, so stop on end-of-table
    122		 * marker. For tables behind a 32-bit entry point, we have
    123		 * seen OEM structures behind the end-of-table marker on
    124		 * some systems, so don't trust it.
    125		 */
    126		if (!dmi_num && dm->type == DMI_ENTRY_END_OF_TABLE)
    127			break;
    128	}
    129
    130	/* Trim DMI table length if needed */
    131	if (dmi_len > data - buf)
    132		dmi_len = data - buf;
    133}
    134
    135static phys_addr_t dmi_base;
    136
    137static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,
    138		void *))
    139{
    140	u8 *buf;
    141	u32 orig_dmi_len = dmi_len;
    142
    143	buf = dmi_early_remap(dmi_base, orig_dmi_len);
    144	if (buf == NULL)
    145		return -ENOMEM;
    146
    147	dmi_decode_table(buf, decode, NULL);
    148
    149	add_device_randomness(buf, dmi_len);
    150
    151	dmi_early_unmap(buf, orig_dmi_len);
    152	return 0;
    153}
    154
    155static int __init dmi_checksum(const u8 *buf, u8 len)
    156{
    157	u8 sum = 0;
    158	int a;
    159
    160	for (a = 0; a < len; a++)
    161		sum += buf[a];
    162
    163	return sum == 0;
    164}
    165
    166static const char *dmi_ident[DMI_STRING_MAX];
    167static LIST_HEAD(dmi_devices);
    168int dmi_available;
    169EXPORT_SYMBOL_GPL(dmi_available);
    170
    171/*
    172 *	Save a DMI string
    173 */
    174static void __init dmi_save_ident(const struct dmi_header *dm, int slot,
    175		int string)
    176{
    177	const char *d = (const char *) dm;
    178	const char *p;
    179
    180	if (dmi_ident[slot] || dm->length <= string)
    181		return;
    182
    183	p = dmi_string(dm, d[string]);
    184	if (p == NULL)
    185		return;
    186
    187	dmi_ident[slot] = p;
    188}
    189
    190static void __init dmi_save_release(const struct dmi_header *dm, int slot,
    191		int index)
    192{
    193	const u8 *minor, *major;
    194	char *s;
    195
    196	/* If the table doesn't have the field, let's return */
    197	if (dmi_ident[slot] || dm->length < index)
    198		return;
    199
    200	minor = (u8 *) dm + index;
    201	major = (u8 *) dm + index - 1;
    202
    203	/* As per the spec, if the system doesn't support this field,
    204	 * the value is FF
    205	 */
    206	if (*major == 0xFF && *minor == 0xFF)
    207		return;
    208
    209	s = dmi_alloc(8);
    210	if (!s)
    211		return;
    212
    213	sprintf(s, "%u.%u", *major, *minor);
    214
    215	dmi_ident[slot] = s;
    216}
    217
    218static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
    219		int index)
    220{
    221	const u8 *d;
    222	char *s;
    223	int is_ff = 1, is_00 = 1, i;
    224
    225	if (dmi_ident[slot] || dm->length < index + 16)
    226		return;
    227
    228	d = (u8 *) dm + index;
    229	for (i = 0; i < 16 && (is_ff || is_00); i++) {
    230		if (d[i] != 0x00)
    231			is_00 = 0;
    232		if (d[i] != 0xFF)
    233			is_ff = 0;
    234	}
    235
    236	if (is_ff || is_00)
    237		return;
    238
    239	s = dmi_alloc(16*2+4+1);
    240	if (!s)
    241		return;
    242
    243	/*
    244	 * As of version 2.6 of the SMBIOS specification, the first 3 fields of
    245	 * the UUID are supposed to be little-endian encoded.  The specification
    246	 * says that this is the defacto standard.
    247	 */
    248	if (dmi_ver >= 0x020600)
    249		sprintf(s, "%pUl", d);
    250	else
    251		sprintf(s, "%pUb", d);
    252
    253	dmi_ident[slot] = s;
    254}
    255
    256static void __init dmi_save_type(const struct dmi_header *dm, int slot,
    257		int index)
    258{
    259	const u8 *d;
    260	char *s;
    261
    262	if (dmi_ident[slot] || dm->length <= index)
    263		return;
    264
    265	s = dmi_alloc(4);
    266	if (!s)
    267		return;
    268
    269	d = (u8 *) dm + index;
    270	sprintf(s, "%u", *d & 0x7F);
    271	dmi_ident[slot] = s;
    272}
    273
    274static void __init dmi_save_one_device(int type, const char *name)
    275{
    276	struct dmi_device *dev;
    277
    278	/* No duplicate device */
    279	if (dmi_find_device(type, name, NULL))
    280		return;
    281
    282	dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
    283	if (!dev)
    284		return;
    285
    286	dev->type = type;
    287	strcpy((char *)(dev + 1), name);
    288	dev->name = (char *)(dev + 1);
    289	dev->device_data = NULL;
    290	list_add(&dev->list, &dmi_devices);
    291}
    292
    293static void __init dmi_save_devices(const struct dmi_header *dm)
    294{
    295	int i, count = (dm->length - sizeof(struct dmi_header)) / 2;
    296
    297	for (i = 0; i < count; i++) {
    298		const char *d = (char *)(dm + 1) + (i * 2);
    299
    300		/* Skip disabled device */
    301		if ((*d & 0x80) == 0)
    302			continue;
    303
    304		dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d + 1)));
    305	}
    306}
    307
    308static void __init dmi_save_oem_strings_devices(const struct dmi_header *dm)
    309{
    310	int i, count;
    311	struct dmi_device *dev;
    312
    313	if (dm->length < 0x05)
    314		return;
    315
    316	count = *(u8 *)(dm + 1);
    317	for (i = 1; i <= count; i++) {
    318		const char *devname = dmi_string(dm, i);
    319
    320		if (devname == dmi_empty_string)
    321			continue;
    322
    323		dev = dmi_alloc(sizeof(*dev));
    324		if (!dev)
    325			break;
    326
    327		dev->type = DMI_DEV_TYPE_OEM_STRING;
    328		dev->name = devname;
    329		dev->device_data = NULL;
    330
    331		list_add(&dev->list, &dmi_devices);
    332	}
    333}
    334
    335static void __init dmi_save_ipmi_device(const struct dmi_header *dm)
    336{
    337	struct dmi_device *dev;
    338	void *data;
    339
    340	data = dmi_alloc(dm->length);
    341	if (data == NULL)
    342		return;
    343
    344	memcpy(data, dm, dm->length);
    345
    346	dev = dmi_alloc(sizeof(*dev));
    347	if (!dev)
    348		return;
    349
    350	dev->type = DMI_DEV_TYPE_IPMI;
    351	dev->name = "IPMI controller";
    352	dev->device_data = data;
    353
    354	list_add_tail(&dev->list, &dmi_devices);
    355}
    356
    357static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus,
    358					int devfn, const char *name, int type)
    359{
    360	struct dmi_dev_onboard *dev;
    361
    362	/* Ignore invalid values */
    363	if (type == DMI_DEV_TYPE_DEV_SLOT &&
    364	    segment == 0xFFFF && bus == 0xFF && devfn == 0xFF)
    365		return;
    366
    367	dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
    368	if (!dev)
    369		return;
    370
    371	dev->instance = instance;
    372	dev->segment = segment;
    373	dev->bus = bus;
    374	dev->devfn = devfn;
    375
    376	strcpy((char *)&dev[1], name);
    377	dev->dev.type = type;
    378	dev->dev.name = (char *)&dev[1];
    379	dev->dev.device_data = dev;
    380
    381	list_add(&dev->dev.list, &dmi_devices);
    382}
    383
    384static void __init dmi_save_extended_devices(const struct dmi_header *dm)
    385{
    386	const char *name;
    387	const u8 *d = (u8 *)dm;
    388
    389	if (dm->length < 0x0B)
    390		return;
    391
    392	/* Skip disabled device */
    393	if ((d[0x5] & 0x80) == 0)
    394		return;
    395
    396	name = dmi_string_nosave(dm, d[0x4]);
    397	dmi_save_dev_pciaddr(d[0x6], *(u16 *)(d + 0x7), d[0x9], d[0xA], name,
    398			     DMI_DEV_TYPE_DEV_ONBOARD);
    399	dmi_save_one_device(d[0x5] & 0x7f, name);
    400}
    401
    402static void __init dmi_save_system_slot(const struct dmi_header *dm)
    403{
    404	const u8 *d = (u8 *)dm;
    405
    406	/* Need SMBIOS 2.6+ structure */
    407	if (dm->length < 0x11)
    408		return;
    409	dmi_save_dev_pciaddr(*(u16 *)(d + 0x9), *(u16 *)(d + 0xD), d[0xF],
    410			     d[0x10], dmi_string_nosave(dm, d[0x4]),
    411			     DMI_DEV_TYPE_DEV_SLOT);
    412}
    413
    414static void __init count_mem_devices(const struct dmi_header *dm, void *v)
    415{
    416	if (dm->type != DMI_ENTRY_MEM_DEVICE)
    417		return;
    418	dmi_memdev_nr++;
    419}
    420
    421static void __init save_mem_devices(const struct dmi_header *dm, void *v)
    422{
    423	const char *d = (const char *)dm;
    424	static int nr;
    425	u64 bytes;
    426	u16 size;
    427
    428	if (dm->type != DMI_ENTRY_MEM_DEVICE || dm->length < 0x13)
    429		return;
    430	if (nr >= dmi_memdev_nr) {
    431		pr_warn(FW_BUG "Too many DIMM entries in SMBIOS table\n");
    432		return;
    433	}
    434	dmi_memdev[nr].handle = get_unaligned(&dm->handle);
    435	dmi_memdev[nr].device = dmi_string(dm, d[0x10]);
    436	dmi_memdev[nr].bank = dmi_string(dm, d[0x11]);
    437	dmi_memdev[nr].type = d[0x12];
    438
    439	size = get_unaligned((u16 *)&d[0xC]);
    440	if (size == 0)
    441		bytes = 0;
    442	else if (size == 0xffff)
    443		bytes = ~0ull;
    444	else if (size & 0x8000)
    445		bytes = (u64)(size & 0x7fff) << 10;
    446	else if (size != 0x7fff || dm->length < 0x20)
    447		bytes = (u64)size << 20;
    448	else
    449		bytes = (u64)get_unaligned((u32 *)&d[0x1C]) << 20;
    450
    451	dmi_memdev[nr].size = bytes;
    452	nr++;
    453}
    454
    455static void __init dmi_memdev_walk(void)
    456{
    457	if (dmi_walk_early(count_mem_devices) == 0 && dmi_memdev_nr) {
    458		dmi_memdev = dmi_alloc(sizeof(*dmi_memdev) * dmi_memdev_nr);
    459		if (dmi_memdev)
    460			dmi_walk_early(save_mem_devices);
    461	}
    462}
    463
    464/*
    465 *	Process a DMI table entry. Right now all we care about are the BIOS
    466 *	and machine entries. For 2.5 we should pull the smbus controller info
    467 *	out of here.
    468 */
    469static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
    470{
    471	switch (dm->type) {
    472	case 0:		/* BIOS Information */
    473		dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
    474		dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
    475		dmi_save_ident(dm, DMI_BIOS_DATE, 8);
    476		dmi_save_release(dm, DMI_BIOS_RELEASE, 21);
    477		dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23);
    478		break;
    479	case 1:		/* System Information */
    480		dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
    481		dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
    482		dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
    483		dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
    484		dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
    485		dmi_save_ident(dm, DMI_PRODUCT_SKU, 25);
    486		dmi_save_ident(dm, DMI_PRODUCT_FAMILY, 26);
    487		break;
    488	case 2:		/* Base Board Information */
    489		dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
    490		dmi_save_ident(dm, DMI_BOARD_NAME, 5);
    491		dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
    492		dmi_save_ident(dm, DMI_BOARD_SERIAL, 7);
    493		dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8);
    494		break;
    495	case 3:		/* Chassis Information */
    496		dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4);
    497		dmi_save_type(dm, DMI_CHASSIS_TYPE, 5);
    498		dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6);
    499		dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
    500		dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
    501		break;
    502	case 9:		/* System Slots */
    503		dmi_save_system_slot(dm);
    504		break;
    505	case 10:	/* Onboard Devices Information */
    506		dmi_save_devices(dm);
    507		break;
    508	case 11:	/* OEM Strings */
    509		dmi_save_oem_strings_devices(dm);
    510		break;
    511	case 38:	/* IPMI Device Information */
    512		dmi_save_ipmi_device(dm);
    513		break;
    514	case 41:	/* Onboard Devices Extended Information */
    515		dmi_save_extended_devices(dm);
    516	}
    517}
    518
    519static int __init print_filtered(char *buf, size_t len, const char *info)
    520{
    521	int c = 0;
    522	const char *p;
    523
    524	if (!info)
    525		return c;
    526
    527	for (p = info; *p; p++)
    528		if (isprint(*p))
    529			c += scnprintf(buf + c, len - c, "%c", *p);
    530		else
    531			c += scnprintf(buf + c, len - c, "\\x%02x", *p & 0xff);
    532	return c;
    533}
    534
    535static void __init dmi_format_ids(char *buf, size_t len)
    536{
    537	int c = 0;
    538	const char *board;	/* Board Name is optional */
    539
    540	c += print_filtered(buf + c, len - c,
    541			    dmi_get_system_info(DMI_SYS_VENDOR));
    542	c += scnprintf(buf + c, len - c, " ");
    543	c += print_filtered(buf + c, len - c,
    544			    dmi_get_system_info(DMI_PRODUCT_NAME));
    545
    546	board = dmi_get_system_info(DMI_BOARD_NAME);
    547	if (board) {
    548		c += scnprintf(buf + c, len - c, "/");
    549		c += print_filtered(buf + c, len - c, board);
    550	}
    551	c += scnprintf(buf + c, len - c, ", BIOS ");
    552	c += print_filtered(buf + c, len - c,
    553			    dmi_get_system_info(DMI_BIOS_VERSION));
    554	c += scnprintf(buf + c, len - c, " ");
    555	c += print_filtered(buf + c, len - c,
    556			    dmi_get_system_info(DMI_BIOS_DATE));
    557}
    558
    559/*
    560 * Check for DMI/SMBIOS headers in the system firmware image.  Any
    561 * SMBIOS header must start 16 bytes before the DMI header, so take a
    562 * 32 byte buffer and check for DMI at offset 16 and SMBIOS at offset
    563 * 0.  If the DMI header is present, set dmi_ver accordingly (SMBIOS
    564 * takes precedence) and return 0.  Otherwise return 1.
    565 */
    566static int __init dmi_present(const u8 *buf)
    567{
    568	u32 smbios_ver;
    569
    570	if (memcmp(buf, "_SM_", 4) == 0 &&
    571	    buf[5] < 32 && dmi_checksum(buf, buf[5])) {
    572		smbios_ver = get_unaligned_be16(buf + 6);
    573		smbios_entry_point_size = buf[5];
    574		memcpy(smbios_entry_point, buf, smbios_entry_point_size);
    575
    576		/* Some BIOS report weird SMBIOS version, fix that up */
    577		switch (smbios_ver) {
    578		case 0x021F:
    579		case 0x0221:
    580			pr_debug("SMBIOS version fixup (2.%d->2.%d)\n",
    581				 smbios_ver & 0xFF, 3);
    582			smbios_ver = 0x0203;
    583			break;
    584		case 0x0233:
    585			pr_debug("SMBIOS version fixup (2.%d->2.%d)\n", 51, 6);
    586			smbios_ver = 0x0206;
    587			break;
    588		}
    589	} else {
    590		smbios_ver = 0;
    591	}
    592
    593	buf += 16;
    594
    595	if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) {
    596		if (smbios_ver)
    597			dmi_ver = smbios_ver;
    598		else
    599			dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);
    600		dmi_ver <<= 8;
    601		dmi_num = get_unaligned_le16(buf + 12);
    602		dmi_len = get_unaligned_le16(buf + 6);
    603		dmi_base = get_unaligned_le32(buf + 8);
    604
    605		if (dmi_walk_early(dmi_decode) == 0) {
    606			if (smbios_ver) {
    607				pr_info("SMBIOS %d.%d present.\n",
    608					dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
    609			} else {
    610				smbios_entry_point_size = 15;
    611				memcpy(smbios_entry_point, buf,
    612				       smbios_entry_point_size);
    613				pr_info("Legacy DMI %d.%d present.\n",
    614					dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
    615			}
    616			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
    617			pr_info("DMI: %s\n", dmi_ids_string);
    618			return 0;
    619		}
    620	}
    621
    622	return 1;
    623}
    624
    625/*
    626 * Check for the SMBIOS 3.0 64-bit entry point signature. Unlike the legacy
    627 * 32-bit entry point, there is no embedded DMI header (_DMI_) in here.
    628 */
    629static int __init dmi_smbios3_present(const u8 *buf)
    630{
    631	if (memcmp(buf, "_SM3_", 5) == 0 &&
    632	    buf[6] < 32 && dmi_checksum(buf, buf[6])) {
    633		dmi_ver = get_unaligned_be32(buf + 6) & 0xFFFFFF;
    634		dmi_num = 0;			/* No longer specified */
    635		dmi_len = get_unaligned_le32(buf + 12);
    636		dmi_base = get_unaligned_le64(buf + 16);
    637		smbios_entry_point_size = buf[6];
    638		memcpy(smbios_entry_point, buf, smbios_entry_point_size);
    639
    640		if (dmi_walk_early(dmi_decode) == 0) {
    641			pr_info("SMBIOS %d.%d.%d present.\n",
    642				dmi_ver >> 16, (dmi_ver >> 8) & 0xFF,
    643				dmi_ver & 0xFF);
    644			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
    645			pr_info("DMI: %s\n", dmi_ids_string);
    646			return 0;
    647		}
    648	}
    649	return 1;
    650}
    651
    652static void __init dmi_scan_machine(void)
    653{
    654	char __iomem *p, *q;
    655	char buf[32];
    656
    657	if (efi_enabled(EFI_CONFIG_TABLES)) {
    658		/*
    659		 * According to the DMTF SMBIOS reference spec v3.0.0, it is
    660		 * allowed to define both the 64-bit entry point (smbios3) and
    661		 * the 32-bit entry point (smbios), in which case they should
    662		 * either both point to the same SMBIOS structure table, or the
    663		 * table pointed to by the 64-bit entry point should contain a
    664		 * superset of the table contents pointed to by the 32-bit entry
    665		 * point (section 5.2)
    666		 * This implies that the 64-bit entry point should have
    667		 * precedence if it is defined and supported by the OS. If we
    668		 * have the 64-bit entry point, but fail to decode it, fall
    669		 * back to the legacy one (if available)
    670		 */
    671		if (efi.smbios3 != EFI_INVALID_TABLE_ADDR) {
    672			p = dmi_early_remap(efi.smbios3, 32);
    673			if (p == NULL)
    674				goto error;
    675			memcpy_fromio(buf, p, 32);
    676			dmi_early_unmap(p, 32);
    677
    678			if (!dmi_smbios3_present(buf)) {
    679				dmi_available = 1;
    680				return;
    681			}
    682		}
    683		if (efi.smbios == EFI_INVALID_TABLE_ADDR)
    684			goto error;
    685
    686		/* This is called as a core_initcall() because it isn't
    687		 * needed during early boot.  This also means we can
    688		 * iounmap the space when we're done with it.
    689		 */
    690		p = dmi_early_remap(efi.smbios, 32);
    691		if (p == NULL)
    692			goto error;
    693		memcpy_fromio(buf, p, 32);
    694		dmi_early_unmap(p, 32);
    695
    696		if (!dmi_present(buf)) {
    697			dmi_available = 1;
    698			return;
    699		}
    700	} else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) {
    701		p = dmi_early_remap(SMBIOS_ENTRY_POINT_SCAN_START, 0x10000);
    702		if (p == NULL)
    703			goto error;
    704
    705		/*
    706		 * Same logic as above, look for a 64-bit entry point
    707		 * first, and if not found, fall back to 32-bit entry point.
    708		 */
    709		memcpy_fromio(buf, p, 16);
    710		for (q = p + 16; q < p + 0x10000; q += 16) {
    711			memcpy_fromio(buf + 16, q, 16);
    712			if (!dmi_smbios3_present(buf)) {
    713				dmi_available = 1;
    714				dmi_early_unmap(p, 0x10000);
    715				return;
    716			}
    717			memcpy(buf, buf + 16, 16);
    718		}
    719
    720		/*
    721		 * Iterate over all possible DMI header addresses q.
    722		 * Maintain the 32 bytes around q in buf.  On the
    723		 * first iteration, substitute zero for the
    724		 * out-of-range bytes so there is no chance of falsely
    725		 * detecting an SMBIOS header.
    726		 */
    727		memset(buf, 0, 16);
    728		for (q = p; q < p + 0x10000; q += 16) {
    729			memcpy_fromio(buf + 16, q, 16);
    730			if (!dmi_present(buf)) {
    731				dmi_available = 1;
    732				dmi_early_unmap(p, 0x10000);
    733				return;
    734			}
    735			memcpy(buf, buf + 16, 16);
    736		}
    737		dmi_early_unmap(p, 0x10000);
    738	}
    739 error:
    740	pr_info("DMI not present or invalid.\n");
    741}
    742
    743static ssize_t raw_table_read(struct file *file, struct kobject *kobj,
    744			      struct bin_attribute *attr, char *buf,
    745			      loff_t pos, size_t count)
    746{
    747	memcpy(buf, attr->private + pos, count);
    748	return count;
    749}
    750
    751static BIN_ATTR(smbios_entry_point, S_IRUSR, raw_table_read, NULL, 0);
    752static BIN_ATTR(DMI, S_IRUSR, raw_table_read, NULL, 0);
    753
    754static int __init dmi_init(void)
    755{
    756	struct kobject *tables_kobj;
    757	u8 *dmi_table;
    758	int ret = -ENOMEM;
    759
    760	if (!dmi_available)
    761		return 0;
    762
    763	/*
    764	 * Set up dmi directory at /sys/firmware/dmi. This entry should stay
    765	 * even after farther error, as it can be used by other modules like
    766	 * dmi-sysfs.
    767	 */
    768	dmi_kobj = kobject_create_and_add("dmi", firmware_kobj);
    769	if (!dmi_kobj)
    770		goto err;
    771
    772	tables_kobj = kobject_create_and_add("tables", dmi_kobj);
    773	if (!tables_kobj)
    774		goto err;
    775
    776	dmi_table = dmi_remap(dmi_base, dmi_len);
    777	if (!dmi_table)
    778		goto err_tables;
    779
    780	bin_attr_smbios_entry_point.size = smbios_entry_point_size;
    781	bin_attr_smbios_entry_point.private = smbios_entry_point;
    782	ret = sysfs_create_bin_file(tables_kobj, &bin_attr_smbios_entry_point);
    783	if (ret)
    784		goto err_unmap;
    785
    786	bin_attr_DMI.size = dmi_len;
    787	bin_attr_DMI.private = dmi_table;
    788	ret = sysfs_create_bin_file(tables_kobj, &bin_attr_DMI);
    789	if (!ret)
    790		return 0;
    791
    792	sysfs_remove_bin_file(tables_kobj,
    793			      &bin_attr_smbios_entry_point);
    794 err_unmap:
    795	dmi_unmap(dmi_table);
    796 err_tables:
    797	kobject_del(tables_kobj);
    798	kobject_put(tables_kobj);
    799 err:
    800	pr_err("dmi: Firmware registration failed.\n");
    801
    802	return ret;
    803}
    804subsys_initcall(dmi_init);
    805
    806/**
    807 *	dmi_setup - scan and setup DMI system information
    808 *
    809 *	Scan the DMI system information. This setups DMI identifiers
    810 *	(dmi_system_id) for printing it out on task dumps and prepares
    811 *	DIMM entry information (dmi_memdev_info) from the SMBIOS table
    812 *	for using this when reporting memory errors.
    813 */
    814void __init dmi_setup(void)
    815{
    816	dmi_scan_machine();
    817	if (!dmi_available)
    818		return;
    819
    820	dmi_memdev_walk();
    821	dump_stack_set_arch_desc("%s", dmi_ids_string);
    822}
    823
    824/**
    825 *	dmi_matches - check if dmi_system_id structure matches system DMI data
    826 *	@dmi: pointer to the dmi_system_id structure to check
    827 */
    828static bool dmi_matches(const struct dmi_system_id *dmi)
    829{
    830	int i;
    831
    832	for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) {
    833		int s = dmi->matches[i].slot;
    834		if (s == DMI_NONE)
    835			break;
    836		if (s == DMI_OEM_STRING) {
    837			/* DMI_OEM_STRING must be exact match */
    838			const struct dmi_device *valid;
    839
    840			valid = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
    841						dmi->matches[i].substr, NULL);
    842			if (valid)
    843				continue;
    844		} else if (dmi_ident[s]) {
    845			if (dmi->matches[i].exact_match) {
    846				if (!strcmp(dmi_ident[s],
    847					    dmi->matches[i].substr))
    848					continue;
    849			} else {
    850				if (strstr(dmi_ident[s],
    851					   dmi->matches[i].substr))
    852					continue;
    853			}
    854		}
    855
    856		/* No match */
    857		return false;
    858	}
    859	return true;
    860}
    861
    862/**
    863 *	dmi_is_end_of_table - check for end-of-table marker
    864 *	@dmi: pointer to the dmi_system_id structure to check
    865 */
    866static bool dmi_is_end_of_table(const struct dmi_system_id *dmi)
    867{
    868	return dmi->matches[0].slot == DMI_NONE;
    869}
    870
    871/**
    872 *	dmi_check_system - check system DMI data
    873 *	@list: array of dmi_system_id structures to match against
    874 *		All non-null elements of the list must match
    875 *		their slot's (field index's) data (i.e., each
    876 *		list string must be a substring of the specified
    877 *		DMI slot's string data) to be considered a
    878 *		successful match.
    879 *
    880 *	Walk the blacklist table running matching functions until someone
    881 *	returns non zero or we hit the end. Callback function is called for
    882 *	each successful match. Returns the number of matches.
    883 *
    884 *	dmi_setup must be called before this function is called.
    885 */
    886int dmi_check_system(const struct dmi_system_id *list)
    887{
    888	int count = 0;
    889	const struct dmi_system_id *d;
    890
    891	for (d = list; !dmi_is_end_of_table(d); d++)
    892		if (dmi_matches(d)) {
    893			count++;
    894			if (d->callback && d->callback(d))
    895				break;
    896		}
    897
    898	return count;
    899}
    900EXPORT_SYMBOL(dmi_check_system);
    901
    902/**
    903 *	dmi_first_match - find dmi_system_id structure matching system DMI data
    904 *	@list: array of dmi_system_id structures to match against
    905 *		All non-null elements of the list must match
    906 *		their slot's (field index's) data (i.e., each
    907 *		list string must be a substring of the specified
    908 *		DMI slot's string data) to be considered a
    909 *		successful match.
    910 *
    911 *	Walk the blacklist table until the first match is found.  Return the
    912 *	pointer to the matching entry or NULL if there's no match.
    913 *
    914 *	dmi_setup must be called before this function is called.
    915 */
    916const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list)
    917{
    918	const struct dmi_system_id *d;
    919
    920	for (d = list; !dmi_is_end_of_table(d); d++)
    921		if (dmi_matches(d))
    922			return d;
    923
    924	return NULL;
    925}
    926EXPORT_SYMBOL(dmi_first_match);
    927
    928/**
    929 *	dmi_get_system_info - return DMI data value
    930 *	@field: data index (see enum dmi_field)
    931 *
    932 *	Returns one DMI data value, can be used to perform
    933 *	complex DMI data checks.
    934 */
    935const char *dmi_get_system_info(int field)
    936{
    937	return dmi_ident[field];
    938}
    939EXPORT_SYMBOL(dmi_get_system_info);
    940
    941/**
    942 * dmi_name_in_serial - Check if string is in the DMI product serial information
    943 * @str: string to check for
    944 */
    945int dmi_name_in_serial(const char *str)
    946{
    947	int f = DMI_PRODUCT_SERIAL;
    948	if (dmi_ident[f] && strstr(dmi_ident[f], str))
    949		return 1;
    950	return 0;
    951}
    952
    953/**
    954 *	dmi_name_in_vendors - Check if string is in the DMI system or board vendor name
    955 *	@str: Case sensitive Name
    956 */
    957int dmi_name_in_vendors(const char *str)
    958{
    959	static int fields[] = { DMI_SYS_VENDOR, DMI_BOARD_VENDOR, DMI_NONE };
    960	int i;
    961	for (i = 0; fields[i] != DMI_NONE; i++) {
    962		int f = fields[i];
    963		if (dmi_ident[f] && strstr(dmi_ident[f], str))
    964			return 1;
    965	}
    966	return 0;
    967}
    968EXPORT_SYMBOL(dmi_name_in_vendors);
    969
    970/**
    971 *	dmi_find_device - find onboard device by type/name
    972 *	@type: device type or %DMI_DEV_TYPE_ANY to match all device types
    973 *	@name: device name string or %NULL to match all
    974 *	@from: previous device found in search, or %NULL for new search.
    975 *
    976 *	Iterates through the list of known onboard devices. If a device is
    977 *	found with a matching @type and @name, a pointer to its device
    978 *	structure is returned.  Otherwise, %NULL is returned.
    979 *	A new search is initiated by passing %NULL as the @from argument.
    980 *	If @from is not %NULL, searches continue from next device.
    981 */
    982const struct dmi_device *dmi_find_device(int type, const char *name,
    983				    const struct dmi_device *from)
    984{
    985	const struct list_head *head = from ? &from->list : &dmi_devices;
    986	struct list_head *d;
    987
    988	for (d = head->next; d != &dmi_devices; d = d->next) {
    989		const struct dmi_device *dev =
    990			list_entry(d, struct dmi_device, list);
    991
    992		if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) &&
    993		    ((name == NULL) || (strcmp(dev->name, name) == 0)))
    994			return dev;
    995	}
    996
    997	return NULL;
    998}
    999EXPORT_SYMBOL(dmi_find_device);
   1000
   1001/**
   1002 *	dmi_get_date - parse a DMI date
   1003 *	@field:	data index (see enum dmi_field)
   1004 *	@yearp: optional out parameter for the year
   1005 *	@monthp: optional out parameter for the month
   1006 *	@dayp: optional out parameter for the day
   1007 *
   1008 *	The date field is assumed to be in the form resembling
   1009 *	[mm[/dd]]/yy[yy] and the result is stored in the out
   1010 *	parameters any or all of which can be omitted.
   1011 *
   1012 *	If the field doesn't exist, all out parameters are set to zero
   1013 *	and false is returned.  Otherwise, true is returned with any
   1014 *	invalid part of date set to zero.
   1015 *
   1016 *	On return, year, month and day are guaranteed to be in the
   1017 *	range of [0,9999], [0,12] and [0,31] respectively.
   1018 */
   1019bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
   1020{
   1021	int year = 0, month = 0, day = 0;
   1022	bool exists;
   1023	const char *s, *y;
   1024	char *e;
   1025
   1026	s = dmi_get_system_info(field);
   1027	exists = s;
   1028	if (!exists)
   1029		goto out;
   1030
   1031	/*
   1032	 * Determine year first.  We assume the date string resembles
   1033	 * mm/dd/yy[yy] but the original code extracted only the year
   1034	 * from the end.  Keep the behavior in the spirit of no
   1035	 * surprises.
   1036	 */
   1037	y = strrchr(s, '/');
   1038	if (!y)
   1039		goto out;
   1040
   1041	y++;
   1042	year = simple_strtoul(y, &e, 10);
   1043	if (y != e && year < 100) {	/* 2-digit year */
   1044		year += 1900;
   1045		if (year < 1996)	/* no dates < spec 1.0 */
   1046			year += 100;
   1047	}
   1048	if (year > 9999)		/* year should fit in %04d */
   1049		year = 0;
   1050
   1051	/* parse the mm and dd */
   1052	month = simple_strtoul(s, &e, 10);
   1053	if (s == e || *e != '/' || !month || month > 12) {
   1054		month = 0;
   1055		goto out;
   1056	}
   1057
   1058	s = e + 1;
   1059	day = simple_strtoul(s, &e, 10);
   1060	if (s == y || s == e || *e != '/' || day > 31)
   1061		day = 0;
   1062out:
   1063	if (yearp)
   1064		*yearp = year;
   1065	if (monthp)
   1066		*monthp = month;
   1067	if (dayp)
   1068		*dayp = day;
   1069	return exists;
   1070}
   1071EXPORT_SYMBOL(dmi_get_date);
   1072
   1073/**
   1074 *	dmi_get_bios_year - get a year out of DMI_BIOS_DATE field
   1075 *
   1076 *	Returns year on success, -ENXIO if DMI is not selected,
   1077 *	or a different negative error code if DMI field is not present
   1078 *	or not parseable.
   1079 */
   1080int dmi_get_bios_year(void)
   1081{
   1082	bool exists;
   1083	int year;
   1084
   1085	exists = dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
   1086	if (!exists)
   1087		return -ENODATA;
   1088
   1089	return year ? year : -ERANGE;
   1090}
   1091EXPORT_SYMBOL(dmi_get_bios_year);
   1092
   1093/**
   1094 *	dmi_walk - Walk the DMI table and get called back for every record
   1095 *	@decode: Callback function
   1096 *	@private_data: Private data to be passed to the callback function
   1097 *
   1098 *	Returns 0 on success, -ENXIO if DMI is not selected or not present,
   1099 *	or a different negative error code if DMI walking fails.
   1100 */
   1101int dmi_walk(void (*decode)(const struct dmi_header *, void *),
   1102	     void *private_data)
   1103{
   1104	u8 *buf;
   1105
   1106	if (!dmi_available)
   1107		return -ENXIO;
   1108
   1109	buf = dmi_remap(dmi_base, dmi_len);
   1110	if (buf == NULL)
   1111		return -ENOMEM;
   1112
   1113	dmi_decode_table(buf, decode, private_data);
   1114
   1115	dmi_unmap(buf);
   1116	return 0;
   1117}
   1118EXPORT_SYMBOL_GPL(dmi_walk);
   1119
   1120/**
   1121 * dmi_match - compare a string to the dmi field (if exists)
   1122 * @f: DMI field identifier
   1123 * @str: string to compare the DMI field to
   1124 *
   1125 * Returns true if the requested field equals to the str (including NULL).
   1126 */
   1127bool dmi_match(enum dmi_field f, const char *str)
   1128{
   1129	const char *info = dmi_get_system_info(f);
   1130
   1131	if (info == NULL || str == NULL)
   1132		return info == str;
   1133
   1134	return !strcmp(info, str);
   1135}
   1136EXPORT_SYMBOL_GPL(dmi_match);
   1137
   1138void dmi_memdev_name(u16 handle, const char **bank, const char **device)
   1139{
   1140	int n;
   1141
   1142	if (dmi_memdev == NULL)
   1143		return;
   1144
   1145	for (n = 0; n < dmi_memdev_nr; n++) {
   1146		if (handle == dmi_memdev[n].handle) {
   1147			*bank = dmi_memdev[n].bank;
   1148			*device = dmi_memdev[n].device;
   1149			break;
   1150		}
   1151	}
   1152}
   1153EXPORT_SYMBOL_GPL(dmi_memdev_name);
   1154
   1155u64 dmi_memdev_size(u16 handle)
   1156{
   1157	int n;
   1158
   1159	if (dmi_memdev) {
   1160		for (n = 0; n < dmi_memdev_nr; n++) {
   1161			if (handle == dmi_memdev[n].handle)
   1162				return dmi_memdev[n].size;
   1163		}
   1164	}
   1165	return ~0ull;
   1166}
   1167EXPORT_SYMBOL_GPL(dmi_memdev_size);
   1168
   1169/**
   1170 * dmi_memdev_type - get the memory type
   1171 * @handle: DMI structure handle
   1172 *
   1173 * Return the DMI memory type of the module in the slot associated with the
   1174 * given DMI handle, or 0x0 if no such DMI handle exists.
   1175 */
   1176u8 dmi_memdev_type(u16 handle)
   1177{
   1178	int n;
   1179
   1180	if (dmi_memdev) {
   1181		for (n = 0; n < dmi_memdev_nr; n++) {
   1182			if (handle == dmi_memdev[n].handle)
   1183				return dmi_memdev[n].type;
   1184		}
   1185	}
   1186	return 0x0;	/* Not a valid value */
   1187}
   1188EXPORT_SYMBOL_GPL(dmi_memdev_type);
   1189
   1190/**
   1191 *	dmi_memdev_handle - get the DMI handle of a memory slot
   1192 *	@slot: slot number
   1193 *
   1194 *	Return the DMI handle associated with a given memory slot, or %0xFFFF
   1195 *      if there is no such slot.
   1196 */
   1197u16 dmi_memdev_handle(int slot)
   1198{
   1199	if (dmi_memdev && slot >= 0 && slot < dmi_memdev_nr)
   1200		return dmi_memdev[slot].handle;
   1201
   1202	return 0xffff;	/* Not a valid value */
   1203}
   1204EXPORT_SYMBOL_GPL(dmi_memdev_handle);