⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tbxfroot.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
				goto cleanup;			}		}	}	/* Did not find the table */	status = AE_NOT_EXIST;cleanup:	acpi_os_unmap_memory (rsdt_info->pointer, (acpi_size) rsdt_info->pointer->length);	ACPI_MEM_FREE (rsdt_info);	if (header) {		ACPI_MEM_FREE (header);	}	if (table_info) {		ACPI_MEM_FREE (table_info);	}	return_ACPI_STATUS (status);}EXPORT_SYMBOL(acpi_get_firmware_table);/* TBD: Move to a new file */#if ACPI_MACHINE_WIDTH != 16/******************************************************************************* * * FUNCTION:    acpi_find_root_pointer * * PARAMETERS:  **rsdp_address          - Where to place the RSDP address *              Flags                   - Logical/Physical addressing * * RETURN:      Status, Physical address of the RSDP * * DESCRIPTION: Find the RSDP * ******************************************************************************/acpi_statusacpi_find_root_pointer (	u32                             flags,	struct acpi_pointer             *rsdp_address){	struct acpi_table_desc          table_info;	acpi_status                     status;	ACPI_FUNCTION_TRACE ("acpi_find_root_pointer");	/* Get the RSDP */	status = acpi_tb_find_rsdp (&table_info, flags);	if (ACPI_FAILURE (status)) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"RSDP structure not found, %s Flags=%X\n",			acpi_format_exception (status), flags));		return_ACPI_STATUS (AE_NO_ACPI_TABLES);	}	rsdp_address->pointer_type = ACPI_PHYSICAL_POINTER;	rsdp_address->pointer.physical = table_info.physical_address;	return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_tb_scan_memory_for_rsdp * * PARAMETERS:  start_address       - Starting pointer for search *              Length              - Maximum length to search * * RETURN:      Pointer to the RSDP if found, otherwise NULL. * * DESCRIPTION: Search a block of memory for the RSDP signature * ******************************************************************************/u8 *acpi_tb_scan_memory_for_rsdp (	u8                              *start_address,	u32                             length){	u8                              *mem_rover;	u8                              *end_address;	u8                              checksum;	ACPI_FUNCTION_TRACE ("tb_scan_memory_for_rsdp");	end_address = start_address + length;	/* Search from given start address for the requested length */	for (mem_rover = start_address; mem_rover < end_address;		 mem_rover += ACPI_RSDP_SCAN_STEP) {		/* The signature and checksum must both be correct */		if (ACPI_STRNCMP ((char *) mem_rover, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {			/* No signature match, keep looking */			continue;		}		/* Signature matches, check the appropriate checksum */		if ((ACPI_CAST_PTR (struct rsdp_descriptor, mem_rover))->revision < 2) {			/* ACPI version 1.0 */			checksum = acpi_tb_checksum (mem_rover, ACPI_RSDP_CHECKSUM_LENGTH);		}		else {			/* Post ACPI 1.0, use extended_checksum */			checksum = acpi_tb_checksum (mem_rover, ACPI_RSDP_XCHECKSUM_LENGTH);		}		if (checksum == 0) {			/* Checksum valid, we have found a valid RSDP */			ACPI_DEBUG_PRINT ((ACPI_DB_INFO,				"RSDP located at physical address %p\n", mem_rover));			return_PTR (mem_rover);		}		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,			"Found an RSDP at physical address %p, but it has a bad checksum\n",			mem_rover));	}	/* Searched entire block, no RSDP was found */	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,		"Searched entire block, no valid RSDP was found.\n"));	return_PTR (NULL);}/******************************************************************************* * * FUNCTION:    acpi_tb_find_rsdp * * PARAMETERS:  *table_info             - Where the table info is returned *              Flags                   - Current memory mode (logical vs. *                                        physical addressing) * * RETURN:      Status, RSDP physical address * * DESCRIPTION: search lower 1_mbyte of memory for the root system descriptor *              pointer structure.  If it is found, set *RSDP to point to it. * *              NOTE1: The RSDp must be either in the first 1_k of the Extended *              BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.) *              Only a 32-bit physical address is necessary. * *              NOTE2: This function is always available, regardless of the *              initialization state of the rest of ACPI. * ******************************************************************************/acpi_statusacpi_tb_find_rsdp (	struct acpi_table_desc          *table_info,	u32                             flags){	u8                              *table_ptr;	u8                              *mem_rover;	u32                             physical_address;	acpi_status                     status;	ACPI_FUNCTION_TRACE ("tb_find_rsdp");	/*	 * Scan supports either 1) Logical addressing or 2) Physical addressing	 */	if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) {		/*		 * 1a) Get the location of the EBDA		 */		status = acpi_os_map_memory ((acpi_physical_address) ACPI_EBDA_PTR_LOCATION,				  ACPI_EBDA_PTR_LENGTH,				  (void *) &table_ptr);		if (ACPI_FAILURE (status)) {			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,				"Could not map memory at %8.8X for length %X\n",				ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH));			return_ACPI_STATUS (status);		}		ACPI_MOVE_16_TO_32 (&physical_address, table_ptr);		physical_address <<= 4;                 /* Convert segment to physical address */		acpi_os_unmap_memory (table_ptr, ACPI_EBDA_PTR_LENGTH);		/* EBDA present? */		if (physical_address > 0x400) {			/*			 * 1b) Search EBDA paragraphs (EBDa is required to be a minimum of 1_k length)			 */			status = acpi_os_map_memory ((acpi_physical_address) physical_address,					  ACPI_EBDA_WINDOW_SIZE,					  (void *) &table_ptr);			if (ACPI_FAILURE (status)) {				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,					"Could not map memory at %8.8X for length %X\n",					physical_address, ACPI_EBDA_WINDOW_SIZE));				return_ACPI_STATUS (status);			}			mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, ACPI_EBDA_WINDOW_SIZE);			acpi_os_unmap_memory (table_ptr, ACPI_EBDA_WINDOW_SIZE);			if (mem_rover) {				/* Found it, return the physical address */				physical_address += ACPI_PTR_DIFF (mem_rover, table_ptr);				table_info->physical_address = (acpi_physical_address) physical_address;				return_ACPI_STATUS (AE_OK);			}		}		/*		 * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh		 */		status = acpi_os_map_memory ((acpi_physical_address) ACPI_HI_RSDP_WINDOW_BASE,				  ACPI_HI_RSDP_WINDOW_SIZE,				  (void *) &table_ptr);		if (ACPI_FAILURE (status)) {			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,				"Could not map memory at %8.8X for length %X\n",				ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE));			return_ACPI_STATUS (status);		}		mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, ACPI_HI_RSDP_WINDOW_SIZE);		acpi_os_unmap_memory (table_ptr, ACPI_HI_RSDP_WINDOW_SIZE);		if (mem_rover) {			/* Found it, return the physical address */			physical_address = ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (mem_rover, table_ptr);			table_info->physical_address = (acpi_physical_address) physical_address;			return_ACPI_STATUS (AE_OK);		}	}	/*	 * Physical addressing	 */	else {		/*		 * 1a) Get the location of the EBDA		 */		ACPI_MOVE_16_TO_32 (&physical_address, ACPI_EBDA_PTR_LOCATION);		physical_address <<= 4;     /* Convert segment to physical address */		/* EBDA present? */		if (physical_address > 0x400) {			/*			 * 1b) Search EBDA paragraphs (EBDa is required to be a minimum of 1_k length)			 */			mem_rover = acpi_tb_scan_memory_for_rsdp (ACPI_PHYSADDR_TO_PTR (physical_address),					  ACPI_EBDA_WINDOW_SIZE);			if (mem_rover) {				/* Found it, return the physical address */				table_info->physical_address = ACPI_TO_INTEGER (mem_rover);				return_ACPI_STATUS (AE_OK);			}		}		/*		 * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh		 */		mem_rover = acpi_tb_scan_memory_for_rsdp (ACPI_PHYSADDR_TO_PTR (ACPI_HI_RSDP_WINDOW_BASE),				  ACPI_HI_RSDP_WINDOW_SIZE);		if (mem_rover) {			/* Found it, return the physical address */			table_info->physical_address = ACPI_TO_INTEGER (mem_rover);			return_ACPI_STATUS (AE_OK);		}	}	/* RSDP signature was not found */	return_ACPI_STATUS (AE_NOT_FOUND);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -