From 7c8c2e2dc21b3dc8aa40f35fea1d80aedf0f2858 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Fri, 2 May 2025 20:48:09 -0400 Subject: [PATCH] Add x86_64 start code to access argc and argv --- arch/x86_64.c | 30 ++++++++++++++++++++++++++++++ buildtest.c | 9 ++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/arch/x86_64.c b/arch/x86_64.c index 3dfe803..1b7c43b 100644 --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -1,8 +1,25 @@ #if defined(__x86_64__) #include "../int.h" +#include "../sys.h" +// Start code +#ifndef _START_DEFINED +#define _START_DEFINED +extern int main(int argc, char** argv); +void _start() { + void* fp = __builtin_frame_address(0); + register int argc asm("rdi") = *(uint64_t*)(fp+8); + register char** argv asm("rsi") = fp+16; + exit(main(argc, argv)); +} +#endif /* ifndef _START_DEFINED */ + +//include other generic functions #include "generic.h" +// +// syscall functions + #define SYS_EXIT 60 void exit(int8_t status) { asm volatile( @@ -243,4 +260,17 @@ int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *t, stru return rtn; } +#define SYS_RT_SIGACTION 13 +int rt_sigaction(int signum, const void* act, void* oldact, size_t sigset_len) { + int rtn; + asm volatile( + "mov %5, %%r10\n" + "syscall\n" + : "=a"(rtn) + : "a"(SYS_RT_SIGACTION), "D"(signum), "S"(act), "d"(oldact), "r"(sigset_len) + : "rcx", "r11", "memory" + ); + return rtn; +} + #endif /* ifdef __x86_64__ */ diff --git a/buildtest.c b/buildtest.c index 9d70bd0..8c78e9c 100644 --- a/buildtest.c +++ b/buildtest.c @@ -2,11 +2,18 @@ #include "sys.h" -int main() { +int main(int argc, char* argv[]) { // Test the write syscall intptr_t n = write(STDOUT, "Hello\n", 6); if(n != 6) return n; + // Test argc + for(int i = 0; i < argc; ++i){ + int len = strlen(argv[i]); + write(STDOUT, argv[i], len); + write(STDOUT, "\n", 1); + } + // Test the fork syscall uint64_t pid = fork(); // Print the pid in hex