From 3247689ab2dfdd410b39da105eca42dbb435f148 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 31 Mar 2025 19:48:14 +0200 Subject: [PATCH] Reset kernel code + userspace program --- Makefile | 1 + kernel/syscall.c | 3 ++- kernel/syscall.h | 1 + kernel/sysproc.c | 11 ++++++++++- user/reset.c | 10 ++++++++++ user/user.h | 3 +++ user/usys.py | 1 + 7 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 user/reset.c diff --git a/Makefile b/Makefile index ed77f93..c060b88 100644 --- a/Makefile +++ b/Makefile @@ -136,6 +136,7 @@ UPROGS=\ $U/_zombie\ $U/_clear\ $U/_halt\ + $U/_reset\ fs.img: mkfs/mkfs README.md $(UPROGS) mkfs/mkfs fs.img README.md $(UPROGS) diff --git a/kernel/syscall.c b/kernel/syscall.c index a027276..da3ef63 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -103,6 +103,7 @@ extern u64 sys_mkdir(void); extern u64 sys_close(void); extern u64 sys_trace(void); extern u64 sys_halt(void); +extern u64 sys_reset(void); // An array mapping syscall numbers from syscall.h // to the function that handles the system call. @@ -112,7 +113,7 @@ static u64 (*syscalls[])(void) = { [SYS_chdir] = sys_chdir, [SYS_dup] = sys_dup, [SYS_getpid] = sys_getpid, [SYS_sbrk] = sys_sbrk, [SYS_sleep] = sys_sleep, [SYS_uptime] = sys_uptime, [SYS_open] = sys_open, [SYS_write] = sys_write, [SYS_mknod] = sys_mknod, [SYS_unlink] = sys_unlink, [SYS_link] = sys_link, [SYS_mkdir] = sys_mkdir, - [SYS_close] = sys_close, [SYS_trace] = sys_trace, [SYS_halt] = sys_halt, + [SYS_close] = sys_close, [SYS_trace] = sys_trace, [SYS_halt] = sys_halt, [SYS_reset] = sys_reset, }; void diff --git a/kernel/syscall.h b/kernel/syscall.h index 0162584..e6bd0e4 100644 --- a/kernel/syscall.h +++ b/kernel/syscall.h @@ -24,3 +24,4 @@ #define SYS_close 21 #define SYS_trace 22 #define SYS_halt 23 +#define SYS_reset 24 diff --git a/kernel/sysproc.c b/kernel/sysproc.c index 8c1f1d5..954f48f 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -101,5 +101,14 @@ void sys_halt(void) { (*(volatile u32 *)QEMU_POWER) = 0x5555; - panic("sys_poweroff"); + panic("sys_halt"); +} + +void +sys_reset(void) +{ + // TODO: Revisit and review + // asm volatile("j _entry"); + (*(volatile u32 *)QEMU_POWER) = 0x3333; + panic("sys_reset"); } diff --git a/user/reset.c b/user/reset.c new file mode 100644 index 0000000..d6962e7 --- /dev/null +++ b/user/reset.c @@ -0,0 +1,10 @@ +#include "user.h" + +/** Reset the machine */ +int +main(int argc, char *argv[]) +{ + printf("System resetting...\n"); + reset(); + return 0; +} diff --git a/user/user.h b/user/user.h index d889278..17b053f 100644 --- a/user/user.h +++ b/user/user.h @@ -80,6 +80,9 @@ int trace(int); /** halt */ void halt(void); +/** halt */ +void reset(void); + /** * Library functions (ulib.c) */ diff --git a/user/usys.py b/user/usys.py index f17f05d..01c25cd 100755 --- a/user/usys.py +++ b/user/usys.py @@ -40,6 +40,7 @@ syscalls = [ "uptime", "trace", "halt", + "reset", ] assembly = "\n\n".join(map(genstub, syscalls))