Hi,
I'm working on a 64bit machine, but only using 32bit binaries (hypervisor and genode).
I instrumented the methods with some PDGB and found out that the first attempt to map the table already fails:
[init -> acpi] Genode::uint8_t* Acpi_table::_map_io(Genode::addr_t, Genode::size_t, Genode::Io_mem_session_capability&): _map_io: [e0000, 100000) [init -> acpi] Acpi_table::Acpi_table(): RSDP 2a020 [init -> acpi] Table_wrapper::Table_wrapper(Genode::addr_t): Table wrapper with base bf7fe0ac I/O memory [bf7fe000,bf800000) not available Local MMIO mapping failed! [init -> acpi] C++ runtime: Genode::Parent::Service_denied [init -> acpi] void* abort(): abort called
The call that fails is
_io_mem = new (env()->heap()) Io_mem_connection(_base, size + _offset());
With the offset 0x0ac of the base address and the size 0x1000, I think it tries to map two pages of I/O memory from 0xbf7fe000 - 0xbf800000, but the memory map doesn't allow that, because of the overlap between available and not available memory.
On 23 July 2012 15:43, Sebastian Sumpf <Sebastian.Sumpf@...1...> wrote:
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
Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Genode-main mailing list Genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main