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

[PATCH v3] kernel/syscall: neue Funktion für das Registrieren von Kernel-Syscalls



* Aktuell gibt es lediglich einen Kernel-Syscall(KERN_SYSCALL_PM_SLEEP).
  Dieser Syscall wurde bisher manuell in die globale Syscall-Liste
  eingetragen. Um das Registrieren von Kernel-Syscalls zu vereinfachen,
  implementiert dieser Commit die Funktion syscall_register_full().

Signed-off-by: Nico Mayer <mayerNico@xxxxxxxxxx>
---
 src/kernel/include/syscall.h |  4 ++++
 src/kernel/src/syscall.c     | 27 ++++++++++++++++++++-------
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/kernel/include/syscall.h b/src/kernel/include/syscall.h
index ad941e85..1075c5c9 100644
--- a/src/kernel/include/syscall.h
+++ b/src/kernel/include/syscall.h
@@ -70,6 +70,10 @@ void syscall_arch(machine_state_t* isf);
 /// Einen neuen Syscall verfuegbar machen
 void syscall_register(syscall_arg_t number, void* handler, size_t arg_count);
 
+/// Einen neuen Syscall verfuegbar machen
+void syscall_register_full(syscall_arg_t number, void* handler,
+                           size_t arg_count, bool privileged);
+
 /// Syscalls initialisieren
 void syscall_init(void);
 
diff --git a/src/kernel/src/syscall.c b/src/kernel/src/syscall.c
index f74dbebe..21d1115b 100644
--- a/src/kernel/src/syscall.c
+++ b/src/kernel/src/syscall.c
@@ -151,11 +151,8 @@ void syscall_init()
     syscall_register(SYSCALL_LIO_SRV_OP_DONE, &syscall_lio_srv_op_done, 3);
     syscall_register(SYSCALL_LIO_SRV_WAIT, &syscall_lio_srv_wait, 0);
 
-    syscalls[KERN_SYSCALL_PM_SLEEP] = (syscall_t) {
-        .handler    = &kern_syscall_pm_sleep,
-        .arg_count  = 2,
-        .privileged = true,
-    };
+    syscall_register_full(KERN_SYSCALL_PM_SLEEP,
+                          &kern_syscall_pm_sleep, 2, true);
 }
 
 /**
@@ -167,14 +164,30 @@ void syscall_init()
  *                  werden muessen.
  */
 void syscall_register(syscall_arg_t number, void* handler, size_t arg_count)
+{
+    syscall_register_full(number, handler, arg_count, false);
+}
+
+/**
+ * Einen neuen Syscall registrieren
+ *
+ * @param number Syscallnummer (syscallno.h!)
+ * @param handler Adresse der Handler-Funktion
+ * @param arg_count Anzahl der Argumente, die fuer diesen Syscall uebergeben
+ *                  werden muessen.
+ * @param privileged Bei 'true' darf der Syscall nur durch einen
+ *                   Kernel-Thread verwendet werden.
+ */
+void syscall_register_full(syscall_arg_t number, void* handler,
+                           size_t arg_count, bool privileged)
 {
     // Ein Syscall mit einer zu grossen ID wuerde dazu fuehren, dass Teile von
     // Kernel-Daten ueberschrieben wuerden
     if (number >= SYSCALL_MAX) {
         panic("Es wurde versucht einen Syscall mit einer Nummer groesser als"
-                "SYSCALL_MAX zu reservieren!");
+              "SYSCALL_MAX zu reservieren!");
     }
     syscalls[number].handler = handler;
     syscalls[number].arg_count = arg_count;
-    syscalls[number].privileged = false;
+    syscalls[number].privileged = privileged;
 }
-- 
2.29.2