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