tbget.c
来自「一个类似windows」· C语言 代码 · 共 609 行 · 第 1/2 页
C
609 行
status = acpi_tb_install_table (table_ptr, &table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
/*
* Create the common FACS pointer table
* (Contains pointers to the original table)
*/
status = acpi_tb_build_common_facs (&table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
/*
* Get the DSDT (We know that the FADT is valid now)
*/
status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xdsdt),
table_ptr, &table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
/* Install the DSDT */
status = acpi_tb_install_table (table_ptr, &table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
/* Dump the DSDT Header */
/* Dump the entire DSDT */
/*
* Initialize the capabilities flags.
* Assumes that platform supports ACPI_MODE since we have tables!
*/
acpi_gbl_system_flags |= acpi_hw_get_mode_capabilities ();
/* Always delete the RSDP mapping, we are done with it */
acpi_tb_delete_acpi_table (ACPI_TABLE_RSDP);
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_tb_verify_rsdp
*
* PARAMETERS: Number_of_tables - Where the table count is placed
*
* RETURN: Status
*
* DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
*
******************************************************************************/
ACPI_STATUS
acpi_tb_verify_rsdp (
ACPI_PHYSICAL_ADDRESS rsdp_physical_address)
{
ACPI_TABLE_DESC table_info;
ACPI_STATUS status;
u8 *table_ptr;
/*
* Obtain access to the RSDP structure
*/
status = acpi_os_map_memory (rsdp_physical_address,
sizeof (RSDP_DESCRIPTOR),
(void **) &table_ptr);
if (ACPI_FAILURE (status)) {
return (status);
}
/*
* The signature and checksum must both be correct
*/
if (STRNCMP ((NATIVE_CHAR *) table_ptr, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {
/* Nope, BAD Signature */
status = AE_BAD_SIGNATURE;
goto cleanup;
}
if (acpi_tb_checksum (table_ptr, RSDP_CHECKSUM_LENGTH) != 0) {
/* Nope, BAD Checksum */
status = AE_BAD_CHECKSUM;
goto cleanup;
}
/* TBD: Check extended checksum if table version >= 2 */
/* The RSDP supplied is OK */
table_info.pointer = (ACPI_TABLE_HEADER *) table_ptr;
table_info.length = sizeof (RSDP_DESCRIPTOR);
table_info.allocation = ACPI_MEM_MAPPED;
table_info.base_pointer = table_ptr;
/* Save the table pointers and allocation info */
status = acpi_tb_init_table_descriptor (ACPI_TABLE_RSDP, &table_info);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
/* Save the RSDP in a global for easy access */
acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) table_info.pointer;
return (status);
/* Error exit */
cleanup:
acpi_os_unmap_memory (table_ptr, sizeof (RSDP_DESCRIPTOR));
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_tb_get_table_rsdt
*
* PARAMETERS: Number_of_tables - Where the table count is placed
*
* RETURN: Status
*
* DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
*
******************************************************************************/
ACPI_STATUS
acpi_tb_get_table_rsdt (
u32 *number_of_tables)
{
ACPI_TABLE_DESC table_info;
ACPI_STATUS status = AE_OK;
ACPI_PHYSICAL_ADDRESS physical_address;
u32 signature_length;
char *table_signature;
/*
* Get the RSDT from the RSDP
*/
/*
* For RSDP revision 0 or 1, we use the RSDT.
* For RSDP revision 2 (and above), we use the XSDT
*/
if (acpi_gbl_RSDP->revision < 2) {
#ifdef _IA64
/* 0.71 RSDP has 64bit Rsdt address field */
physical_address = ((RSDP_DESCRIPTOR_REV071 *)acpi_gbl_RSDP)->rsdt_physical_address;
#else
physical_address = (ACPI_PHYSICAL_ADDRESS) acpi_gbl_RSDP->rsdt_physical_address;
#endif
table_signature = RSDT_SIG;
signature_length = sizeof (RSDT_SIG) -1;
}
else {
physical_address = (ACPI_PHYSICAL_ADDRESS)
ACPI_GET_ADDRESS (acpi_gbl_RSDP->xsdt_physical_address);
table_signature = XSDT_SIG;
signature_length = sizeof (XSDT_SIG) -1;
}
/* Get the RSDT/XSDT */
status = acpi_tb_get_table (physical_address, NULL, &table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
/* Check the RSDT or XSDT signature */
if (STRNCMP ((char *) table_info.pointer, table_signature,
signature_length)) {
/* Invalid RSDT or XSDT signature */
REPORT_ERROR (("Invalid signature where RSDP indicates %s should be located\n",
table_signature));
return (AE_NO_ACPI_TABLES);
}
/* Valid RSDT signature, verify the checksum */
status = acpi_tb_verify_table_checksum (table_info.pointer);
/* Convert and/or copy to an XSDT structure */
status = acpi_tb_convert_to_xsdt (&table_info, number_of_tables);
if (ACPI_FAILURE (status)) {
return (status);
}
/* Save the table pointers and allocation info */
status = acpi_tb_init_table_descriptor (ACPI_TABLE_XSDT, &table_info);
if (ACPI_FAILURE (status)) {
return (status);
}
acpi_gbl_XSDT = (XSDT_DESCRIPTOR *) table_info.pointer;
return (status);
}
/******************************************************************************
*
* FUNCTION: Acpi_tb_get_table_facs
*
* PARAMETERS: *Buffer_ptr - If Buffer_ptr is valid, read data from
* buffer rather than searching memory
* *Table_info - Where the table info is returned
*
* RETURN: Status
*
* DESCRIPTION: Returns a pointer to the FACS as defined in FADT. This
* function assumes the global variable FADT has been
* correctly initialized. The value of FADT->Firmware_ctrl
* into a far pointer which is returned.
*
*****************************************************************************/
ACPI_STATUS
acpi_tb_get_table_facs (
ACPI_TABLE_HEADER *buffer_ptr,
ACPI_TABLE_DESC *table_info)
{
void *table_ptr = NULL;
u32 size;
u8 allocation;
ACPI_STATUS status = AE_OK;
/* Must have a valid FADT pointer */
if (!acpi_gbl_FADT) {
return (AE_NO_ACPI_TABLES);
}
size = sizeof (FACS_DESCRIPTOR);
if (buffer_ptr) {
/*
* Getting table from a file -- allocate a buffer and
* read the table.
*/
table_ptr = acpi_cm_allocate (size);
if(!table_ptr) {
return (AE_NO_MEMORY);
}
MEMCPY (table_ptr, buffer_ptr, size);
/* Save allocation type */
allocation = ACPI_MEM_ALLOCATED;
}
else {
/* Just map the physical memory to our address space */
status = acpi_tb_map_acpi_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xfirmware_ctrl),
&size, &table_ptr);
if (ACPI_FAILURE(status)) {
return (status);
}
/* Save allocation type */
allocation = ACPI_MEM_MAPPED;
}
/* Return values */
table_info->pointer = table_ptr;
table_info->length = size;
table_info->allocation = allocation;
table_info->base_pointer = table_ptr;
return (status);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?