[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