aboutsummaryrefslogtreecommitdiff
path: root/lib/mlibc/options/internal/aarch64
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-03-07 17:28:00 -0500
committerIan Moffett <ian@osmora.org>2024-03-07 17:28:32 -0500
commitbd5969fc876a10b18613302db7087ef3c40f18e1 (patch)
tree7c2b8619afe902abf99570df2873fbdf40a4d1a1 /lib/mlibc/options/internal/aarch64
parenta95b38b1b92b172e6cc4e8e56a88a30cc65907b0 (diff)
lib: Add mlibc
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'lib/mlibc/options/internal/aarch64')
-rw-r--r--lib/mlibc/options/internal/aarch64/fenv.S69
-rw-r--r--lib/mlibc/options/internal/aarch64/mlibc_crtbegin.S29
-rw-r--r--lib/mlibc/options/internal/aarch64/mlibc_crtend.S22
-rw-r--r--lib/mlibc/options/internal/aarch64/setjmp.S63
4 files changed, 183 insertions, 0 deletions
diff --git a/lib/mlibc/options/internal/aarch64/fenv.S b/lib/mlibc/options/internal/aarch64/fenv.S
new file mode 100644
index 0000000..1b02e87
--- /dev/null
+++ b/lib/mlibc/options/internal/aarch64/fenv.S
@@ -0,0 +1,69 @@
+# The functions below are taken from musl.
+.global fegetround
+.type fegetround,%function
+fegetround:
+ mrs x0, fpcr
+ and w0, w0, #0xc00000
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,%function
+__fesetround:
+ mrs x1, fpcr
+ bic w1, w1, #0xc00000
+ orr w1, w1, w0
+ msr fpcr, x1
+ mov w0, #0
+ ret
+
+.global fetestexcept
+.type fetestexcept,%function
+fetestexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ and w0, w0, w1
+ ret
+
+.global feclearexcept
+.type feclearexcept,%function
+feclearexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ bic w1, w1, w0
+ msr fpsr, x1
+ mov w0, #0
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,%function
+feraiseexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ orr w1, w1, w0
+ msr fpsr, x1
+ mov w0, #0
+ ret
+
+.global fegetenv
+.type fegetenv,%function
+fegetenv:
+ mrs x1, fpcr
+ mrs x2, fpsr
+ stp w1, w2, [x0]
+ mov w0, #0
+ ret
+
+// TODO preserve some bits
+.global fesetenv
+.type fesetenv,%function
+fesetenv:
+ mov x1, #0
+ mov x2, #0
+ cmn x0, #1
+ b.eq 1f
+ ldp w1, w2, [x0]
+1: msr fpcr, x1
+ msr fpsr, x2
+ mov w0, #0
+ ret
diff --git a/lib/mlibc/options/internal/aarch64/mlibc_crtbegin.S b/lib/mlibc/options/internal/aarch64/mlibc_crtbegin.S
new file mode 100644
index 0000000..b99748b
--- /dev/null
+++ b/lib/mlibc/options/internal/aarch64/mlibc_crtbegin.S
@@ -0,0 +1,29 @@
+
+.section .data
+.hidden __dso_handle
+.global __dso_handle
+__dso_handle:
+ .quad __dso_handle
+
+.section .init
+.hidden _init
+.global _init
+_init:
+
+.section .fini
+.hidden _fini
+.global _fini
+_fini:
+
+.section .ctors
+.hidden __CTOR_LIST__
+.global __CTOR_LIST__
+__CTOR_LIST__:
+
+.section .dtors
+.hidden __DTOR_LIST__
+.global __DTOR_LIST__
+__DTOR_LIST__:
+
+.section .note.GNU-stack,"",%progbits
+
diff --git a/lib/mlibc/options/internal/aarch64/mlibc_crtend.S b/lib/mlibc/options/internal/aarch64/mlibc_crtend.S
new file mode 100644
index 0000000..2bf6254
--- /dev/null
+++ b/lib/mlibc/options/internal/aarch64/mlibc_crtend.S
@@ -0,0 +1,22 @@
+
+.hidden __mlibc_do_ctors
+.hidden __mlibc_do_dtors
+
+.section .init
+ b __mlibc_do_ctors
+
+.section .fini
+ b __mlibc_do_dtors
+
+.section .ctors
+.hidden __CTOR_END__
+.global __CTOR_END__
+__CTOR_END__:
+
+.section .dtors
+.hidden __DTOR_END__
+.global __DTOR_END__
+__DTOR_END__:
+
+.section .note.GNU-stack,"",%progbits
+
diff --git a/lib/mlibc/options/internal/aarch64/setjmp.S b/lib/mlibc/options/internal/aarch64/setjmp.S
new file mode 100644
index 0000000..9dddaa8
--- /dev/null
+++ b/lib/mlibc/options/internal/aarch64/setjmp.S
@@ -0,0 +1,63 @@
+// vim: ft=arm64asm
+
+.extern __sigsetjmp
+
+.type __setjmp, "function"
+__setjmp:
+ stp x19, x20, [x0, #0]
+ stp x21, x22, [x0, #16]
+ stp x23, x24, [x0, #24]
+ stp x25, x26, [x0, #32]
+ stp x27, x28, [x0, #48]
+ stp x29, x30, [x0, #64]
+ stp x29, x30, [x0, #80]
+ mov x4, sp
+ str x4, [x0, #96]
+
+ stp d8, d9, [x0, #112]
+ stp d10, d11, [x0, #128]
+ stp d12, d13, [x0, #144]
+ stp d14, d15, [x0, #160]
+
+ cbnz x2, 1f
+
+ mov x0, xzr
+ ret
+1:
+ b __sigsetjmp
+
+.global setjmp
+.type setjmp, "function"
+setjmp:
+ mov x2, xzr
+ b __setjmp
+
+.global sigsetjmp
+.type sigsetjmp, "function"
+sigsetjmp:
+ mov x2, #1
+ b __setjmp
+
+.global longjmp
+.type longjmp, "function"
+longjmp:
+ ldp x19, x20, [x0, #0]
+ ldp x21, x22, [x0, #16]
+ ldp x23, x24, [x0, #24]
+ ldp x25, x26, [x0, #32]
+ ldp x27, x28, [x0, #48]
+ ldp x29, x30, [x0, #64]
+ ldp x29, x30, [x0, #80]
+ ldr x4, [x0, #96]
+ mov sp, x4
+
+ ldp d8, d9, [x0, #112]
+ ldp d10, d11, [x0, #128]
+ ldp d12, d13, [x0, #144]
+ ldp d14, d15, [x0, #160]
+
+ cmp w1, 0
+ csinc w0, w1, wzr, ne
+ br x30
+.section .note.GNU-stack,"",%progbits
+