IMPLEMENTATION[ia32 || ux]:
-PRIVATE inline
+PUBLIC template<typename T> inline
void FIASCO_NORETURN
-Thread::fast_return_to_user(Mword ip, Mword sp, bool = true)
+Thread::fast_return_to_user(Mword ip, Mword sp, T arg)
{
assert_kdb(cpu_lock.test());
assert_kdb(current() == this);
+ assert_kdb(Config::Is_ux || (regs()->cs() & 3 == 3));
regs()->ip(ip);
regs()->sp(sp);
+ regs()->flags(EFLAGS_IF);
asm volatile
("mov %0, %%esp \t\n"
"iret \t\n"
:
- : "r" (static_cast<Return_frame*>(regs()))
+ : "r" (static_cast<Return_frame*>(regs())), "a" (arg)
);
__builtin_trap();
}
Thread::user_sp(Mword sp)
{ regs()->sp(sp); }
-PRIVATE inline
+PROTECTED inline
int
Thread::do_trigger_exception(Entry_frame *r, void *ret_handler)
{
#endif
}
-IMPLEMENTATION[(ia32 || ux) && segments]:
-
-PRIVATE static inline
-void
-Thread::copy_utcb_to_ts_reset_segments(Thread *rcv)
-{ rcv->_gs = rcv->_fs = 0; }
-
-IMPLEMENTATION[(ia32 || ux) && !segments]:
-
-PRIVATE static inline
-void
-Thread::copy_utcb_to_ts_reset_segments(Thread *)
-{}
-
-IMPLEMENTATION[ia32 || ux]:
-
PRIVATE static inline
Return_frame *
Thread::trap_state_to_rf(Trap_state *ts)
return reinterpret_cast<Return_frame*>(im)-1;
}
-PRIVATE static inline NEEDS[Thread::copy_utcb_to_ts_reset_segments,
- Thread::trap_is_privileged,
+PRIVATE static inline NEEDS[Thread::trap_is_privileged,
Thread::trap_state_to_rf]
bool FIASCO_WARN_RESULT
Thread::copy_utcb_to_ts(L4_msg_tag const &tag, Thread *snd, Thread *rcv,
Trap_state *ts = (Trap_state*)rcv->_utcb_handler;
Mword s = tag.words();
Unsigned32 cs = ts->cs();
- Utcb *snd_utcb = snd->access_utcb();
+ Utcb *snd_utcb = snd->utcb().access();
// XXX: check that gs and fs point to valid user_entry only, for gdt and
// ldt!
else
Mem::memcpy_mwords (&ts->_gs, snd_utcb->values, s > 16 ? 16 : s);
- copy_utcb_to_ts_reset_segments(rcv);
+ // reset segments
+ rcv->_gs = rcv->_fs = 0;
if (tag.transfer_fpu() && (rights & L4_fpage::W))
snd->transfer_fpu(rcv);
ts->cs(cs);
bool ret = transfer_msg_items(tag, snd, snd_utcb,
- rcv, rcv->access_utcb(), rights);
+ rcv, rcv->utcb().access(), rights);
rcv->state_del(Thread_in_exception);
return ret;
Thread::copy_ts_to_utcb(L4_msg_tag const &, Thread *snd, Thread *rcv,
unsigned char rights)
{
- Utcb *rcv_utcb = rcv->utcb();
+ Utcb *rcv_utcb = rcv->utcb().access();
Trap_state *ts = (Trap_state*)snd->_utcb_handler;
Mword r = Utcb::Max_words;
IMPLEMENT inline NEEDS[Thread::exception_triggered]
void
Thread::user_ip(Mword ip)
-{
+{
if (exception_triggered())
_exc_cont.ip(ip);
else
}
//---------------------------------------------------------------------------
-IMPLEMENTATION [ia32 & segments]:
+IMPLEMENTATION [ia32]:
#include <feature.h>
KIP_KERNEL_FEATURE("segments");
-PRIVATE inline
+PROTECTED inline
bool
Thread::invoke_arch(L4_msg_tag &tag, Utcb *utcb)
{
if (EXPECT_FALSE(tag.words() == 1))
{
utcb->values[0] = Gdt::gdt_user_entry1 >> 3;
- tag = commit_result(0, 1);
+ tag = Kobject_iface::commit_result(0, 1);
return true;
}
if (this == current_thread())
switch_gdt_user_entries(this);
- tag = commit_result(0);
+ tag = Kobject_iface::commit_result(0);
return true;
}
};
}
-//---------------------------------------------------------------------------
-IMPLEMENTATION [ia32 && !segments]:
-
-PRIVATE inline
-bool
-Thread::invoke_arch(L4_msg_tag &tag, Utcb *utcb)
-{
- (void)tag; (void)utcb;
- return false; // not our business
-}
-
//---------------------------------------------------------------------------
IMPLEMENTATION [ia32 & (debug | kdb)]:
struct
{
Mword pdir;
- int (*handler)(Trap_state*, unsigned int);
+ FIASCO_FASTCALL int (*handler)(Trap_state*, unsigned);
void *stack;
} p;