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

[tyndur-devel] [PATCH 04/11] kernel2: Privilegierte Syscalls



+ kernel2: Eine neue Art von Syscalls, die nur aus dem Kernel aufgerufen
  werden dürfen
! kernel2: Syscalls aus dem Kernel funktionieren jetzt auch mit
  Parametern, weil der richtige Stack benutzt wird

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/include/syscall.h       |    3 +++
 src/kernel2/src/arch/i386/syscall.c |   13 ++++++++++++-
 src/kernel2/src/syscall.c           |    1 +
 3 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/src/kernel2/include/syscall.h b/src/kernel2/include/syscall.h
index a359f22..f4fcb57 100644
--- a/src/kernel2/include/syscall.h
+++ b/src/kernel2/include/syscall.h
@@ -54,6 +54,9 @@ typedef struct {
     
     /// Anzahl der Argumente die der Syscall benoetigt
     size_t arg_count;
+
+    /// true, wenn der Syscall nur aus dem Kernelspace aufgerufen werden darf
+    bool privileged;
 } syscall_t;
 
 /// In diesem Array werden alle Syscalls gespeichert.
diff --git a/src/kernel2/src/arch/i386/syscall.c b/src/kernel2/src/arch/i386/syscall.c
index 4c1bba4..892c5e1 100644
--- a/src/kernel2/src/arch/i386/syscall.c
+++ b/src/kernel2/src/arch/i386/syscall.c
@@ -64,7 +64,7 @@ void syscall_arch(machine_state_t* isf)
 // "Kompatibel" zu kernel1
 void syscall_arch(machine_state_t* isf)
 {
-    uint32_t* stack = (uint32_t*) isf->esp;
+    uint32_t* stack;
     uint32_t number = isf->eax;
     //kprintf("Syscall %d", number);
 
@@ -74,6 +74,17 @@ void syscall_arch(machine_state_t* isf)
     }
 
     void* handler = syscalls[number].handler;
+    if (isf_is_userspace(isf)) {
+        if (syscalls[number].privileged) {
+            // FIXME: Hier sollte nur der Prozess beendet werden
+            panic("Privilegierter Syscall %d", number);
+        }
+        stack = (uint32_t*) isf->esp;
+    } else {
+        /* esp wird bei Interrupt in Ring 0 nicht gepusht, das ist also der
+         * erste "alte" Stackinhalt */
+        stack = (uint32_t*) &isf->esp;
+    }
 
     if (debug_test_flag(DEBUG_FLAG_SYSCALL)) {
         kprintf("[PID %d] Syscall:%d\n", current_process->pid, isf->eax);
diff --git a/src/kernel2/src/syscall.c b/src/kernel2/src/syscall.c
index f401ea0..f663915 100644
--- a/src/kernel2/src/syscall.c
+++ b/src/kernel2/src/syscall.c
@@ -143,4 +143,5 @@ void syscall_register(syscall_arg_t number, void* handler, size_t arg_count)
     }
     syscalls[number].handler = handler;
     syscalls[number].arg_count = arg_count;
+    syscalls[number].privileged = false;
 }
-- 
1.7.7