diff --git a/kernel-src/arch/x86-64/context.asm b/kernel-src/arch/x86-64/context.asm index cdd392d9..7f1d4dc7 100644 --- a/kernel-src/arch/x86-64/context.asm +++ b/kernel-src/arch/x86-64/context.asm @@ -4,7 +4,7 @@ arch_context_switch: xor rsi, rsi ; is syscall? (no) extern sched_userspacecheck call sched_userspacecheck ; compiled with no_caller_saved_registers - + cli ; rdi is the pointer to the context struct mov rsp, rdi diff --git a/kernel-src/arch/x86-64/syscall.asm b/kernel-src/arch/x86-64/syscall.asm index 44bddf9f..e3f39975 100644 --- a/kernel-src/arch/x86-64/syscall.asm +++ b/kernel-src/arch/x86-64/syscall.asm @@ -240,6 +240,7 @@ arch_syscall_entry: mov rcx, rax ; return value extern sched_userspacecheck ; context, return, errno call sched_userspacecheck ; compiled with __attribute__((no_caller_saved_registers)) + cli ; restore context add rsp, 32 ; r9 argument, cr2, gs, and fs are not popped. diff --git a/kernel-src/mm/vmmcache.c b/kernel-src/mm/vmmcache.c index b2d11ee6..4c9bbba7 100644 --- a/kernel-src/mm/vmmcache.c +++ b/kernel-src/mm/vmmcache.c @@ -262,7 +262,7 @@ int vmmcache_syncvnode(vnode_t *vnode, uintmax_t offset, size_t size) { page_t *page = vnode->pages; page_t *vnodedirtylist = NULL; for (; page; page = page->vnodenext) { - if (page->offset < offset || page->offset >= top) + if (page->offset < offset || page->offset >= top || (page->offset & PAGE_FLAGS_DIRTY) == 0) continue; // remove from write list and add to an internal list using the write pointers @@ -391,7 +391,7 @@ void vmmcache_init() { memset(table, 0, TABLE_SIZE * sizeof(page_t *)); SEMAPHORE_INIT(&sync, 0); - writerthread = sched_newthread(writer, PAGE_SIZE * 4, 1, NULL, NULL); + writerthread = sched_newthread(writer, PAGE_SIZE * 16, 1, NULL, NULL); __assert(writerthread); sched_queue(writerthread); vmmcache_sync();