Commit 3fb32794 authored by James Morse's avatar James Morse Committed by Yang Yingliang
Browse files

ACPI / PPTT: Add helper to validate cache nodes from an offset [dead]



hulk inclusion
category: feature
bugzilla: 28055
CVE: NA

------------------------------

The MPAM table holds a PPTT-offset that describes a cache. Add a
helper acpi_pptt_validate_cache_node(), which checks this offset
really is in the PPTT, on a node boundary, and that node really
is a cache.

With this the MPAM probe code can go poking through struct cacheinfo
looking for a level with a matching firmware_node.

Signed-off-by: default avatarJames Morse <james.morse@arm.com>
Signed-off-by: default avatarWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-By: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent 4cde2252
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -276,6 +276,44 @@ static struct acpi_pptt_processor *acpi_find_processor_node(struct acpi_table_he

	return NULL;
}
/**
 * acpi_validate_cache_node() - Given an offset in the table, check this is
 * a cache node.
 * Used for cross-table pointers.
 *
 * Return the cache pointer for a valid cache, or NULL.
 */
struct acpi_pptt_cache *
acpi_pptt_validate_cache_node(struct acpi_table_header *table_hdr, u32 offset)
{
	struct acpi_subtable_header *entry, *cache;
	unsigned long table_end;

	if ((offset < sizeof(*table_hdr)) || (offset >= table_hdr->length))
		return NULL;

	table_end = (unsigned long)table_hdr + table_hdr->length;
	entry = ACPI_ADD_PTR(struct acpi_subtable_header, table_hdr,
			     sizeof(struct acpi_table_pptt));

	cache = ACPI_ADD_PTR(struct acpi_subtable_header, table_hdr, offset);

	/* Walk every node to check offset is on a node boundary */
	while ((unsigned long)(entry + 1) < table_end) {
		if (entry->length == 0) {
			pr_err("Invalid zero length subtable\n");
			break;
		}
		if ((entry->type == ACPI_PPTT_TYPE_CACHE) && (entry == cache))
			return (struct acpi_pptt_cache *)entry;

		entry = ACPI_ADD_PTR(struct acpi_subtable_header, entry,
				     entry->length);
	}

	return NULL;
}


static int acpi_find_cache_levels(struct acpi_table_header *table_hdr,
				  u32 acpi_cpu_id)
+4 −0
Original line number Diff line number Diff line
@@ -638,6 +638,10 @@ static inline u64 acpi_arch_get_root_pointer(void)
}
#endif

struct acpi_pptt_cache *
acpi_pptt_validate_cache_node(struct acpi_table_header *table_hdr,
						u32 offset);

#else	/* !CONFIG_ACPI */

#define acpi_disabled 1