From abfe9999f447c15d904b3c11f32d4a22a45470a0 Mon Sep 17 00:00:00 2001
From: Robert Morris <rtm@csail.mit.edu>
Date: Mon, 1 Jul 2019 17:46:06 -0400
Subject: have fork() fail, not panic, if not enough phys mem

---
 user/cow.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 user/cow.c

(limited to 'user/cow.c')

diff --git a/user/cow.c b/user/cow.c
new file mode 100644
index 0000000..f770cc9
--- /dev/null
+++ b/user/cow.c
@@ -0,0 +1,54 @@
+//
+// tests for copy-on-write fork() assignment.
+//
+
+#include "kernel/types.h"
+#include "kernel/memlayout.h"
+#include "user/user.h"
+
+// allocate more than half of physical memory,
+// then fork. this will fail in the default
+// kernel, which does not support copy-on-write.
+void
+simpletest()
+{
+  uint64 phys_size = PHYSTOP - KERNBASE;
+  int sz = (phys_size / 3) * 2;
+
+  printf(1, "simple: ");
+  
+  char *p = sbrk(sz);
+  if(p == (char*)0xffffffffffffffffL){
+    printf(1, "sbrk(%d) failed\n", sz);
+    exit();
+  }
+
+  for(char *q = p; q < p + sz; q += 4096){
+    *(int*)q = getpid();
+  }
+
+  int pid = fork();
+  if(pid < 0){
+    printf(1, "fork() failed\n");
+    exit();
+  }
+
+  if(pid == 0)
+    exit();
+
+  wait();
+
+  if(sbrk(-sz) == (char*)0xffffffffffffffffL){
+    printf(1, "sbrk(-%d) failed\n", sz);
+    exit();
+  }
+
+  printf(1, "simple ok\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+  simpletest();
+  exit();
+}
-- 
cgit v1.2.3