mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:27:43 +00:00
Start working on memory-mapped files.
First of all, change sys$mmap to take a struct SC_mmap_params since our sycsall calling convention can't handle more than 3 arguments. This exposed a bug in Syscall::invoke() needing to use clobber lists. It was a bit confusing to debug. :^)
This commit is contained in:
parent
41a751c90c
commit
fdbd9f1e27
14 changed files with 82 additions and 26 deletions
|
@ -17,21 +17,17 @@ extern "C" void __malloc_init();
|
|||
|
||||
extern "C" int _start()
|
||||
{
|
||||
__malloc_init();
|
||||
|
||||
errno = 0;
|
||||
|
||||
memset(__default_streams, 0, sizeof(__default_streams));
|
||||
|
||||
__default_streams[0].fd = 0;
|
||||
stdin = &__default_streams[0];
|
||||
|
||||
__default_streams[1].fd = 1;
|
||||
stdout = &__default_streams[1];
|
||||
|
||||
__default_streams[2].fd = 2;
|
||||
stderr = &__default_streams[2];
|
||||
|
||||
__malloc_init();
|
||||
|
||||
StringImpl::initializeGlobals();
|
||||
|
||||
int status = 254;
|
||||
|
|
|
@ -31,7 +31,7 @@ void setgrent()
|
|||
perror("open /etc/group");
|
||||
}
|
||||
assert(__grdb_stream);
|
||||
__grdb_entry = (struct group_with_strings*)mmap(nullptr, getpagesize());
|
||||
__grdb_entry = (struct group_with_strings*)mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
|
||||
set_mmap_name(__grdb_entry, getpagesize(), "setgrent");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
#include "mman.h"
|
||||
#include "errno.h"
|
||||
#include <mman.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <Kernel/Syscall.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
void* mmap(void* addr, size_t size)
|
||||
void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset)
|
||||
{
|
||||
int rc = Syscall::invoke(Syscall::SC_mmap, (dword)addr, (dword)size);
|
||||
Syscall::SC_mmap_params params { (dword)addr, size, prot, flags, fd, offset };
|
||||
int rc = Syscall::invoke(Syscall::SC_mmap, (dword)¶ms);
|
||||
__RETURN_WITH_ERRNO(rc, (void*)rc, (void*)-1);
|
||||
}
|
||||
|
||||
|
|
13
LibC/mman.h
13
LibC/mman.h
|
@ -3,9 +3,20 @@
|
|||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#define MAP_SHARED 0x01
|
||||
#define MAP_PRIVATE 0x02
|
||||
#define MAP_FIXED 0x10
|
||||
#define MAP_ANONYMOUS 0x20
|
||||
#define MAP_ANON MAP_ANONYMOUS
|
||||
|
||||
#define PROT_READ 0x1
|
||||
#define PROT_WRITE 0x2
|
||||
#define PROT_EXEC 0x4
|
||||
#define PROT_NONE 0x0
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
void* mmap(void*, size_t);
|
||||
void* mmap(void* addr, size_t, int prot, int flags, int fd, off_t);
|
||||
int munmap(void*, size_t);
|
||||
int set_mmap_name(void*, size_t, const char*);
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ void setpwent()
|
|||
perror("open /etc/passwd");
|
||||
}
|
||||
assert(__pwdb_stream);
|
||||
__pwdb_entry = (struct passwd_with_strings*)mmap(nullptr, getpagesize());
|
||||
__pwdb_entry = (struct passwd_with_strings*)mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
|
||||
set_mmap_name(__pwdb_entry, getpagesize(), "setpwent");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ static byte* endptr = nullptr;
|
|||
|
||||
void __malloc_init()
|
||||
{
|
||||
nextptr = (byte*)mmap(nullptr, mallocBudget);
|
||||
nextptr = (byte*)mmap(nullptr, mallocBudget, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
|
||||
endptr = nextptr + mallocBudget;
|
||||
int rc = set_mmap_name(nextptr, mallocBudget, "malloc");
|
||||
if (rc < 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue