From 59d36a7c8e7ec7e5e6cd47990e563f3947bb3ab9 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 9 Aug 2024 07:58:00 +0200 Subject: [PATCH 1/3] Halt draft --- Makefile | 1 + kernel/syscall.c | 3 ++- kernel/syscall.h | 1 + kernel/sysproc.c | 6 ++++++ user/halt.c | 9 +++++++++ user/user.h | 3 +++ user/usys.pl | 3 ++- 7 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 user/halt.c diff --git a/Makefile b/Makefile index f8cc863..1363245 100644 --- a/Makefile +++ b/Makefile @@ -135,6 +135,7 @@ UPROGS=\ $U/_wc\ $U/_zombie\ $U/_clear\ + $U/_halt\ 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 075fb36..a027276 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -102,6 +102,7 @@ extern u64 sys_link(void); extern u64 sys_mkdir(void); extern u64 sys_close(void); extern u64 sys_trace(void); +extern u64 sys_halt(void); // An array mapping syscall numbers from syscall.h // to the function that handles the system call. @@ -111,7 +112,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_close] = sys_close, [SYS_trace] = sys_trace, [SYS_halt] = sys_halt, }; void diff --git a/kernel/syscall.h b/kernel/syscall.h index dfc9645..0162584 100644 --- a/kernel/syscall.h +++ b/kernel/syscall.h @@ -23,3 +23,4 @@ #define SYS_mkdir 20 #define SYS_close 21 #define SYS_trace 22 +#define SYS_halt 23 diff --git a/kernel/sysproc.c b/kernel/sysproc.c index 5645c72..ba0aeb9 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -96,3 +96,9 @@ sys_trace(void) /* TODO: Implement sys_trace */ return 0; } + +void +sys_halt(void) +{ + /* TODO: Implement sys_halt */ +} diff --git a/user/halt.c b/user/halt.c new file mode 100644 index 0000000..ab73dd3 --- /dev/null +++ b/user/halt.c @@ -0,0 +1,9 @@ +#include "user.h" + +/** Stops the machine */ +int +main(int argc, char *argv[]) +{ + halt(); + return 0; +} diff --git a/user/user.h b/user/user.h index 1e56f3d..ed10ca8 100644 --- a/user/user.h +++ b/user/user.h @@ -74,6 +74,9 @@ int uptime(void); /** trace */ int trace(int); +/** halt */ +void halt(void); + /** * Library functions (ulib.c) */ diff --git a/user/usys.pl b/user/usys.pl index 9c97b05..cdaec02 100755 --- a/user/usys.pl +++ b/user/usys.pl @@ -14,7 +14,7 @@ sub entry { print " ecall\n"; print " ret\n"; } - + entry("fork"); entry("exit"); entry("wait"); @@ -37,3 +37,4 @@ entry("sbrk"); entry("sleep"); entry("uptime"); entry("trace"); +entry("halt"); From d6dd26c67e1317ab3d67483c447500400f689089 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 9 Aug 2024 07:59:03 +0200 Subject: [PATCH 2/3] Documentation --- kernel/defs.h | 30 +++++++++++++++++++++++++++--- kernel/kalloc.c | 15 +++++---------- kernel/kernel.ld | 16 +++++++++++++++- kernel/proc.c | 5 ++--- 4 files changed, 49 insertions(+), 17 deletions(-) diff --git a/kernel/defs.h b/kernel/defs.h index a89c445..ecbcf26 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -64,10 +64,34 @@ void ramdiskinit(void); void ramdiskintr(void); void ramdiskrw(struct buf *); -// kalloc.c +/** + * Kernel memory allocator + * + * Allocate one 4096-byte page of physical memory. + * Returns a pointer that the kernel can use. + * Returns 0 if the memory cannot be allocated. + * See: kalloc.c + */ void *kalloc(void); -void kfree(void *); -void kinit(void); + +/** + * Kernel memory allocator + * + * Free the page of physical memory pointed at by pa, + * which normally should have been returned by a + * call to kalloc(). (The exception is when + * initializing the allocator; see kinit above.) + * See: kalloc.c + */ +void kfree(void *); + +/** + * Initialize kernel memory allocator + * + * Called by main() on the way to the kernel's main loop. + * See: kalloc.c + */ +void kinit(void); // log.c void initlog(int, struct superblock *); diff --git a/kernel/kalloc.c b/kernel/kalloc.c index a3de3d5..b880933 100644 --- a/kernel/kalloc.c +++ b/kernel/kalloc.c @@ -3,21 +3,23 @@ // and pipe buffers. Allocates whole 4096-byte pages. #include "types.h" -#include "param.h" #include "memlayout.h" #include "spinlock.h" #include "riscv.h" #include "defs.h" +/** Free list of physical pages. */ void freerange(void *pa_start, void *pa_end); -extern char end[]; // first address after kernel. - // defined by kernel.ld. +/** first address after kernel. defined by kernel.ld. */ +extern char end[]; +/** A run is a node in the free list. */ struct run { struct run *next; }; +/** Kernel memory allocator. */ struct { struct spinlock lock; struct run *freelist; @@ -39,10 +41,6 @@ freerange(void *pa_start, void *pa_end) kfree(p); } -// Free the page of physical memory pointed at by pa, -// which normally should have been returned by a -// call to kalloc(). (The exception is when -// initializing the allocator; see kinit above.) void kfree(void *pa) { @@ -62,9 +60,6 @@ kfree(void *pa) release(&kmem.lock); } -// Allocate one 4096-byte page of physical memory. -// Returns a pointer that the kernel can use. -// Returns 0 if the memory cannot be allocated. void * kalloc(void) { diff --git a/kernel/kernel.ld b/kernel/kernel.ld index 7ab21d8..2844edf 100644 --- a/kernel/kernel.ld +++ b/kernel/kernel.ld @@ -15,12 +15,25 @@ SECTIONS * that reference the functions in your object file. */ .text : { + /* Match any section that starts with .text. */ *(.text .text.*) + + /* Align the next section to a 4KB (page) boundary. */ . = ALIGN(0x1000); + + /* Put the trampoline code here. */ _trampoline = .; + + /* Match any section that starts with .trampsec. */ *(trampsec) + + /* Align the next section to a 4KB (page) boundary. */ . = ALIGN(0x1000); + + /* Assert that the trampoline code is exactly 4KB (page) in size. */ ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page"); + + /* Define symbol etext to be the current location. */ PROVIDE(etext = .); } @@ -29,6 +42,7 @@ SECTIONS * It is not unusual to find this data interleaved with the text section. */ .rodata : { + /* Align on quadword boundary. */ . = ALIGN(16); *(.srodata .srodata.*) /* do not need to distinguish this from .rodata */ . = ALIGN(16); @@ -59,6 +73,6 @@ SECTIONS *(.bss .bss.*) } - /* PROVIDE, see vm.c */ + /* Define symbol end as current location, note that this is not aligned, see vm.c */ PROVIDE(end = .); } diff --git a/kernel/proc.c b/kernel/proc.c index 58a3160..ccccf79 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -650,9 +650,8 @@ either_copyin(void *dst, int user_src, u64 src, u64 len) void procdump(void) { - static char *states[] = { - [UNUSED] "unused", [USED] "used", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie" - }; + static char *states[] = { [UNUSED] = "unused", [USED] = "used", [SLEEPING] = "sleep ", + [RUNNABLE] = "runble", [RUNNING] = "run ", [ZOMBIE] = "zombie" }; struct proc *p; char *state; From ced7c79bd81372f01354dfd36d913b00dee6520c Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 9 Aug 2024 07:59:10 +0200 Subject: [PATCH 3/3] Unused includes --- kernel/trap.c | 1 - 1 file changed, 1 deletion(-) diff --git a/kernel/trap.c b/kernel/trap.c index 359fe39..3db4558 100644 --- a/kernel/trap.c +++ b/kernel/trap.c @@ -1,5 +1,4 @@ #include "types.h" -#include "param.h" #include "memlayout.h" #include "riscv.h" #include "spinlock.h"