u8                              *buffer = byte_stream_buffer; struct acpi_resource            *output_struct = (void *) *output_buffer; u8                              *temp_ptr; acpi_size                       struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_address16); 
acpi_rs_address16_resource (	u8                              *byte_stream_buffer,	acpi_size                       *bytes_consumed,	u8                              **output_buffer,	acpi_size                       *structure_size){	u8                              *buffer = byte_stream_buffer;	struct acpi_resource            *output_struct = (void *) *output_buffer;	u8                              *temp_ptr;	acpi_size                       struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_address16);	u32                             index;	u16                             temp16;	u8                              temp8;	ACPI_FUNCTION_TRACE ("rs_address16_resource");	/*	 * Point past the Descriptor to get the number of bytes consumed	 */	buffer += 1;	ACPI_MOVE_16_TO_16 (&temp16, buffer);	/* Validate minimum descriptor length */	if (temp16 < 13) {		return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);	}	*bytes_consumed = temp16 + 3;	output_struct->id = ACPI_RSTYPE_ADDRESS16;	/*	 * Get the Resource Type (Byte3)	 */	buffer += 2;	temp8 = *buffer;	/* Values 0-2 and 0xC0-0xFF are valid */	if ((temp8 > 2) && (temp8 < 0xC0)) {		return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);	}	output_struct->data.address16.resource_type = temp8;	/*	 * Get the General Flags (Byte4)	 */	buffer += 1;	temp8 = *buffer;	/* Producer / Consumer */	output_struct->data.address16.producer_consumer = temp8 & 0x01;	/* Decode */	output_struct->data.address16.decode = (temp8 >> 1) & 0x01;	/* Min Address Fixed */	output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01;	/* Max Address Fixed */	output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01;	/*	 * Get the Type Specific Flags (Byte5)	 */	buffer += 1;	temp8 = *buffer;	if (ACPI_MEMORY_RANGE == output_struct->data.address16.resource_type) {		output_struct->data.address16.attribute.memory.read_write_attribute =				(u16) (temp8 & 0x01);		output_struct->data.address16.attribute.memory.cache_attribute =				(u16) ((temp8 >> 1) & 0x03);	}	else {		if (ACPI_IO_RANGE == output_struct->data.address16.resource_type) {			output_struct->data.address16.attribute.io.range_attribute =				(u16) (temp8 & 0x03);			output_struct->data.address16.attribute.io.translation_attribute =				(u16) ((temp8 >> 4) & 0x03);		}		else {			/* BUS_NUMBER_RANGE == Address16.Data->resource_type */			/* Nothing needs to be filled in */		}	}	/*	 * Get Granularity (Bytes 6-7)	 */	buffer += 1;	ACPI_MOVE_16_TO_32 (&output_struct->data.address16.granularity, buffer);	/*	 * Get min_address_range (Bytes 8-9)	 */	buffer += 2;	ACPI_MOVE_16_TO_32 (&output_struct->data.address16.min_address_range, buffer);	/*	 * Get max_address_range (Bytes 10-11)	 */	buffer += 2;	ACPI_MOVE_16_TO_32 (&output_struct->data.address16.max_address_range, buffer);	/*	 * Get address_translation_offset (Bytes 12-13)	 */	buffer += 2;	ACPI_MOVE_16_TO_32 (&output_struct->data.address16.address_translation_offset, buffer);	/*	 * Get address_length (Bytes 14-15)	 */	buffer += 2;	ACPI_MOVE_16_TO_32 (&output_struct->data.address16.address_length, buffer);	/*	 * Resource Source Index (if present)	 */	buffer += 2;	/*	 * This will leave us pointing to the Resource Source Index	 * If it is present, then save it off and calculate the	 * pointer to where the null terminated string goes:	 * Each Interrupt takes 32-bits + the 5 bytes of the	 * stream that are default.	 *	 * Note: Some resource descriptors will have an additional null, so	 * we add 1 to the length.	 */	if (*bytes_consumed > (16 + 1)) {		/* Dereference the Index */		temp8 = *buffer;		output_struct->data.address16.resource_source.index = (u32) temp8;		/* Point to the String */		buffer += 1;		/* Point the String pointer to the end of this structure */		output_struct->data.address16.resource_source.string_ptr =				(char *)((u8 * )output_struct + struct_size);		temp_ptr = (u8 *) output_struct->data.address16.resource_source.string_ptr;		/* Copy the string into the buffer */		index = 0;		while (0x00 != *buffer) {			*temp_ptr = *buffer;			temp_ptr += 1;			buffer += 1;			index += 1;		}		/*		 * Add the terminating null		 */		*temp_ptr = 0x00;		output_struct->data.address16.resource_source.string_length = index + 1;		/*		 * In order for the struct_size to fall on a 32-bit boundary,		 * calculate the length of the string and expand the		 * struct_size to the next 32-bit boundary.		 */		temp8 = (u8) (index + 1);		struct_size += ACPI_ROUND_UP_to_32_bITS (temp8);	}	else {		output_struct->data.address16.resource_source.index = 0x00;		output_struct->data.address16.resource_source.string_length = 0;		output_struct->data.address16.resource_source.string_ptr = NULL;	}	/*	 * Set the Length parameter	 */	output_struct->length = (u32) struct_size;	/*	 * Return the final size of the structure	 */	*structure_size = struct_size;	return_ACPI_STATUS (AE_OK);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/44f6c01242da4e162f28d8e1216a8c7a91174605/rsaddr.c/buggy/drivers/acpi/resources/rsaddr.c