Add read support for x86_64

This commit is contained in:
Lucas Schumacher 2025-04-14 13:03:04 -04:00
parent 415dfd9fa4
commit d64176ea7e

View File

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