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

📄 tbxfroot.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (ACPI_FAILURE(status)) {			goto cleanup;		}		/* Compare table signatures and table instance */		if (!ACPI_STRNCMP(header->signature, signature, ACPI_NAME_SIZE)) {			/* An instance of the table was found */			j++;			if (j >= instance) {				/* Found the correct instance, get the entire table */				status =				    acpi_tb_get_table_body(&address, header,							   table_info);				if (ACPI_FAILURE(status)) {					goto cleanup;				}				*table_pointer = table_info->pointer;				goto cleanup;			}		}	}	/* Did not find the table */	status = AE_NOT_EXIST;      cleanup:	if (rsdt_info->pointer) {		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:  Flags                   - Logical/Physical addressing *              rsdp_address            - Where to place the RSDP address * * RETURN:      Status, Physical address of the RSDP * * DESCRIPTION: Find the RSDP * ******************************************************************************/acpi_status acpi_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 * ******************************************************************************/static u8 *acpi_tb_scan_memory_for_rsdp(u8 * start_address, u32 length){	acpi_status status;	u8 *mem_rover;	u8 *end_address;	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 RSDP signature and checksum must both be correct */		status =		    acpi_tb_validate_rsdp(ACPI_CAST_PTR					  (struct rsdp_descriptor, mem_rover));		if (ACPI_SUCCESS(status)) {			/* Sig and checksum valid, we have found a real RSDP */			ACPI_DEBUG_PRINT((ACPI_DB_INFO,					  "RSDP located at physical address %p\n",					  mem_rover));			return_PTR(mem_rover);		}		/* No sig match or bad checksum, keep searching */	}	/* Searched entire block, no RSDP was found */	ACPI_DEBUG_PRINT((ACPI_DB_INFO,			  "Searched entire block from %p, valid RSDP was not found\n",			  start_address));	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. * ******************************************************************************/static 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 logical addressing or physical addressing	 */	if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) {		/* 1a) Get the location of the Extended BIOS Data Area (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);		/* Convert segment part to physical address */		physical_address <<= 4;		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) {				/* 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) {			/* 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) {				/* 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);		}	}	/* A valid RSDP was not found */	ACPI_REPORT_ERROR(("No valid RSDP was found\n"));	return_ACPI_STATUS(AE_NOT_FOUND);}#endif

⌨️ 快捷键说明

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