]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/ia32/32/thread-ia32-32.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 32 / thread-ia32-32.cpp
index 2a1dd2751be4b09f436a4bc85efcac8ba15b023e..655577a9db902469edcaf5ad0efa81c8d4b0fc46 100644 (file)
@@ -1,19 +1,21 @@
 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();
 }
@@ -28,7 +30,7 @@ void
 Thread::user_sp(Mword sp)
 { regs()->sp(sp); }
 
-PRIVATE inline
+PROTECTED inline
 int
 Thread::do_trigger_exception(Entry_frame *r, void *ret_handler)
 {
@@ -61,22 +63,6 @@ Thread::restore_exc_state()
 #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)
@@ -85,8 +71,7 @@ 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,
@@ -95,7 +80,7 @@ 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!
@@ -114,7 +99,8 @@ Thread::copy_utcb_to_ts(L4_msg_tag const &tag, Thread *snd, Thread *rcv,
   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);
@@ -127,7 +113,7 @@ Thread::copy_utcb_to_ts(L4_msg_tag const &tag, Thread *snd, Thread *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;
@@ -138,7 +124,7 @@ bool FIASCO_WARN_RESULT
 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;
 
@@ -168,7 +154,7 @@ IMPLEMENTATION [ia32 && !ux]:
 IMPLEMENT inline NEEDS[Thread::exception_triggered]
 void
 Thread::user_ip(Mword ip)
-{ 
+{
   if (exception_triggered())
     _exc_cont.ip(ip);
   else
@@ -268,12 +254,12 @@ Thread::user_invoke()
 }
 
 //---------------------------------------------------------------------------
-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)
 {
@@ -285,7 +271,7 @@ 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;
         }
 
@@ -305,7 +291,7 @@ Thread::invoke_arch(L4_msg_tag &tag, Utcb *utcb)
           if (this == current_thread())
             switch_gdt_user_entries(this);
 
-          tag = commit_result(0);
+          tag = Kobject_iface::commit_result(0);
           return true;
         }
 
@@ -314,17 +300,6 @@ Thread::invoke_arch(L4_msg_tag &tag, Utcb *utcb)
     };
 }
 
-//---------------------------------------------------------------------------
-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)]:
 
@@ -359,7 +334,7 @@ Thread::call_nested_trap_handler(Trap_state *ts)
   struct
   {
     Mword pdir;
-    int (*handler)(Trap_state*, unsigned int);
+    FIASCO_FASTCALL int (*handler)(Trap_state*, unsigned);
     void *stack;
   } p;