Hello Genode community,
in my checkpoint component I intercepted the Cpu session of a child, through which I get all Thread_capabilities created for and by the child. To store the state of a component I need to store the registers of the threads used by the child.
I tried reading the registers through the "Thread_state Cpu_thread::state()" method, but it did not contain any information about (just zeros).
I'm using Genode 16.05, kernel Fiasco.OC (pbax9 build). By inspecting the kernel API of foc, I found out that the function l4_thread_ex_regs_ret can read the sp and ip register. By changing the state method in platform_thread.cc (in base-foc) I could get the registers:
Thread_state Platform_thread::state() { Thread_state s; if (_pager_obj) s = _pager_obj->state;
_pager_obj->state.ip = ~0UL; _pager_obj->state.sp = ~0UL; l4_umword_t flags = 0; l4_thread_ex_regs_ret(_thread.local.dst(), &_pager_obj->state.ip, &_pager_obj->state.sp, &flags);
s.sp = _pager_obj->state.sp; s.ip = _pager_obj->state.ip; s.kcap = _gate.remote; s.id = _gate.local.local_name(); s.utcb = _utcb;
return s; }
But other registers like r0 - r12 are missing.
Is there a simple way in Genode to get them? Can I utilize the utcb memory location to find the missing registers?
Kind regards Denis