Hello, Norman
Your guess is right: The page fault is caused while parsing the config file. The trigger is the method Xml_node::content(), which tries to copy the process’ filename from the config file, but the root cause is a nasty bug in function Genode::strncpy() which is used to obtain the filename. In the function’s first line Genode::strlen() is used to determine the length of the source string. In the given case, where the source is a tagged item of the config file having no null termination, strlen() runs thru the memory until it randomly finds a null character. For my opinion Genode::strncpy() is not allowed to parse the source string beyond the given size argument. Your suggestion of appending a null character to the config file (by the way: how is this to be done w/o corrupting the XML syntax?) heals a symptome, but does not solve the root cause.
I tried to fix Genode::strncpy() myself. Since there is no function Genode::strnlen(), I made the following change:
size_t i = 0;
while (i < size)
{
if (src[i] == 0)
{
size = i;
break;
}
++i;
}
Interestingly this seem to trigger another problem. Now I get on all platforms the following two errors:
virtual Genode::Session_capability Genode::Core_parent::session(const char*, const char*): service_name="RM" arg="ram_quota=4K" not handled
virtual Genode::Session_capability Genode::Core_parent::session(const char*, const char*): service_name="PD" arg="ram_quota=4K" not handled
Could it be that there are already some workarounds for buggy Genode::strncpy(), which do not work anymore once the function is fixed?
Frank
-----Original Message-----
From: Norman Feske [mailto:norman.feske@...1...]
Sent: Sunday, August 02, 2009 5:38 PM
To: Genode OS Framework Mailing List
Subject: Re: Problem with 'test-pci'
Hello Frank,
I think, you hit an issue with the handling of boot modules on
OKL4. In contrast to running on Qemu, on real hardware, the padding
space between boot modules is not cleared on startup so that there is
the chance that the actual data is followed by bit garbage. This is
particularly annoying for the config file. We directly pass the locally
mapped config file to our XML parser, which expects a null termination.
However, without initial clearing of memory, there may be no such
termination. So the XML parser continues parsing until it hits the
following (not mapped) page. The next release will fix the problem by
allowing a length limit to be specified to the XML parser. For now, you
can use the short-term fix to manually append a zero character to your
config file.
I would be grateful to know if I'm guessing right and if this quick fix
works for you.
Regards
Norman
Frank Kaiser wrote:
Hello
As a preparation of a certain task I want to check the PCI resources of
my platform (IVI platform with Intel ATOM). For this purpose I built
Genode-on-OKL4, only consisting of a minimum driver set and the
/test-pci/ application. Running this image in /qemu/ looks good, but on
the IVI platform the /init/ process fails with a page fault before or
when starting the PCI driver which is the first entry in the /config/
file. The error message is:
no RM attachment (READ pf_addr=6000 pf_ip=2001286 from 01)
I have no clue what this message is trying to tell me. The given IP
points to the function /Genode::strncpy()/. I also wonder why the system
wants to read from virtual address 0x6000, because all modules are
allocated beginning at virtual address 0x02000000. Checking /init’s/
pagetable with OKL4’s KDB on /qemu/ shows a number of allocations below:
...
I’d like to get some hints where to look into the code for finding the
cause of the problem. Since I cannot debug the platform, I probably have
to add more trace messages to get additonal information about what is
going on.
Regards
Frank