I/O Memory Mapping failed

Markus Partheymueller mail at ...119...
Mon Jul 23 16:26:16 CEST 2012


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,
[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 at ...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 at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/genode-main

More information about the users mailing list