Start of a zero'd page allocator

上级 78489020
...@@ -238,6 +238,10 @@ void uartintr(void); ...@@ -238,6 +238,10 @@ void uartintr(void);
void switchvm(struct proc*); void switchvm(struct proc*);
int pagefault(struct vmap *, uptr, u32); int pagefault(struct vmap *, uptr, u32);
// zalloc.cc
char* zalloc(const char* name);
void zfree(char* p);
// other exported/imported functions // other exported/imported functions
void cmain(u64 mbmagic, u64 mbaddr); void cmain(u64 mbmagic, u64 mbaddr);
void mpboot(void); void mpboot(void);
......
...@@ -30,7 +30,8 @@ struct cwork : public work { ...@@ -30,7 +30,8 @@ struct cwork : public work {
}; };
struct wframe { struct wframe {
wframe(int v) : v_(v) {} wframe(int v = 0) : v_(v) {}
void clear() { v_ = 0; }
int inc() { return __sync_add_and_fetch(&v_, 1); } int inc() { return __sync_add_and_fetch(&v_, 1); }
int dec() { return __sync_sub_and_fetch(&v_, 1); } int dec() { return __sync_sub_and_fetch(&v_, 1); }
bool zero() volatile { return v_ == 0; }; bool zero() volatile { return v_ == 0; };
......
...@@ -49,6 +49,7 @@ OBJS = \ ...@@ -49,6 +49,7 @@ OBJS = \
trapasm.o \ trapasm.o \
wq.o \ wq.o \
script.o \ script.o \
zalloc.o \
incbin.o incbin.o
OBJS := $(addprefix $(O)/kernel/, $(OBJS)) OBJS := $(addprefix $(O)/kernel/, $(OBJS))
......
...@@ -15,7 +15,6 @@ __fetchint64: ...@@ -15,7 +15,6 @@ __fetchint64:
mov $0, %rax mov $0, %rax
jmp __fetch_end jmp __fetch_end
.code64
.globl __fetchstr .globl __fetchstr
.align 8 .align 8
// rdi kernel dst // rdi kernel dst
...@@ -43,9 +42,16 @@ __fetchstr: ...@@ -43,9 +42,16 @@ __fetchstr:
2: // Done 2: // Done
jmp __fetch_end jmp __fetch_end
.code64
.globl __fetch_end .globl __fetch_end
.align 8 .align 8
__fetch_end: __fetch_end:
movl $0, PROC_UACCESS(%r11) movl $0, PROC_UACCESS(%r11)
ret ret
.globl clear_page
.align 8
clear_page:
movl $4096/8,%ecx
xorl %eax,%eax
rep stosq
ret
...@@ -72,15 +72,14 @@ vmnode::allocpg() ...@@ -72,15 +72,14 @@ vmnode::allocpg()
if (page[i]) if (page[i])
continue; continue;
char *p = kalloc("(vmnode::allocpg)"); char *p = zalloc("(vmnode::allocpg)");
if (!p) { if (!p) {
cprintf("allocpg: out of memory, leaving half-filled vmnode\n"); cprintf("allocpg: out of memory, leaving half-filled vmnode\n");
return -1; return -1;
} }
memset(p, 0, PGSIZE);
if(!cmpxch(&page[i], (char*) 0, p)) if(!cmpxch(&page[i], (char*) 0, p))
kfree(p); zfree(p);
} }
return 0; return 0;
} }
......
#include "types.h"
#include "amd64.h"
#include "kernel.hh"
#include "percpu.hh"
#include "wq.hh"
#include "kalloc.hh"
extern "C" void clear_page(void*);
struct zallocator {
run* run;
wframe frame;
};
percpu<zallocator> z_;
char*
zalloc(const char* name)
{
char* p = kalloc(name);
if (p)
clear_page(p);
return p;
}
void
zfree(char* p)
{
kfree(p);
}
void
initz(void)
{
for (int i = 0; i < NCPU; i++)
z_[i].frame.clear();
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论