summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2023-09-08 09:24:27 -0400
committerRobert Morris <[email protected]>2023-09-08 09:24:27 -0400
commit18998096701a1d4695b2097006d7afc2a539bd89 (patch)
tree48ea20d4e59827b69a647e7e3823f40465351909 /kernel
parent74c1eba516fdb0ec1a17b16be7e76613ccba92bf (diff)
downloadxv6-labs-18998096701a1d4695b2097006d7afc2a539bd89.tar.gz
xv6-labs-18998096701a1d4695b2097006d7afc2a539bd89.tar.bz2
xv6-labs-18998096701a1d4695b2097006d7afc2a539bd89.zip
3rd lab
Diffstat (limited to 'kernel')
-rw-r--r--kernel/memlayout.h17
-rw-r--r--kernel/syscall.c15
-rw-r--r--kernel/syscall.h11
-rw-r--r--kernel/sysproc.c15
4 files changed, 54 insertions, 4 deletions
diff --git a/kernel/memlayout.h b/kernel/memlayout.h
index cac3cb1..74d2fd4 100644
--- a/kernel/memlayout.h
+++ b/kernel/memlayout.h
@@ -25,6 +25,10 @@
#define VIRTIO0 0x10001000
#define VIRTIO0_IRQ 1
+#ifdef LAB_NET
+#define E1000_IRQ 33
+#endif
+
// core local interruptor (CLINT), which contains the timer.
#define CLINT 0x2000000L
#define CLINT_MTIMECMP(hartid) (CLINT + 0x4000 + 8*(hartid))
@@ -34,8 +38,11 @@
#define PLIC 0x0c000000L
#define PLIC_PRIORITY (PLIC + 0x0)
#define PLIC_PENDING (PLIC + 0x1000)
+#define PLIC_MENABLE(hart) (PLIC + 0x2000 + (hart)*0x100)
#define PLIC_SENABLE(hart) (PLIC + 0x2080 + (hart)*0x100)
+#define PLIC_MPRIORITY(hart) (PLIC + 0x200000 + (hart)*0x2000)
#define PLIC_SPRIORITY(hart) (PLIC + 0x201000 + (hart)*0x2000)
+#define PLIC_MCLAIM(hart) (PLIC + 0x200004 + (hart)*0x2000)
#define PLIC_SCLAIM(hart) (PLIC + 0x201004 + (hart)*0x2000)
// the kernel expects there to be RAM
@@ -50,7 +57,7 @@
// map kernel stacks beneath the trampoline,
// each surrounded by invalid guard pages.
-#define KSTACK(p) (TRAMPOLINE - ((p)+1)* 2*PGSIZE)
+#define KSTACK(p) (TRAMPOLINE - (p)*2*PGSIZE - 3*PGSIZE)
// User memory layout.
// Address zero first:
@@ -59,6 +66,14 @@
// fixed-size stack
// expandable heap
// ...
+// USYSCALL (shared with kernel)
// TRAPFRAME (p->trapframe, used by the trampoline)
// TRAMPOLINE (the same page as in the kernel)
#define TRAPFRAME (TRAMPOLINE - PGSIZE)
+#ifdef LAB_PGTBL
+#define USYSCALL (TRAPFRAME - PGSIZE)
+
+struct usyscall {
+ int pid; // Process ID
+};
+#endif
diff --git a/kernel/syscall.c b/kernel/syscall.c
index ed65409..beea0ef 100644
--- a/kernel/syscall.c
+++ b/kernel/syscall.c
@@ -102,6 +102,13 @@ extern uint64 sys_link(void);
extern uint64 sys_mkdir(void);
extern uint64 sys_close(void);
+#ifdef LAB_NET
+extern uint64 sys_connect(void);
+#endif
+#ifdef LAB_PGTBL
+extern uint64 sys_pgaccess(void);
+#endif
+
// An array mapping syscall numbers from syscall.h
// to the function that handles the system call.
static uint64 (*syscalls[])(void) = {
@@ -126,8 +133,16 @@ static uint64 (*syscalls[])(void) = {
[SYS_link] sys_link,
[SYS_mkdir] sys_mkdir,
[SYS_close] sys_close,
+#ifdef LAB_NET
+[SYS_connect] sys_connect,
+#endif
+#ifdef LAB_PGTBL
+[SYS_pgaccess] sys_pgaccess,
+#endif
};
+
+
void
syscall(void)
{
diff --git a/kernel/syscall.h b/kernel/syscall.h
index bc5f356..8da572e 100644
--- a/kernel/syscall.h
+++ b/kernel/syscall.h
@@ -20,3 +20,14 @@
#define SYS_link 19
#define SYS_mkdir 20
#define SYS_close 21
+
+// System calls for labs
+#define SYS_trace 22
+#define SYS_sysinfo 23
+#define SYS_sigalarm 24
+#define SYS_sigreturn 25
+#define SYS_symlink 26
+#define SYS_mmap 27
+#define SYS_munmap 28
+#define SYS_connect 29
+#define SYS_pgaccess 30
diff --git a/kernel/sysproc.c b/kernel/sysproc.c
index 3b4d5bd..88644b2 100644
--- a/kernel/sysproc.c
+++ b/kernel/sysproc.c
@@ -1,7 +1,7 @@
#include "types.h"
#include "riscv.h"
-#include "defs.h"
#include "param.h"
+#include "defs.h"
#include "memlayout.h"
#include "spinlock.h"
#include "proc.h"
@@ -54,9 +54,8 @@ sys_sleep(void)
int n;
uint ticks0;
+
argint(0, &n);
- if(n < 0)
- n = 0;
acquire(&tickslock);
ticks0 = ticks;
while(ticks - ticks0 < n){
@@ -70,6 +69,16 @@ sys_sleep(void)
return 0;
}
+
+#ifdef LAB_PGTBL
+int
+sys_pgaccess(void)
+{
+ // lab pgtbl: your code here.
+ return 0;
+}
+#endif
+
uint64
sys_kill(void)
{