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()