summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Make.config4
-rw-r--r--src/examples/Makefile4
-rw-r--r--src/examples/create.c14
-rw-r--r--src/userprog/process.c4
-rw-r--r--src/userprog/syscall.c46
-rwxr-xr-x[-rw-r--r--]src/utils/backtrace0
-rwxr-xr-x[-rw-r--r--]src/utils/pintos-gdb0
-rwxr-xr-x[-rw-r--r--]src/utils/pintos-mkdisk0
8 files changed, 66 insertions, 6 deletions
diff --git a/src/Make.config b/src/Make.config
index f5c6705..1301180 100644
--- a/src/Make.config
+++ b/src/Make.config
@@ -11,12 +11,12 @@ VPATH = $(SRCDIR)
X86 = i.86\|pentium.*\|[pk][56]\|nexgen\|viac3\|6x86\|athlon.*\|i86pc
X86_64 = x86_64
ifneq (0, $(shell expr `uname -m` : '$(X86)'))
- CC = gcc
+ CC = gcc-4.8
LD = ld
OBJCOPY = objcopy
else
ifneq (0, $(shell expr `uname -m` : '$(X86_64)'))
- CC = gcc -m32
+ CC = gcc-4.8 -m32
LD = ld -melf_i386
OBJCOPY = objcopy
else
diff --git a/src/examples/Makefile b/src/examples/Makefile
index 5517532..a89a3e3 100644
--- a/src/examples/Makefile
+++ b/src/examples/Makefile
@@ -8,6 +8,10 @@ PROGS = cat cmp cp echo halt hex-dump ls mcat mcp mkdir pwd rm shell \
sumargv lab2test lab1test lab1test2 pfs pfs_reader pfs_writer dummy longrun \
child parent create-bad printf
+PROGS += create
+
+create_SRC = create.c
+
# Added test programs
printf_SRC = printf.c
sumargv_SRC = sumargv.c
diff --git a/src/examples/create.c b/src/examples/create.c
new file mode 100644
index 0000000..4805e18
--- /dev/null
+++ b/src/examples/create.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <syscall.h>
+
+int
+main (int argc, char *argv[])
+{
+ if (create("test", 1)) {
+ printf("created file\n");
+ halt();
+ } else {
+ printf("couldn't create file\n");
+ halt();
+ }
+}
diff --git a/src/userprog/process.c b/src/userprog/process.c
index b3e16bb..45aaaa4 100644
--- a/src/userprog/process.c
+++ b/src/userprog/process.c
@@ -88,7 +88,7 @@ start_process (void *file_name_)
int
process_wait (tid_t child_tid UNUSED)
{
- return -1;
+ for (;;) {}
}
/* Free the current process's resources. */
@@ -476,7 +476,7 @@ setup_stack (void **esp)
{
success = install_page (((uint8_t *) PHYS_BASE) - PGSIZE, kpage, true);
if (success)
- *esp = PHYS_BASE;
+ *esp = PHYS_BASE - 12;
else
palloc_free_page (kpage);
}
diff --git a/src/userprog/syscall.c b/src/userprog/syscall.c
index 370c89b..5e5a6f1 100644
--- a/src/userprog/syscall.c
+++ b/src/userprog/syscall.c
@@ -4,6 +4,10 @@
#include "threads/interrupt.h"
#include "threads/thread.h"
+#include "threads/init.h"
+#include "filesys/filesys.h"
+#include "filesys/off_t.h"
+
static void syscall_handler (struct intr_frame *);
void
@@ -12,9 +16,47 @@ syscall_init (void)
intr_register_int (0x30, 3, INTR_ON, syscall_handler, "syscall");
}
+// cast to TYPE and deref argument N from f->esp
+#define INTR_ESP(N, TYPE) *(TYPE *)(f->esp+(4*(N)))
+
static void
syscall_handler (struct intr_frame *f UNUSED)
{
- printf ("system call!\n");
- thread_exit ();
+ int syscall_number = INTR_ESP(0, int);
+ switch (syscall_number) {
+ case 0:
+ // halt
+ power_off ();
+ break;
+ case 1:
+ // exit
+ break;
+ case 4:
+ // create
+ ; // empty statement because c-grammar doesn't allow declarations following labels
+ printf("kernel: create\n");
+ char *filename = INTR_ESP(1, char *);
+ printf("create: read filename '%s'\n", filename);
+ off_t initial_size = INTR_ESP(2, off_t);
+ printf("create: read initial_size '%d'\n", initial_size);
+ f->eax = filesys_create(filename, initial_size);
+ printf("create: result (%d) put in f->eax\n", f->eax);
+ break;
+ case 6:
+ // open
+ break;
+ case 8:
+ // read
+ break;
+ case 9:
+ // write
+ printf ("printf: %s", INTR_ESP(2, char *));
+ break;
+ case 12:
+ // close
+ break;
+ default:
+ printf ("kernel: unknown syscall '%d'\n", syscall_number);
+ break;
+ }
}
diff --git a/src/utils/backtrace b/src/utils/backtrace
index 95e422f..95e422f 100644..100755
--- a/src/utils/backtrace
+++ b/src/utils/backtrace
diff --git a/src/utils/pintos-gdb b/src/utils/pintos-gdb
index 4ef38d3..4ef38d3 100644..100755
--- a/src/utils/pintos-gdb
+++ b/src/utils/pintos-gdb
diff --git a/src/utils/pintos-mkdisk b/src/utils/pintos-mkdisk
index 662b2e5..662b2e5 100644..100755
--- a/src/utils/pintos-mkdisk
+++ b/src/utils/pintos-mkdisk