Add x86_64 start code to access argc and argv
This commit is contained in:
parent
9163857e83
commit
7c8c2e2dc2
@ -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__ */
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user