From cc486ddee0c617ab2a0bd000b4674e1094661386 Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Wed, 24 Aug 2022 08:57:56 -0400 Subject: Help students read this C syntax --- kernel/syscall.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'kernel') diff --git a/kernel/syscall.c b/kernel/syscall.c index ee94696..ed65409 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -79,6 +79,7 @@ argstr(int n, char *buf, int max) return fetchstr(addr, buf, max); } +// Prototypes for the functions that handle system calls. extern uint64 sys_fork(void); extern uint64 sys_exit(void); extern uint64 sys_wait(void); @@ -101,6 +102,8 @@ extern uint64 sys_link(void); extern uint64 sys_mkdir(void); extern uint64 sys_close(void); +// An array mapping syscall numbers from syscall.h +// to the function that handles the system call. static uint64 (*syscalls[])(void) = { [SYS_fork] sys_fork, [SYS_exit] sys_exit, @@ -133,6 +136,8 @@ syscall(void) num = p->trapframe->a7; if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { + // Use num to lookup the system call function for num, call it, + // and store its return value in p->trapframe->a0 p->trapframe->a0 = syscalls[num](); } else { printf("%d %s: unknown sys call %d\n", -- cgit v1.2.3 From 9c1b8a4eb085d7c639c2039fc14beba83d95653e Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Wed, 24 Aug 2022 13:24:24 -0400 Subject: sfence before writing satp, as well as after --- kernel/fs.c | 2 +- kernel/trampoline.S | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/fs.c b/kernel/fs.c index dea5864..c6bab15 100644 --- a/kernel/fs.c +++ b/kernel/fs.c @@ -194,7 +194,7 @@ static struct inode* iget(uint dev, uint inum); // Allocate an inode on device dev. // Mark it as allocated by giving it type type. // Returns an unlocked but allocated and referenced inode, -// or NULL if there is no free inode.. +// or NULL if there is no free inode. struct inode* ialloc(uint dev, short type) { diff --git a/kernel/trampoline.S b/kernel/trampoline.S index 0aaa413..7fb0b36 100644 --- a/kernel/trampoline.S +++ b/kernel/trampoline.S @@ -82,6 +82,7 @@ uservec: # load the kernel page table, from p->trapframe->kernel_satp ld t1, 0(a0) + sfence.vma zero, zero csrw satp, t1 sfence.vma zero, zero @@ -96,6 +97,7 @@ userret: # a0: user page table, for satp. # switch to the user page table. + sfence.vma zero, zero csrw satp, a0 sfence.vma zero, zero -- cgit v1.2.3 From 581bc4cbd1f6f5c207e729b78fac4328aef01228 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Wed, 24 Aug 2022 13:42:59 -0400 Subject: sfence before enabling paging --- kernel/vm.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'kernel') diff --git a/kernel/vm.c b/kernel/vm.c index 284b72d..9f69783 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -61,7 +61,12 @@ kvminit(void) void kvminithart() { + // wait for any previous writes to the page table memory to finish. + sfence_vma(); + w_satp(MAKE_SATP(kernel_pagetable)); + + // flush stale entries from the TLB. sfence_vma(); } -- cgit v1.2.3 From ed101befeefe470e49bec32b9f4efd600bdbda46 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Wed, 24 Aug 2022 13:47:47 -0400 Subject: comment the sfences --- kernel/trampoline.S | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/trampoline.S b/kernel/trampoline.S index 7fb0b36..d7308cc 100644 --- a/kernel/trampoline.S +++ b/kernel/trampoline.S @@ -80,10 +80,18 @@ uservec: # load the address of usertrap(), from p->trapframe->kernel_trap ld t0, 16(a0) - # load the kernel page table, from p->trapframe->kernel_satp + + # fetch the kernel page table address, from p->trapframe->kernel_satp. ld t1, 0(a0) + + # wait for any previous memory operations to complete, so that + # they use the user page table. sfence.vma zero, zero + + # install the kernel page table. csrw satp, t1 + + # flush now-stale user entries from the TLB. sfence.vma zero, zero # jump to usertrap(), which does not return -- cgit v1.2.3