Sorry for not posting too much code ^^ here is what I have
Code:
typedef struct acpi_header
{
uint32_t signature;
uint32_t length;
uint8_t revision;
uint8_t checksum;
uint8_t oem[6];
uint8_t oem_table_id[8];
uint32_t oem_revision;
uint32_t creator_id;
uint32_t creator_revision;
} __attribute__((__packed__)) acpi_header_t;
Code:
uint32_t rsdt_addr = *(uint32_t *)(rsdp_base + 16);
where rsdp_base is an uint8_t pointer
Then, rsdt_addr is sent to a function as a acpi_header_t pointer.
Then I am using the structure in this code:
Code:
if(rsdt == NULL)
{
return OS_ERR_NULL_POINTER;
}
printf("PARSING RSDT 1");
uint32_t *range_begin = (uint32_t *)(rsdt + 1);
uint32_t *range_end = (uint32_t *)((uint8_t*)rsdt + rsdt->length);
printf("PARSING RSDT 2\n");
the code crashes when reaching the rsdt->length access.
EDIT:
I've also tried to parse the descriptor like this
Code:
static OS_RETURN_E acpi_parse_rsdp(rsdp_descriptor_t *rsdp_desc)
{
if(rsdp_desc == NULL)
{
return OS_ERR_NULL_POINTER;
}
// Verify checksum
uint8_t sum = 0;
for (uint8_t i = 0; i < 20; ++i)
{
sum += ((uint8_t*)rsdp_desc)[i];
}
if (sum)
{
printf("Checksum failed\n");
return OS_ERR_CHECKSUM_FAILED;
}
printf("OEM = %s\n", rsdp_desc->oemid);
OS_RETURN_E err;
// Check version
if (rsdp_desc->revision == 0)
{
printf("ACPI Version 1\n");
printf("ADDR %p\n", rsdp_desc->rsdt_address);
err = acpi_parse_rsdt((acpi_header_t *) rsdp_desc->rsdt_address);
printf("PARSED RSDT\n");
if(err != OS_NO_ERR)
{
return err;
}
}
}
where rsdp_descriptor_t is
Code:
typedef struct rsdp_descriptor
{
char signature[8];
uint8_t checksum;
char oemid[6];
uint8_t revision;
uint32_t rsdt_address;
} __attribute__ ((packed)) rsdp_descriptor_t;