Memory write tracing/logging of an application / Watchpoints in Genode/Fiasco.OC

Josef Stark j.stark at ...256...
Sun Feb 4 18:04:00 CET 2018


Hey Martin,

the next problem that I'm facing now is that I don't know how to access 
the instruction that caused the pagefault. I have the instruction 
pointer but not the instruction itself (opcode and operands).
Your vinit code [1] uses an imprint to identify the corresponding 
Rm_client and then find the correct region by the IP address:
> Rm_client * const rm_client = Rm_client::by_id(state.imprint);
> addr_t off, ip = client_state->ip;
> Rm_session_component * const rm = rm_client->session();
> Region * const region = rm->_find_region((void *)ip, &off);
> Dataspace_capability ds_cap = region->ds_cap();
> void * local = env()->rm_session()->attach(ds_cap, 0, region->offset());
> unsigned instr = *(unsigned *)((addr_t)local + off);
However, I'm again wondering if there's an easier way to find the 
dataspace considering that my checkpointer only has this one child (and 
I also know the binary name), and for the thread state it was already 
possible after you explained it to me.
Where do I look? I tried looking through the RAM dataspaces, but so far, 
trial and error didn't yield any success. Probably because I'm doing 
something wrong, and due to the architectural changes introduced between 
12.11 and 16.08 it's again hard for me to re-use vinit code, so maybe 
you can push me in the right direction again.

Another thing that I don't completely understand: The pagefault report 
includes the memory address where the pagefault occured. I can 
successfully find the corresponding data space. Experimenting a bit 
showed me that the reported address seems to be 8-Byte-aligned. (Because 
incrementing the accessed address in the test application byte by byte 
only results in an 8-byte jump of the reported address 'state.addr' 
every 8 bytes. Inside an 8-byte group it stays the same.)
But how can I find out which of the 8 byte(s) was actually accessed? 
Especially considering that single-byte access doesn't have to be 
aligned. I think that for your emulator this information was not 
necessary, so [2] doesn't provide it. But is it even contained in the 
instruction?


Best regards,
Josef

[1] os/src/vinit/include/rm_session/component.h: state()
[2] os/src/vinit/arm_v7a/instruction.h: load_store()




More information about the users mailing list