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

[tyndur-devel] [PATCH 5/6] kernel2: isf_is_userspace hinzugefügt



+ cpu.h: isf_is_userspace zum überprüfen ob es sich um ein
  Userspace-Stackframe handelt
* im.c: verwendet isf_is_userspace um noch ein Stück
  architekturunabhängiger zu werden

Signed-off-by: Andreas Freimuth <m.nemo@xxxxxxx>
---
 src/kernel2/include/arch/amd64/cpu.h |    9 +++++++++
 src/kernel2/include/arch/i386/cpu.h  |    9 +++++++++
 src/kernel2/src/interrupts/im.c      |    2 +-
 3 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/src/kernel2/include/arch/amd64/cpu.h b/src/kernel2/include/arch/amd64/cpu.h
index ec13819..0640608 100644
--- a/src/kernel2/include/arch/amd64/cpu.h
+++ b/src/kernel2/include/arch/amd64/cpu.h
@@ -66,6 +66,15 @@ typedef struct {
     uint64_t fs, gs;
 } __attribute__((packed)) interrupt_stack_frame_t;
 
+/**
+ * Überprüft ob es sich um ein Stackframe aus dem Userspace handelt.
+ *
+ * @return true wenn es ein Userspace Stackframe ist
+ */
+static inline bool isf_is_userspace(interrupt_stack_frame_t* isf) {
+    return (isf->cs & 0x3) || (isf->rflags & 0x20000);
+}
+
 typedef interrupt_stack_frame_t machine_state_t;
 
 /// Task state segment
diff --git a/src/kernel2/include/arch/i386/cpu.h b/src/kernel2/include/arch/i386/cpu.h
index db407bd..64f11b2 100644
--- a/src/kernel2/include/arch/i386/cpu.h
+++ b/src/kernel2/include/arch/i386/cpu.h
@@ -67,6 +67,15 @@ typedef struct {
     uint32_t ss;
 } __attribute__((packed)) interrupt_stack_frame_t;
 
+/**
+ * Überprüft ob es sich um ein Stackframe aus dem Userspace handelt.
+ *
+ * @return true wenn es ein Userspace Stackframe ist
+ */
+static inline bool isf_is_userspace(interrupt_stack_frame_t* isf) {
+    return (isf->cs & 0x3) || (isf->eflags & 0x20000);
+}
+
 /** Der erweiterte Interruptstackframe fuer VM86-Tasks */
 struct vm86_isf {
     interrupt_stack_frame_t isf;
diff --git a/src/kernel2/src/interrupts/im.c b/src/kernel2/src/interrupts/im.c
index 4e95be2..327ca80 100644
--- a/src/kernel2/src/interrupts/im.c
+++ b/src/kernel2/src/interrupts/im.c
@@ -99,7 +99,7 @@ interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf)
     }
 
     // Wenn der Int aus dem Userspace kommt, legen wir den zugehoerigen ISF ab
-    if ((isf->cs & 0x3) || (isf->eflags & 0x20000)) {
+    if (isf_is_userspace(isf)) {
         thread->user_isf = isf;
     }
 
-- 
1.7.4.4