1
Fork 0
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:
Andreas Kling 2018-11-08 11:37:01 +01:00
parent 41a751c90c
commit fdbd9f1e27
14 changed files with 82 additions and 26 deletions

View file

@ -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;

View file

@ -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");
}
}

View file

@ -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)&params);
__RETURN_WITH_ERRNO(rc, (void*)rc, (void*)-1);
}

View file

@ -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*);

View file

@ -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");
}
}

View file

@ -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)