This commit is contained in:
2024-12-05 21:22:19 +01:00
parent cc23753573
commit b6c66136f7
14 changed files with 452 additions and 0 deletions

22
stdlib/src/arena.c Normal file
View File

@@ -0,0 +1,22 @@
#include <common.h>
#include <arena.h>
#include <syscall.h>
arena arena_init(usize capacity)
{
void* ptr = mmap(null, capacity, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
return (arena){ .ptr = ptr, .available = 0, .capacity = capacity };
}
void arena_ensure(arena* arena, usize available)
{
if (arena->available >= available) return;
available = (available + PAGE_SIZE - 1) & -PAGE_SIZE;
if (available > arena->capacity) {
available = arena->capacity;
}
mprotect((c8*)arena->ptr + arena->available, available - arena->available, PROT_READ | PROT_WRITE);
arena->available = available;
}

14
stdlib/src/buffer.c Normal file
View File

@@ -0,0 +1,14 @@
#include <common.h>
#include <syscall.h>
void* buffer_init(usize size)
{
i32 fd = memfd_create("buffer", 0);
ftruncate(fd, size);
void* ptr = mmap(null, 2 * size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
mmap( ptr, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
mmap((c8*)ptr + size, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
return ptr;
}

12
stdlib/src/start.s Normal file
View File

@@ -0,0 +1,12 @@
.intel_syntax noprefix
.text
.global _start
_start:
xor rbp, rbp
pop rdi
mov rsi, rsp
and rsp, -16
call main
mov rdi, rax
mov rax, 60
syscall

77
stdlib/src/syscall.c Normal file
View File

@@ -0,0 +1,77 @@
#include <syscall.h>
isize read(i32 fd, void* buf, usize size)
{
isize ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (0), "D" (fd), "S" (buf), "d" (size)
: "rcx", "r11", "memory"
);
return ret;
}
isize write(i32 fd, const void* buf, usize size)
{
isize ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (1), "D" (fd), "S" (buf), "d" (size)
: "rcx", "r11", "memory"
);
return ret;
}
void* mmap(void* addr, usize length, i32 prot, i32 flags, i32 fd, isize offset)
{
register i32 r10 asm ("r10") = flags;
register i32 r8 asm ("r8") = fd;
register isize r9 asm ("r9") = offset;
void* ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (9), "D" (addr), "S" (length), "d" (prot), "r" (r10), "r" (r8), "r" (r9)
: "rcx", "r11", "memory"
);
return ret;
}
i32 mprotect(void* addr, usize len, i32 prot)
{
i32 ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (10), "D" (addr), "S" (len), "d" (prot)
: "rcx", "r11", "memory"
);
return ret;
}
i32 ftruncate(i32 fd, isize length)
{
i32 ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (77), "D" (fd), "S" (length)
: "rcx", "r11", "memory"
);
return ret;
}
i32 memfd_create(const char* name, u32 flags)
{
i32 ret;
asm volatile (
"syscall"
: "=a" (ret)
: "a" (319), "D" (name), "S" (flags)
: "rcx", "r11", "memory"
);
return ret;
}