[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] 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 kern_syscall_register(). Der
Aufbau dieser Funktion orientiert sich dabei an der Funktion
syscall_register().
---
src/kernel/include/syscall.h | 3 +++
src/kernel/src/syscall.c | 29 ++++++++++++++++++++++++-----
2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/src/kernel/include/syscall.h b/src/kernel/include/syscall.h
index ad941e85..ccee654a 100644
--- a/src/kernel/include/syscall.h
+++ b/src/kernel/include/syscall.h
@@ -70,6 +70,9 @@ 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 Kernel-Syscall verfuegbar machen
+void kern_syscall_register(syscall_arg_t number, void* handler, size_t arg_count);
+
/// Syscalls initialisieren
void syscall_init(void);
diff --git a/src/kernel/src/syscall.c b/src/kernel/src/syscall.c
index f74dbebe..4ac0159f 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,
- };
+
+ kern_syscall_register(KERN_SYSCALL_PM_SLEEP, &kern_syscall_pm_sleep, 2);
}
/**
@@ -178,3 +175,25 @@ void syscall_register(syscall_arg_t number, void* handler, size_t arg_count)
syscalls[number].arg_count = arg_count;
syscalls[number].privileged = false;
}
+
+/**
+ * Einen neuen Kernel-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.
+ */
+void kern_syscall_register(syscall_arg_t number, void* handler, size_t arg_count)
+{
+
+ // 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 Kernel-Syscall mit einer Nummer groesser als"
+ "SYSCALL_MAX zu reservieren!");
+ }
+ syscalls[number].handler = handler;
+ syscalls[number].arg_count = arg_count;
+ syscalls[number].privileged = true;
+}
--
2.29.2