user: implement mlibc as the libc, finally.

It's finally done..

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
This commit is contained in:
kaguya
2026-05-02 03:31:49 -04:00
parent 2fa39ad85a
commit 9a9b91c940
2387 changed files with 152741 additions and 315 deletions
@@ -0,0 +1,63 @@
#include <assert.h>
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>
static jmp_buf env;
static char *sigStack;
static void sig_handler(int sig, siginfo_t *info, void *ctx) {
(void)sig;
(void)info;
(void)ctx;
longjmp(env, 1);
}
int main() {
if (setjmp(env)) {
free(sigStack);
return 0;
}
sigStack = malloc(SIGSTKSZ);
stack_t ss;
ss.ss_sp = sigStack;
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
assert(!sigaltstack(&ss, NULL));
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
sa.sa_sigaction = sig_handler;
assert(!sigaction(SIGSEGV, &sa, NULL));
// This is used to trash the stack to ensure sigaltstack actually switched stacks.
#if defined(__x86_64__)
asm volatile ("mov $0, %rsp\n"
"\t" "push $0");
#elif defined(__i386__)
asm volatile ("mov $0, %esp\n"
"\t" "push $0");
#elif defined(__aarch64__)
asm volatile ("mov sp, %0\n"
"\t" "stp x0, x1, [sp, #-16]!" :: "r"((uint64_t)0));
#elif defined(__riscv) && __riscv_xlen == 64
asm volatile ("li sp, 0\n"
"\t" "sd zero, 0(sp)");
#elif defined (__m68k__)
asm volatile ("move.l #0, %sp\n"
"\t" "move.l #0, -(%sp)");
#elif defined(__loongarch64)
asm volatile ("addi.d $sp, $r0, 0\n"
"\t" "st.d $r0, $sp, 0");
#else
# error Unknown architecture
#endif
return 0;
}