aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-05-19 01:01:11 -0400
committerIan Moffett <ian@osmora.org>2025-05-19 01:01:11 -0400
commitffa5a3c2dd4eb887821699ba434cbb6eb93b23b8 (patch)
tree39fa351b199cfff93b605cbf5e4bdd3b486480b3
parent5138d871202317c7432549b1ac663f26eb3a8759 (diff)
kernel: syscall: Add SYS_reboot syscall
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/arch/amd64/amd64/reboot.c10
-rw-r--r--sys/include/sys/reboot.h4
-rw-r--r--sys/include/sys/syscall.h1
-rw-r--r--sys/kern/kern_syscall.c2
4 files changed, 16 insertions, 1 deletions
diff --git a/sys/arch/amd64/amd64/reboot.c b/sys/arch/amd64/amd64/reboot.c
index 64db09e..d47a352 100644
--- a/sys/arch/amd64/amd64/reboot.c
+++ b/sys/arch/amd64/amd64/reboot.c
@@ -50,3 +50,13 @@ cpu_reboot(int method)
outb(0x64, 0xFE);
}
}
+
+/*
+ * arg0: Method bits
+ */
+scret_t
+sys_reboot(struct syscall_args *scargs)
+{
+ cpu_reboot(scargs->arg0);
+ __builtin_unreachable();
+}
diff --git a/sys/include/sys/reboot.h b/sys/include/sys/reboot.h
index eeb55f8..846073d 100644
--- a/sys/include/sys/reboot.h
+++ b/sys/include/sys/reboot.h
@@ -32,13 +32,15 @@
#include <sys/param.h>
#include <sys/cdefs.h>
+#include <sys/syscall.h>
-#if defined(_KERNEL)
#define REBOOT_RESET 0x00000000
#define REBOOT_HALT BIT(0) /* Halt instead of rebooting */
#define REBOOT_POWEROFF BIT(1) /* Power off (needs REBOOT_HALT set too) */
void cpu_reboot(int method);
+#if defined(_KERNEL)
+scret_t sys_reboot(struct syscall_args *scargs);
#endif /* _KERNEL */
#endif /* _SYS_REBOOT_H_ */
diff --git a/sys/include/sys/syscall.h b/sys/include/sys/syscall.h
index 16c4b17..2223a96 100644
--- a/sys/include/sys/syscall.h
+++ b/sys/include/sys/syscall.h
@@ -47,6 +47,7 @@
#define SYS_sysctl 6
#define SYS_write 7
#define SYS_spawn 8
+#define SYS_reboot 9
#if defined(_KERNEL)
/* Syscall return value and arg type */
diff --git a/sys/kern/kern_syscall.c b/sys/kern/kern_syscall.c
index bc61fa6..249a04a 100644
--- a/sys/kern/kern_syscall.c
+++ b/sys/kern/kern_syscall.c
@@ -29,6 +29,7 @@
#include <sys/syscall.h>
#include <sys/sysctl.h>
+#include <sys/reboot.h>
#include <sys/types.h>
#include <sys/proc.h>
#include <sys/vfs.h>
@@ -43,6 +44,7 @@ scret_t(*g_sctab[])(struct syscall_args *) = {
sys_sysctl, /* SYS_sysctl */
sys_write, /* SYS_write */
sys_spawn, /* SYS_spawn */
+ sys_reboot, /* SYS_reboot */
};
const size_t MAX_SYSCALLS = NELEM(g_sctab);