minimalc/arch/x86_64.c

37 lines
707 B
C

#include <stdint.h>
#if defined(__x86_64__)
void exit(int8_t status) {
asm volatile(
"syscall"
:
: "a"(60), "D"(status)
:
);
}
intptr_t write(int32_t fd, const void* buf, intptr_t size) {
intptr_t n_written = 0;
asm volatile (
"syscall\n"
"movq %0, %%rax\n"
: "=r"(n_written)
: "a"(1), "D"(fd), "S"(buf), "d"(size) // RDI, RSI, RDX are used in x86-64 for write args
: "rcx", "r11", "memory"
);
return n_written;
}
uint32_t fork() {
uint64_t rtn;
asm volatile(
"syscall\n" // syscall
"movq %0, %%rax\n" // save return value
: "=r"(rtn)
: "a"(57)
:
);
return (uint32_t)rtn;
}
#endif /* ifdef __x86_64__ */