mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
5d6e59665d
ACPICA commit dfa3feffa8f760b686207d09dc880cd2f26c72af Currently the pointer to the table is cast to acpi_physical_address and later cast back to a pointer to be dereferenced. Whether or not this is supported is implementation-defined. On CHERI, and thus Arm's experimental Morello prototype architecture, pointers are represented as capabilities, which are unforgeable bounded pointers, providing always-on fine-grained spatial memory safety. This means that any pointer cast to a plain integer will lose all its associated metadata, and when cast back to a pointer it will give a null-derived pointer (one that has the same metadata as null but an address equal to the integer) that will trap on any dereference. As a result, this is an implementation where acpi_physical_address cannot be used as a hack to store real pointers. Thus, alter the lifecycle of table descriptors. Internal physical tables keep the current behaviour where only the address is set on install, and the pointer is set on acquire. Virtual tables (internal and external) now store the pointer on initialisation and use that on acquire (which will redundantly set *table_ptr to itself, but changing that is both unnecessary and overly complicated as acpi_tb_acquire_table is called with both a pointer to a variable and a pointer to Table->Pointer itself). This requires propagating the (possible) table pointer everywhere in order to make sure pointers make it through to acpi_tb_acquire_temp_table, which requires a change to the acpi_install_table interface. Instead of taking an ACPI_PHYSADDR_TYPE and a boolean indicating whether it's physical or virtual, it is now split into acpi_install_table (that takes an external virtual table pointer) and acpi_install_physical_table (that takes an ACPI_PHYSADDR_TYPE for an internal physical table address). This also has the benefit of providing a cleaner API. Link: https://github.com/acpica/acpica/commit/dfa3feff Signed-off-by: Bob Moore <robert.moore@intel.com> [ rjw: Adjust the code in tables.c to match interface changes ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
153 lines
4.1 KiB
C
153 lines
4.1 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
|
/******************************************************************************
|
|
*
|
|
* Name: actables.h - ACPI table management
|
|
*
|
|
* Copyright (C) 2000 - 2021, Intel Corp.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef __ACTABLES_H__
|
|
#define __ACTABLES_H__
|
|
|
|
acpi_status acpi_allocate_root_table(u32 initial_table_count);
|
|
|
|
/*
|
|
* tbxfroot - Root pointer utilities
|
|
*/
|
|
u32 acpi_tb_get_rsdp_length(struct acpi_table_rsdp *rsdp);
|
|
|
|
acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp);
|
|
|
|
u8 *acpi_tb_scan_memory_for_rsdp(u8 *start_address, u32 length);
|
|
|
|
/*
|
|
* tbdata - table data structure management
|
|
*/
|
|
acpi_status
|
|
acpi_tb_get_next_table_descriptor(u32 *table_index,
|
|
struct acpi_table_desc **table_desc);
|
|
|
|
void
|
|
acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
|
|
acpi_physical_address address,
|
|
u8 flags, struct acpi_table_header *table);
|
|
|
|
acpi_status
|
|
acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
|
|
acpi_physical_address address,
|
|
u8 flags, struct acpi_table_header *table);
|
|
|
|
void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc);
|
|
|
|
acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc);
|
|
|
|
acpi_status
|
|
acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc,
|
|
char *signature, u32 *table_index);
|
|
|
|
u8 acpi_tb_is_table_loaded(u32 table_index);
|
|
|
|
void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
|
|
|
|
/*
|
|
* tbfadt - FADT parse/convert/validate
|
|
*/
|
|
void acpi_tb_parse_fadt(void);
|
|
|
|
void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);
|
|
|
|
/*
|
|
* tbfind - find ACPI table
|
|
*/
|
|
acpi_status
|
|
acpi_tb_find_table(char *signature,
|
|
char *oem_id, char *oem_table_id, u32 *table_index);
|
|
|
|
/*
|
|
* tbinstal - Table removal and deletion
|
|
*/
|
|
acpi_status acpi_tb_resize_root_table_list(void);
|
|
|
|
acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc);
|
|
|
|
void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc);
|
|
|
|
void acpi_tb_override_table(struct acpi_table_desc *old_table_desc);
|
|
|
|
acpi_status
|
|
acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
|
|
struct acpi_table_header **table_ptr,
|
|
u32 *table_length, u8 *table_flags);
|
|
|
|
void
|
|
acpi_tb_release_table(struct acpi_table_header *table,
|
|
u32 table_length, u8 table_flags);
|
|
|
|
acpi_status
|
|
acpi_tb_install_standard_table(acpi_physical_address address,
|
|
u8 flags,
|
|
struct acpi_table_header *table,
|
|
u8 reload, u8 override, u32 *table_index);
|
|
|
|
void acpi_tb_uninstall_table(struct acpi_table_desc *table_desc);
|
|
|
|
acpi_status
|
|
acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node);
|
|
|
|
acpi_status
|
|
acpi_tb_install_and_load_table(acpi_physical_address address,
|
|
u8 flags,
|
|
struct acpi_table_header *table,
|
|
u8 override, u32 *table_index);
|
|
|
|
acpi_status acpi_tb_unload_table(u32 table_index);
|
|
|
|
void acpi_tb_notify_table(u32 event, void *table);
|
|
|
|
void acpi_tb_terminate(void);
|
|
|
|
acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index);
|
|
|
|
acpi_status acpi_tb_allocate_owner_id(u32 table_index);
|
|
|
|
acpi_status acpi_tb_release_owner_id(u32 table_index);
|
|
|
|
acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id);
|
|
|
|
/*
|
|
* tbutils - table manager utilities
|
|
*/
|
|
acpi_status acpi_tb_initialize_facs(void);
|
|
|
|
void
|
|
acpi_tb_print_table_header(acpi_physical_address address,
|
|
struct acpi_table_header *header);
|
|
|
|
u8 acpi_tb_checksum(u8 *buffer, u32 length);
|
|
|
|
acpi_status
|
|
acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length);
|
|
|
|
void acpi_tb_check_dsdt_header(void);
|
|
|
|
struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index);
|
|
|
|
void
|
|
acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
|
|
u8 override, u32 *table_index);
|
|
|
|
acpi_status acpi_tb_parse_root_table(acpi_physical_address rsdp_address);
|
|
|
|
acpi_status
|
|
acpi_tb_get_table(struct acpi_table_desc *table_desc,
|
|
struct acpi_table_header **out_table);
|
|
|
|
void acpi_tb_put_table(struct acpi_table_desc *table_desc);
|
|
|
|
/*
|
|
* tbxfload
|
|
*/
|
|
acpi_status acpi_tb_load_namespace(void);
|
|
|
|
#endif /* __ACTABLES_H__ */
|