[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