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

📄 rscalc.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 2 页
字号:
			 * optional elements.  Check the length of the			 * Bytestream.  If it is greater than 23, that			 * means that an Index exists and is followed by			 * a null termininated string.  Therefore, set			 * the temp variable to the length minus the minimum			 * byte stream length plus the byte for the Index to			 * determine the size of the NULL terminiated string.			 */			if (23 < temp16) {				temp8 = (u8) (temp16 - 24);			}			else {				temp8 = 0;			}			/*			 * Ensure a 32-bit boundary for the structure			 */			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);			structure_size = SIZEOF_RESOURCE (acpi_resource_address32) +					   (temp8 * sizeof (u8));			break;		case RESOURCE_DESC_WORD_ADDRESS_SPACE:			/*			 * 16-Bit Address Resource			 */			buffer = byte_stream_buffer;			++buffer;			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);			bytes_consumed = temp16 + 3;			/*			 * Resource Source Index and Resource Source are			 * optional elements.  Check the length of the			 * Bytestream.  If it is greater than 13, that			 * means that an Index exists and is followed by			 * a null termininated string.  Therefore, set			 * the temp variable to the length minus the minimum			 * byte stream length plus the byte for the Index to			 * determine the size of the NULL terminiated string.			 */			if (13 < temp16) {				temp8 = (u8) (temp16 - 14);			}			else {				temp8 = 0;			}			/*			 * Ensure a 32-bit boundary for the structure			 */			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);			structure_size = SIZEOF_RESOURCE (acpi_resource_address16) +					   (temp8 * sizeof (u8));			break;		case RESOURCE_DESC_EXTENDED_XRUPT:			/*			 * Extended IRQ			 */			buffer = byte_stream_buffer;			++buffer;			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);			bytes_consumed = temp16 + 3;			/*			 * Point past the length field and the			 * Interrupt vector flags to save off the			 * Interrupt table length to the Temp8 variable.			 */			buffer += 3;			temp8 = *buffer;			/*			 * To compensate for multiple interrupt numbers, add 4 bytes for			 * each additional interrupts greater than 1			 */			additional_bytes = (u8) ((temp8 - 1) * 4);			/*			 * Resource Source Index and Resource Source are			 * optional elements.  Check the length of the			 * Bytestream.  If it is greater than 9, that			 * means that an Index exists and is followed by			 * a null termininated string.  Therefore, set			 * the temp variable to the length minus the minimum			 * byte stream length plus the byte for the Index to			 * determine the size of the NULL terminiated string.			 */			if (9 + additional_bytes < temp16) {				temp8 = (u8) (temp16 - (9 + additional_bytes));			}			else {				temp8 = 0;			}			/*			 * Ensure a 32-bit boundary for the structure			 */			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);			structure_size = SIZEOF_RESOURCE (acpi_resource_ext_irq) +					   (additional_bytes * sizeof (u8)) +					   (temp8 * sizeof (u8));			break;		case RESOURCE_DESC_IRQ_FORMAT:			/*			 * IRQ Resource.			 * Determine if it there are two or three trailing bytes			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			if(temp8 & 0x01) {				bytes_consumed = 4;			}			else {				bytes_consumed = 3;			}			/*			 * Point past the descriptor			 */			++buffer;			/*			 * Look at the number of bits set			 */			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);			for (index = 0; index < 16; index++) {				if (temp16 & 0x1) {					++number_of_interrupts;				}				temp16 >>= 1;			}			structure_size = SIZEOF_RESOURCE (acpi_resource_io) +					   (number_of_interrupts * sizeof (u32));			break;		case RESOURCE_DESC_DMA_FORMAT:			/*			 * DMA Resource			 */			buffer = byte_stream_buffer;			bytes_consumed = 3;			/*			 * Point past the descriptor			 */			++buffer;			/*			 * Look at the number of bits set			 */			temp8 = *buffer;			for(index = 0; index < 8; index++) {				if(temp8 & 0x1) {					++number_of_channels;				}				temp8 >>= 1;			}			structure_size = SIZEOF_RESOURCE (acpi_resource_dma) +					   (number_of_channels * sizeof (u32));			break;		case RESOURCE_DESC_START_DEPENDENT:			/*			 * Start Dependent Functions Resource			 * Determine if it there are two or three trailing bytes			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			if(temp8 & 0x01) {				bytes_consumed = 2;			}			else {				bytes_consumed = 1;			}			structure_size = SIZEOF_RESOURCE (acpi_resource_start_dpf);			break;		case RESOURCE_DESC_END_DEPENDENT:			/*			 * End Dependent Functions Resource			 */			bytes_consumed = 1;			structure_size = ACPI_RESOURCE_LENGTH;			break;		case RESOURCE_DESC_IO_PORT:			/*			 * IO Port Resource			 */			bytes_consumed = 8;			structure_size = SIZEOF_RESOURCE (acpi_resource_io);			break;		case RESOURCE_DESC_FIXED_IO_PORT:			/*			 * Fixed IO Port Resource			 */			bytes_consumed = 4;			structure_size = SIZEOF_RESOURCE (acpi_resource_fixed_io);			break;		case RESOURCE_DESC_SMALL_VENDOR:			/*			 * Vendor Specific Resource			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			temp8 = (u8) (temp8 & 0x7);			bytes_consumed = temp8 + 1;			/*			 * Ensure a 32-bit boundary for the structure			 */			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);			structure_size = SIZEOF_RESOURCE (acpi_resource_vendor) +					   (temp8 * sizeof (u8));			break;		case RESOURCE_DESC_END_TAG:			/*			 * End Tag			 */			bytes_consumed = 2;			structure_size = ACPI_RESOURCE_LENGTH;			byte_stream_buffer_length = bytes_parsed;			break;		default:			/*			 * If we get here, everything is out of sync,			 *  so exit with an error			 */			return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);			break;		}		/*		 * Update the return value and counter		 */		buffer_size += structure_size;		bytes_parsed += bytes_consumed;		/*		 * Set the byte stream to point to the next resource		 */		byte_stream_buffer += bytes_consumed;	}	/*	 * This is the data the caller needs	 */	*size_needed = buffer_size;	return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_rs_calculate_pci_routing_table_length * * PARAMETERS:  Package_object          - Pointer to the package object *              Buffer_size_needed      - u32 pointer of the size buffer *                                        needed to properly return the *                                        parsed data * * RETURN:      Status * * DESCRIPTION: Given a package representing a PCI routing table, this *              calculates the size of the corresponding linked list of *              descriptions. * ******************************************************************************/acpi_statusacpi_rs_calculate_pci_routing_table_length (	acpi_operand_object     *package_object,	u32                     *buffer_size_needed){	u32                     number_of_elements;	u32                     temp_size_needed = 0;	acpi_operand_object     **top_object_list;	u32                     index;	acpi_operand_object     *package_element;	acpi_operand_object     **sub_object_list;	u8                      name_found;	u32                     table_index;	FUNCTION_TRACE ("Rs_calculate_pci_routing_table_length");	number_of_elements = package_object->package.count;	/*	 * Calculate the size of the return buffer.	 * The base size is the number of elements * the sizes of the	 * structures.  Additional space for the strings is added below.	 * The minus one is to subtract the size of the u8 Source[1]	 * member because it is added below.	 *	 * But each PRT_ENTRY structure has a pointer to a string and	 * the size of that string must be found.	 */	top_object_list = package_object->package.elements;	for (index = 0; index < number_of_elements; index++) {		/*		 * Dereference the sub-package		 */		package_element = *top_object_list;		/*		 * The Sub_object_list will now point to an array of the		 * four IRQ elements: Address, Pin, Source and Source_index		 */		sub_object_list = package_element->package.elements;		/*		 * Scan the Irq_table_elements for the Source Name String		 */		name_found = FALSE;		for (table_index = 0; table_index < 4 && !name_found; table_index++) {			if ((ACPI_TYPE_STRING == (*sub_object_list)->common.type) ||				((INTERNAL_TYPE_REFERENCE == (*sub_object_list)->common.type) &&					((*sub_object_list)->reference.opcode == AML_INT_NAMEPATH_OP))) {				name_found = TRUE;			}			else {				/*				 * Look at the next element				 */				sub_object_list++;			}		}		temp_size_needed += (sizeof (pci_routing_table) - 4);		/*		 * Was a String type found?		 */		if (TRUE == name_found) {			if (ACPI_TYPE_STRING == (*sub_object_list)->common.type) {				/*				 * The length String.Length field includes the				 * terminating NULL				 */				temp_size_needed += (*sub_object_list)->string.length;			}			else {				temp_size_needed += acpi_ns_get_pathname_length (						   (*sub_object_list)->reference.node);			}		}		else {			/*			 * If no name was found, then this is a NULL, which is			 * translated as a u32 zero.			 */			temp_size_needed += sizeof (u32);		}		/* Round up the size since each element must be aligned */		temp_size_needed = ROUND_UP_TO_64_bITS (temp_size_needed);		/*		 * Point to the next acpi_operand_object		 */		top_object_list++;	}	/*	 * Adding an extra element to the end of the list, essentially a NULL terminator	 */	*buffer_size_needed = temp_size_needed + sizeof (pci_routing_table);	return_ACPI_STATUS (AE_OK);}

⌨️ 快捷键说明

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