The test is basically doing the following:
1- test_ep_recycle() creates a badged ep.
2- The call_func() thread invoke seL4_Call(), (the second invocation). At this
point, call_func() thread blocks waiting for a reply (on the same ep).
3- test_ep_recycle() recycles all badged ep caps (including the one call_func()
is blocking on). The kernel then invalidates cnodes of these endpoints, and set
the state of the thread blocking on it as ThreadState_Restart, hence it will
restart to do the seL4_Call() again.
4- call_func() thread resumes (restarted) and tries to do seL4_Call() on
invalid endpoint which is no longer in its cspace, and should get the error
seL4_InvalidCapability as a label.
One thing to check is to make sure the the call_func() thread is actually
"Restarted" (assuming that arch-independent recycle code works correctly)
meaning that it tries to invoke seL4_Call() again (the actual swi/trap-like
instruction) after test_cp_recycle() recycles its endpoint. The arch-dependent
functions in the kernel to do this are getRestartPC() and setNextPC().
Hope that helps.
From: Devel <email@example.com> on behalf of Vasily A.Sartakov
Sent: Friday, October 14, 2016 12:33 AM
Subject: [seL4] endpoint.c
I have a problem with endpoint.c test (RECYCLE0001):
Error: seL4_MessageInfo_get_label(tag) == seL4_InvalidCapability at line 50 of
I am reading MR(0) in call_func above this check and see, that seL4_Call
returns values that were sent before. For example, 100 for the first thread,
101 for the second and etc. Thus, as far I understand, cnode_recycle does not
work at all. I am pretty sure that my seL4_Call syscall was implemented
properly. I have looked inside the kernel, and tried to track everything
related to cteRecycle and do not see anything platform specific. I know that it
is a complicated question, but any ideas or hints where to look?
Vasily A. Sartakov
Devel mailing list
Devel mailing list