aboutsummaryrefslogtreecommitdiff
path: root/sys/rt/amd64
diff options
context:
space:
mode:
Diffstat (limited to 'sys/rt/amd64')
-rw-r--r--sys/rt/amd64/crt1.s21
-rw-r--r--sys/rt/amd64/crti.s17
-rw-r--r--sys/rt/amd64/crtn.s9
3 files changed, 47 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...
diff --git a/sys/rt/amd64/crti.s b/sys/rt/amd64/crti.s
new file mode 100644
index 0000000..eeba8b1
--- /dev/null
+++ b/sys/rt/amd64/crti.s
@@ -0,0 +1,17 @@
+global _init
+global _fini
+
+section .init
+_init:
+ ; call pushes an 8 byte return address on the stack
+ ; 64 bit ABI requires stack to be aligned to 16 bytes
+ ; we realign with another 8 byte address
+ push rbp
+ mov rbp, rsp
+ ;; compiler inserts the rest here
+
+section .fini
+_fini:
+ push rbp ; see above
+ mov rbp, rsp
+ ;; compiler inserts the rest here
diff --git a/sys/rt/amd64/crtn.s b/sys/rt/amd64/crtn.s
new file mode 100644
index 0000000..45d1a29
--- /dev/null
+++ b/sys/rt/amd64/crtn.s
@@ -0,0 +1,9 @@
+section .init
+ ;; compiler inserts here
+ pop rbp ;; undo our push
+ ret
+
+section .fini
+ ;; compiler inserts here
+ pop rbp ;; undo our push
+ ret