diff options
Diffstat (limited to 'sys/rt/amd64')
-rw-r--r-- | sys/rt/amd64/crt1.s | 21 | ||||
-rw-r--r-- | sys/rt/amd64/crti.s | 17 | ||||
-rw-r--r-- | sys/rt/amd64/crtn.s | 9 |
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 |