Beispiel #1
0
void find_acpi_cpu_names(unsigned char* dsdt, int length)
{
	int i;
	
	for (i=0; i<length-7; i++) 
	{
		if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP
		{
			uint8_t offset = i+2+(dsdt[i+2] >> 6) + 1, j;
			bool add_name = true;

			for (j=0; j<4; j++) 
			{
				char c = dsdt[offset+j];
				
				if (!aml_isvalidchar(c)) 
				{
					add_name = false;
					verbose("Invalid characters found in ProcessorOP!\n");
					break;
				}
			}
			
			if (add_name && dsdt[offset+5] < 32 ) 
			{
				acpi_cpu_name[acpi_cpu_count] = malloc(5);
				memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4);
				
				verbose("Found %c%c%c%c (from DSDT)\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]);
				
				if (++acpi_cpu_count == 32) return;
			}
		}
	}
Beispiel #2
0
void get_acpi_cpu_names(unsigned char* dsdt, uint32_t length)
{
	uint32_t i;
	// DBG("start finding cpu names. length %d\n", length);
	for (i=0; i<length-7; i++) 
	{
		if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP
		{

		// DBG("dsdt: %x%x\n", dsdt[i], dsdt[i+1]);

			uint32_t offset = i + 3 + (dsdt[i+2] >> 6);

			bool add_name = true;

			uint8_t j;

			for (j=0; j<4; j++) 
			{
				char c = dsdt[offset+j];
				if( c == '\\')
				{
					offset = i + 8 + (dsdt[i+7] >> 6);
					c = dsdt[offset+j];
				}

				if (!aml_isvalidchar(c)) 
				{
					add_name = false;
					verbose("Invalid character found in ProcessorOP 0x%x!\n", c);
					break;
				}
			}

			if (add_name)
			{
				acpi_cpu_name[acpi_cpu_count] = malloc(4);
				memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4);
				i = offset + 5;

				if (acpi_cpu_count == 0)
				{
					verbose("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count]);
				} else {
					verbose("And %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count]);
				}

				if (++acpi_cpu_count == 32)
				break;
			}
		}
int aml_fill_simple_name(char* buffer, const char* name)
{
	int i, len = strlen(name), count = 0;
	
	for (i = 0; i < 4; i++) 
	{
		if (i < len && aml_isvalidchar(name[i])) 
		{
			buffer[count++] = name[i];
		}
		else 
		{
			buffer[3-i] = '_';
		}
	}
	
	return 4;
}
Beispiel #4
0
void get_acpi_cpu_names(unsigned char* dsdt, uint32_t length)
{
	uint32_t i;
	
	for (i=0; i<length-7; i++) 
	{
		if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP
		{
			uint32_t offset = i + 3 + (dsdt[i+2] >> 6);
			
			bool add_name = true;

			uint8_t j;
			
			for (j=0; j<4; j++) 
			{
				char c = dsdt[offset+j];
				
				if (!aml_isvalidchar(c)) 
				{
					add_name = false;
					verbose("Invalid character found in ProcessorOP 0x%x!\n", c);
					break;
				}
			}
			
			if (add_name) 
			{
				acpi_cpu_name[acpi_cpu_count] = malloc(4);
				memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4);
				i = offset + 5;
                
                if (acpi_cpu_count == 0)
                    acpi_cpu_p_blk = dsdt[i] | (dsdt[i+1] << 8);
				
				verbose("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]);
				
				if (++acpi_cpu_count == 32) return;
			}
		}
	}
int aml_get_names_count(const char* name)
{
	int i, len = strlen(name), count = 0;
	
	for (i = 0; i < len; i++)
	{
		if (name[i] == '.') 
		{
			count++;
		}
		else if (!aml_isvalidchar(name[i]))
		{
			len = i;
			break;
		}
	}
	
	if (count == 0 && len > 0) 
		count++;
	
	return count;
}
int aml_fill_name(struct aml_chunk* node, const char* name)
{
	if (!node) 
		return -1;
	
	int i, len = strlen(name), count = 0;
	
	for (i = 0; i < len; i++)
	{
		if (name[i] == '.') 
		{
			count++;
		}
		else if (!aml_isvalidchar(name[i]))
		{
			len = i;
			break;
		}
	}
	
	if (count == 0 && len > 0) 
		count++;
	
	int offset = 0;
	
	if (count == 1) 
	{
		node->Length = 4;
		node->Buffer = malloc(node->Length);
		aml_fill_simple_name(node->Buffer, name);
		return node->Length;
	}
	
	if (count == 2) 
	{
		node->Length = 2 + 8;
		node->Buffer = malloc(node->Length);
		node->Buffer[offset++] = '\\'; // Root
		node->Buffer[offset++] = 0x2e; // Double name
	}
	else 
	{
		node->Length = 3 + count*4;
		node->Buffer[offset++] = '\\'; // Root
		node->Buffer[offset++] = 0x2f; // Multi name
		node->Buffer[offset++] = count; // Names count
	}

	int j = 0;
	
	for (i = 0; i < count; i++) 
	{
		while (name[j] != '.') 
		{
			if (j < len)
			{
				j++;
			}
			else 
			{
				verbose("aml_fill_name: unexpected end of names path!");
				return -1;
			}
		}

		offset += aml_fill_simple_name(node->Buffer + offset, name + j);
	}
	
	return offset;
}