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
-rw-r--r--sys/rt/amd64/rt1.s9
-rw-r--r--sys/rt/amd64/rti.s9
-rw-r--r--sys/rt/amd64/rtn.s7
6 files changed, 25 insertions, 47 deletions
diff --git a/sys/rt/amd64/crt1.s b/sys/rt/amd64/crt1.s
deleted file mode 100644
index aaad0ba..0000000
--- a/sys/rt/amd64/crt1.s
+++ /dev/null
@@ -1,21 +0,0 @@
-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
deleted file mode 100644
index eeba8b1..0000000
--- a/sys/rt/amd64/crti.s
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 45d1a29..0000000
--- a/sys/rt/amd64/crtn.s
+++ /dev/null
@@ -1,9 +0,0 @@
-section .init
- ;; compiler inserts here
- pop rbp ;; undo our push
- ret
-
-section .fini
- ;; compiler inserts here
- pop rbp ;; undo our push
- ret
diff --git a/sys/rt/amd64/rt1.s b/sys/rt/amd64/rt1.s
new file mode 100644
index 0000000..afb5c32
--- /dev/null
+++ b/sys/rt/amd64/rt1.s
@@ -0,0 +1,9 @@
+.extern rt·thunk
+
+.text
+.global _start
+_start:
+ xor %rbp,%rbp
+ mov %rsp,%rdi
+ andq $-16,%rsp
+ call rt·thunk
diff --git a/sys/rt/amd64/rti.s b/sys/rt/amd64/rti.s
new file mode 100644
index 0000000..4788968
--- /dev/null
+++ b/sys/rt/amd64/rti.s
@@ -0,0 +1,9 @@
+.section .init
+.global _init
+_init:
+ push %rax
+
+.section .fini
+.global _fini
+_fini:
+ push %rax
diff --git a/sys/rt/amd64/rtn.s b/sys/rt/amd64/rtn.s
new file mode 100644
index 0000000..29198b7
--- /dev/null
+++ b/sys/rt/amd64/rtn.s
@@ -0,0 +1,7 @@
+.section .init
+ pop %rax
+ ret
+
+.section .fini
+ pop %rax
+ ret