summaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/cow.c54
1 files changed, 54 insertions, 0 deletions
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();
+}