提交 3fb32794 编写于 作者: J James Morse 提交者: Yang Yingliang

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: NJames Morse <james.morse@arm.com>
Signed-off-by: NWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-By: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 4cde2252
......@@ -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)
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册