aboutsummaryrefslogtreecommitdiff
path: root/sys/rt/amd64/crt1.s
diff options
context:
space:
mode:
Diffstat (limited to 'sys/rt/amd64/crt1.s')
-rw-r--r--sys/rt/amd64/crt1.s21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/rt/amd64/crt1.s b/sys/rt/amd64/crt1.s
new file mode 100644
index 0000000..aaad0ba
--- /dev/null
+++ b/sys/rt/amd64/crt1.s
@@ -0,0 +1,21 @@
+global _start
+
+; NOTE: assumes program loader has put argc, argv, envc, envp on stack
+section .text
+_start:
+ xor rbp,rbp ; base pointer undefined: set to 0
+ mov r9,rdx ; 6th arg: function to register with atexit()
+ pop rsi ; 2nd arg: argc
+ mov rdx,rsp ; 3rd arg: argv
+ and rsp,$-16 ; align stack pointer to 16 bytes
+ mov $_fini,r8 ; 5th arg: fini
+ mov $_init,rcx ; 4th arg: init
+ mov $main,rdi ; 1st arg: main
+
+ call rt·boot ; int boot(
+ ; int(*main)(int,char*[],char*[]),
+ ; int argc,
+ ; char *argv[],
+ ; init, fini, atexit);
+
+.loop: jmp .loop ; should never reach...