Obj_cap::deref(unsigned char *rights = 0, bool dbg = false)
{
Thread *current = current_thread();
- if (flags() & L4_obj_ref::Ipc_reply)
+ if (op() & L4_obj_ref::Ipc_reply)
{
if (rights) *rights = current->caller_rights();
Thread *ca = static_cast<Thread*>(current->caller());
return ca;
}
- if (EXPECT_FALSE(invalid()))
+ if (EXPECT_FALSE(special()))
{
if (!self())
return 0;
void
Thread_object::invoke(L4_obj_ref /*self*/, Mword rights, Syscall_frame *f, Utcb *utcb)
{
- register unsigned flags = f->ref().flags();
- if (((flags != 0) && !(flags & L4_obj_ref::Ipc_send))
- || (flags & L4_obj_ref::Ipc_reply)
+ register L4_obj_ref::Operation op = f->ref().op();
+ if (((op != 0) && !(op & L4_obj_ref::Ipc_send))
+ || (op & L4_obj_ref::Ipc_reply)
|| f->tag().proto() != L4_msg_tag::Label_thread)
{
/* we do IPC */
Thread *partner = 0;
bool have_rcv = false;
- if (EXPECT_FALSE(!check_sys_ipc(flags, &partner, &sender, &have_rcv)))
+ if (EXPECT_FALSE(!check_sys_ipc(op, &partner, &sender, &have_rcv)))
{
utcb->error = L4_error::Not_existent;
return;
vcpu->user_task = L4_obj_ref();
}
- else if (user_task.flags() == L4_obj_ref::Ipc_reply)
+ else if (user_task.op() == L4_obj_ref::Ipc_reply)
vcpu_set_user_space(0);
L4_snd_item_iter snd_items(utcb, tag.words());
Reap_list rl;
L4_error err = fpage_map(space(), sfp,
vcpu_user_space(), L4_fpage::all_spaces(),
- item->b.raw(), &rl);
+ item->b, &rl);
rl.del();
cpu_lock.lock();
if (vcpu->state & Vcpu_state::F_user_mode)
{
if (!vcpu_user_space())
- return commit_result(-L4_err::EInval);
+ return commit_result(-L4_err::EInval);
user_mode = true;
PRIVATE inline NOEXPORT
L4_msg_tag
-Thread_object::sys_ex_regs(L4_msg_tag const &tag, Utcb * /*utcb*/)
+Thread_object::sys_ex_regs(L4_msg_tag const &tag, Utcb *utcb)
{
if (tag.words() != 3)
return commit_result(-L4_err::EInval);
+ if (current() == this)
+ return ex_regs(utcb);
+
Remote_syscall params;
params.thread = current_thread();