Add x86_64 start code to access argc and argv

This commit is contained in:
Lucas Schumacher 2025-05-02 20:48:09 -04:00
parent 9163857e83
commit 7c8c2e2dc2
2 changed files with 38 additions and 1 deletions

View File

@ -1,8 +1,25 @@
#if defined(__x86_64__) #if defined(__x86_64__)
#include "../int.h" #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" #include "generic.h"
//
// syscall functions
#define SYS_EXIT 60 #define SYS_EXIT 60
void exit(int8_t status) { void exit(int8_t status) {
asm volatile( asm volatile(
@ -243,4 +260,17 @@ int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *t, stru
return rtn; 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__ */ #endif /* ifdef __x86_64__ */

View File

@ -2,11 +2,18 @@
#include "sys.h" #include "sys.h"
int main() { int main(int argc, char* argv[]) {
// Test the write syscall // Test the write syscall
intptr_t n = write(STDOUT, "Hello\n", 6); intptr_t n = write(STDOUT, "Hello\n", 6);
if(n != 6) return n; 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 // Test the fork syscall
uint64_t pid = fork(); uint64_t pid = fork();
// Print the pid in hex // Print the pid in hex