Hi Markus,
On 07/23/2012 12:59 PM, Christian Helmuth wrote:
Hello Markus,
On Mon, Jul 23, 2012 at 12:47:37PM +0200, Markus Partheymueller wrote:
the only thing verbose logging added was this line:
[init -> acpi] Acpi_table::Acpi_table():RSDP 2a020
Does this help?
Hm, not much info. I'd recommend to instrument the Acpi_table methods with some PDBG()'s to find out what's going on with your machine:
... uint8_t *_map_io(addr_t base, size_t size, Io_mem_session_capability &cap) { PDBG("_map_io: [%p, %p)", (void*)base, (void*)(base + size)); Io_mem_connection io_mem(base, size); ...
I'm not the original author of the ACPI driver and, therefore, does not know it that well. Maybe, Sebastian could shed some light on this?
It seems like you are only getting the 'root descriptor pointer' (RSDP). After that the driver tries to map the ACPI tables found in the 'root descriptor table' (RSDT). If you should be on a 64-Bit machine (I am guessing that since last time the driver worked for you), this is the wrong way to go from here. On 64Bit one has to use the XSDT table to retrieve the other ACPI table pointers. In that case it should be not too hard to extent the driver (use offset 24 instead of 16 to retrieve the XDST pointer from RSDP). If you are on a 32-Bit machine something is indeed very strange. I am not sure if region 11 is really not available. Usually the driver tries to map the table using one page (of I/O memory), which seems to work. If the table header suggests that the table is larger than 4K, it remaps the table using the corresponding size -- that fails (see Table_wrapper constructor). There is one thing you could try. We are only looking for 'DSTDT', 'SSDT', 'FACP', and 'MADT' tables. You could enclose line 930 and 951 in acpi.cc (Table_wrapper) with a try catch block and simply continue if mapping fails. If you are lucky only the first table pointer is messed up and the others work.
Please share your insights,
Sebastian