Files
kaguya 9a9b91c940 user: implement mlibc as the libc, finally.
It's finally done..

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
2026-05-02 03:31:49 -04:00

64 lines
1.3 KiB
C

#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;
}