提交 52040c66 创建 作者: Austin Clements's avatar Austin Clements

Linux/POSIX-compatible mmap and munmap prototypes

These don't implement anything yet that the old syscalls didn't support, but they give us a place to pass flags and make it easier to share user code between xv6 and Linux.
上级 7f3e124e
......@@ -12,6 +12,8 @@
#include "kmtrace.hh"
#include "futex.h"
#include <uk/mman.h>
//SYSCALL
int
sys_fork(int flags)
......@@ -98,33 +100,65 @@ sys_uptime(void)
}
//SYSCALL
int
sys_map(userptr<void> addr, size_t len)
void *
sys_mmap(userptr<void> addr, size_t len, int prot, int flags, int fd,
off_t offset)
{
ANON_REGION(__func__, &perfgroup);
mt_ascope ascope("%s(%p,%lu,%#x,%#x,%d,%#lx)",
__func__, addr.unsafe_get(), len, prot, flags, fd, offset);
if (!(prot & (PROT_READ | PROT_WRITE))) {
cprintf("not implemented: !(prot & (PROT_READ | PROT_WRITE))\n");
return MAP_FAILED;
}
if (flags & MAP_SHARED) {
cprintf("not implemented: (flags & MAP_SHARED)\n");
return MAP_FAILED;
}
if (!(flags & MAP_ANONYMOUS)) {
cprintf("not implemented: !(flags & MAP_ANONYMOUS)\n");
return MAP_FAILED;
}
uptr start = PGROUNDDOWN(addr);
uptr end = PGROUNDUP(addr + len);
if ((flags & MAP_FIXED) && start != addr)
return MAP_FAILED;
#if MTRACE
mt_ascope ascope("%s(%p,%#lx)", __func__, addr.unsafe_get(), len);
for (uptr i = addr / PGSIZE; i < PGROUNDUP(addr + len) / PGSIZE; i++)
mtwriteavar("pte:%p.%#lx", myproc()->vmap, i);
if (addr != 0) {
for (uptr i = start / PGSIZE; i < end / PGSIZE; i++)
mtwriteavar("pte:%p.%#lx", myproc()->vmap, i);
}
#endif
vmnode *vmn = new vmnode(PGROUNDUP(len) / PGSIZE);
vmnode *vmn = new vmnode((end - start) / PGSIZE);
if (vmn == 0)
return -1;
return MAP_FAILED;
long r = myproc()->vmap->insert(vmn, PGROUNDDOWN(addr), 1);
uptr r = myproc()->vmap->insert(vmn, start, 1);
if (r < 0) {
delete vmn;
return -1;
return MAP_FAILED;
}
return r;
return (void*)r;
}
//SYSCALL
uptr
sys_map(userptr<void> addr, size_t len)
{
// XXX Compatibility
return (uptr)sys_mmap(addr, len, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
}
//SYSCALL
int
sys_unmap(userptr<void> addr, size_t len)
sys_munmap(userptr<void> addr, size_t len)
{
ANON_REGION(__func__, &perfgroup);
......@@ -142,6 +176,14 @@ sys_unmap(userptr<void> addr, size_t len)
return 0;
}
//SYSCALL
int
sys_unmap(userptr<void> addr, size_t len)
{
// XXX Compatibility
return sys_munmap(addr, len);
}
//SYSCALL NORET
void
sys_halt(void)
......
#pragma once
#include <uk/mman.h>
// User/kernel shared mmap definitions
#pragma once
#define PROT_NONE 0x0
#define PROT_READ 0x1
#define PROT_WRITE 0x2
#define PROT_EXEC 0x4
#define MAP_SHARED 0x1
#define MAP_PRIVATE 0x2
#define MAP_FIXED 0x4
#define MAP_ANONYMOUS 0x8
#define MAP_FAILED ((void*)-1)
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论