Blob Blame History Raw
From 8481d3ccfc8e9cd3b689c43418e27ccfe722fcb2 Mon Sep 17 00:00:00 2001
From: Oliver Kowalke <oliver.kowalke@gmx.de>
Date: Mon, 23 Feb 2015 16:23:11 +0100
Subject: [PATCH 46/54] add support for ARM64/ELF

---
 build/Jamfile.v2                   |  30 +++++++++
 config/arm.cpp                     |   2 +-
 src/asm/jump_arm64_aapcs_elf_gas.S | 131 +++++++++++++++++++++++++++++++++++++
 src/asm/make_arm64_aapcs_elf_gas.S |  85 ++++++++++++++++++++++++
 4 files changed, 247 insertions(+), 1 deletion(-)
 create mode 100644 src/asm/jump_arm64_aapcs_elf_gas.S
 create mode 100644 src/asm/make_arm64_aapcs_elf_gas.S

diff --git a/libs/context/build/Jamfile.v2 b/libs/context/build/Jamfile.v2
index 80d1c46..4bf3fce 100644
--- a/libs/context/build/Jamfile.v2
+++ b/libs/context/build/Jamfile.v2
@@ -223,6 +223,36 @@ alias asm_context_sources
    ;
 
 # ARM64
+# ARM64/AAPCS/ELF
+alias asm_context_sources
+   : [ make asm/make_arm64_aapcs_elf_gas.o : asm/make_arm64_aapcs_elf_gas.S : @gas64 ]
+     [ make asm/jump_arm64_aapcs_elf_gas.o : asm/jump_arm64_aapcs_elf_gas.S : @gas64 ]
+   : <abi>aapcs
+     <address-model>64
+     <architecture>arm
+     <binary-format>elf
+   ;
+
+alias asm_context_sources
+   : asm/make_arm64_aapcs_elf_gas.S
+     asm/jump_arm64_aapcs_elf_gas.S
+   : <abi>aapcs
+     <address-model>64
+     <architecture>arm
+     <binary-format>elf
+     <toolset>clang
+   ;
+
+alias asm_context_sources
+   : asm/make_arm64_aapcs_elf_gas.S
+     asm/jump_arm64_aapcs_elf_gas.S
+   : <abi>aapcs
+     <address-model>64
+     <architecture>arm
+     <binary-format>elf
+     <toolset>gcc
+   ;
+
 # ARM64/AAPCS/MACH-O
 alias asm_context_sources
    : [ make asm/make_arm64_aapcs_macho_gas.o : asm/make_arm64_aapcs_macho_gas.S : @gas64 ]
diff --git a/libs/context/config/arm.cpp b/libs/context/config/arm.cpp
index 6a83737..6eece0b 100644
--- a/libs/context/config/arm.cpp
+++ b/libs/context/config/arm.cpp
@@ -6,7 +6,7 @@
 // accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
-#if !defined(__arm__) && !defined(__thumb__) && \
+#if !defined(__aarch64__) && !defined(__arm__) && !defined(__thumb__) && \
     !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \
     !defined(_ARM) && !defined(_M_ARM)
 #error "Not ARM"
diff --git a/libs/context/src/asm/jump_arm64_aapcs_elf_gas.S b/libs/context/src/asm/jump_arm64_aapcs_elf_gas.S
new file mode 100644
index 0000000..46e029d
--- /dev/null
+++ b/libs/context/src/asm/jump_arm64_aapcs_elf_gas.S
@@ -0,0 +1,131 @@
+/*
+            Copyright Edward Nevill 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.cpu    generic+fp+simd
+.text
+.align  2
+.global jump_fcontext
+.type   jump_fcontext, %function
+jump_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0xb0
+
+# Because gcc may save integer registers in fp registers across a
+# function call we cannot skip saving the fp registers.
+#
+# Do not reinstate this test unless you fully understand what you
+# are doing.
+#
+#    # test if fpu env should be preserved
+#    cmp  w3, #0
+#    b.eq  1f
+
+    # save d8 - d15
+    stp    d8, d9,   [sp, #0x00]
+    stp    d10, d11, [sp, #0x10]
+    stp    d12, d13, [sp, #0x20]
+    stp    d14, d15, [sp, #0x30]
+
+1:
+    # save x19-x30
+    stp x19, x20, [sp, #0x40]
+    stp x21, x22, [sp, #0x50]
+    stp x23, x24, [sp, #0x60]
+    stp x25, x26, [sp, #0x70]
+    stp x27, x28, [sp, #0x80]
+    stp x29, x30, [sp, #0x90]
+
+    # save LR as PC
+    str x30, [sp, #0xa0]
+
+    # store RSP (pointing to context-data) in first argument (x0).
+    # STR cannot have sp as a target register
+    mov  x4, sp
+    str  x4, [x0]
+
+    # restore RSP (pointing to context-data) from A2 (x1)
+    mov  sp, x1
+
+#    # test if fpu env should be preserved
+#    cmp  w3, #0
+#    b.eq  2f
+
+    # load d8 - d15
+    ldp    d8, d9,   [x0, #0x00]
+    ldp    d10, d11, [x0, #0x10]
+    ldp    d12, d13, [x0, #0x20]
+    ldp    d14, d15, [x0, #0x30]
+
+2:
+    # load x19-x30
+    ldp x19, x20, [sp, #0x40]
+    ldp x21, x22, [sp, #0x50]
+    ldp x23, x24, [sp, #0x60]
+    ldp x25, x26, [sp, #0x70]
+    ldp x27, x28, [sp, #0x80]
+    ldp x29, x30, [sp, #0x90]
+
+    # use third arg as return value after jump
+    # and as first arg in context function
+    mov  x0, x2
+
+    # load pc
+    ldr x4, [sp, #0xa0]
+
+    # restore stack from GP + FPU
+    add  sp, sp, #0xb0
+
+    ret x4
+.size   jump_fcontext,.-jump_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
diff --git a/libs/context/src/asm/make_arm64_aapcs_elf_gas.S b/libs/context/src/asm/make_arm64_aapcs_elf_gas.S
new file mode 100644
index 0000000..b208ab7
--- /dev/null
+++ b/libs/context/src/asm/make_arm64_aapcs_elf_gas.S
@@ -0,0 +1,85 @@
+/*
+            Copyright Edward Nevill 2015
+   Distributed under the Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt or copy at
+          http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.cpu    generic+fp+simd
+.text
+.align  2
+.global make_fcontext
+.type   make_fcontext, %function
+make_fcontext:
+    # shift address in x0 (allocated stack) to lower 16 byte boundary
+    and x0, x0, ~0xF
+
+    # reserve space for context-data on context-stack
+    sub  x0, x0, #0xb0
+
+    # third arg of make_fcontext() == address of context-function
+    # store address as a PC to jump in
+    str  x2, [x0, #0xa0]
+
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns (LR register)
+    adr  x1, finish
+    str  x1, [x0, #0x98]
+
+    ret  x30 // return pointer to context-data (x0)
+
+finish:
+    # exit code is zero
+    mov  x0, #0
+    # exit application
+    bl  _exit
+
+.size   make_fcontext,.-make_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
-- 
2.3.5