[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: Timer duerfen eax nicht kaputtmachen



! kernel2: Timer fuehren einen RPC zum Prozess mit dem abgelaufenen
  Timer aus und haben sich wie ein Syscall verhalten - das geht so weit,
  dass sie in eax 0 als Rueckgabewert abgelegt haben. Das ist natuerlich
  eher ungeschickt, wenn der Prozess eigentlich gar nicht selber nach
  einem RPC gefragt hat, sondern sein eax noch braucht...

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/syscalls/rpc.c |   17 +++++++++--------
 src/kernel2/src/timer.c        |    6 ++++--
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/kernel2/src/syscalls/rpc.c b/src/kernel2/src/syscalls/rpc.c
index c9328e7..0157f51 100644
--- a/src/kernel2/src/syscalls/rpc.c
+++ b/src/kernel2/src/syscalls/rpc.c
@@ -124,14 +124,14 @@ static void adjust_stack_size(pm_thread_t* callee,
  * @param metadata      Pointer auf die Metadaten
  * @param data_size     Länger der Daten in Bytes
  * @param data          Pointer auf die Daten
- * @param irq           TRUE wenn es sich um einen IRQ handelt, FALSE sonst
+ * @param syscall       TRUE wenn es sich um einen Syscall handelt, FALSE sonst
  *
  * @return TRUE, wenn der Aufruf erfolgreich durchgeführt wurde, FALSE
  * sonst. Bei FALSE als Rückgabe sollte der aufrufende Task den RPC-Syscall
  * wiederholen.
  */
-static int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
-    size_t data_size, void* data, bool irq)
+int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
+    size_t data_size, void* data, bool syscall)
 {
     pm_process_t* process = pm_get(callee_pid);
     pm_thread_t* callee;
@@ -220,9 +220,10 @@ static int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
     rpc->eflags  = callee_isf->eflags;
     rpc->caller  = current_thread;
 
-    if ((callee == current_thread) && !irq) {
-        // Bei einem Self-RPC, der kein IRQ war, muss hinterher der
-        // Rueckgabewert des RPC-Syscalls in eax stehen. Ein IRQ erscheint auch
+    if ((callee == current_thread) && syscall) {
+        // Bei einem Self-RPC, der ein Syscall war (kein kernelinterner Aufruf
+        // wie z.B. fuer  IRQ oder Timer), muss hinterher der Rueckgabewert
+        // des RPC-Syscalls in eax stehen. Ein IRQ erscheint auch
         // als Self-RPC, darf aber eax nicht kaputt machen, da dort kein
         // Rueckgabewert erwartet wird, sondern der vorherige Wert.
         rpc->eax = 0;
@@ -311,7 +312,7 @@ int syscall_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
     size_t data_size, void* data)
 {
     return do_fastrpc(callee_pid, metadata_size, metadata, data_size, data,
-        FALSE);
+        TRUE);
 }
 
 /**
@@ -332,7 +333,7 @@ bool fastrpc_irq(pm_process_t* callee, size_t metadata_size, void* metadata,
     }
 
     ret = do_fastrpc(
-        callee->pid, metadata_size, metadata, data_size, data, TRUE);
+        callee->pid, metadata_size, metadata, data_size, data, FALSE);
 
     if (ret < 0) {
         return FALSE;
diff --git a/src/kernel2/src/timer.c b/src/kernel2/src/timer.c
index 64c13e9..9aea68d 100644
--- a/src/kernel2/src/timer.c
+++ b/src/kernel2/src/timer.c
@@ -40,6 +40,8 @@
 #include "syscall.h"
 
 extern uint64_t timer_ticks;
+extern int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
+    size_t data_size, void* data, bool syscall);
 
 /**
  * Liste aller registrierten Timer
@@ -121,9 +123,9 @@ void timer_notify(uint64_t microtime)
         // Task per RPC informieren, dass der Timer abgelaufen ist.
         // Im Fehlerfall ueberspringen und es beim naechsten Mal nochmal
         // versuchen.
-        if (syscall_fastrpc(item->task->pid,
+        if (do_fastrpc(item->task->pid,
                 4, (char*) &rpc_timer_function,
-                4, (char*) &item->timer_id))
+                4, (char*) &item->timer_id, FALSE))
         {
             i++;
             continue;
-- 
1.6.0.2