I am trying to get working getcontext/setcontext/makecontext prototype on seL4/Genode (I can’t use anything except seL4 in this moment due to some reasons).
I need both for x86_64 and aarm64 arch.
I started from x86.
So, question one. May be someone know kind of rough implementation for user-space context switching?
I read information that this is not implemented yet in the main genode - but may be some projects does this already?
Problem 2.
When I start trying to make a fast solution and try to read registers and some info from low level physical seL4 thread using seL4_TCB_ReadRegisters I found that:
In returned successfully data rip register is always 0 for current thread, tcb selector myself.native_thread().tcb_sel also 0, and rsp = 0x13!
Probably I can’t read myself?
Problem 3.
I try to take address of IPC buffer bounded to utcb() field of Genode::Thread using code below.
It successfully compiled and linked. Anyway, in attempt to run the program I found the following error in log:
[init -> test-go] Error: LD: jump slot relocation failed for symbol: 'Genode::Thread::utcb()’
While access for similar fields in the same Thread structure successfully works!
Eg Name name() const; can be printed, native_thread() also give results.
I even found in the .o file the name of field (function technically) marked as U , and literally the same name mangled in the sym file for ld.lib.so compiled:
000000000003a09a T _ZN6Genode6Thread4utcbEv
genode/repos/base/lib/symbols/ld:_ZN6Genode6Thread4utcbEv T
How to fix this?
// take info about genode thread
Thread &myself = *Thread::myself();
log("myself ", &myself, " size ", sizeof(myself));
addr_t const ipc_buffer = reinterpret_cast<addr_t>(myself.utcb());
log(" name ",myself.name(), " sb ", myself.stack_base(), " svb ", myself.stack_area_virtual_base(), " tcb ", (addr_t)myself.native_thread().tcb_sel);
seL4_IPCBuffer &ipc_buffer = *reinterpret_cast<seL4_IPCBuffer *>(myself.utcb());
Sincerely,
Alexander Tormasov・