Boost logo

Boost :

Subject: [boost] [Context] RFR: Add support for ARM aarch64 architecture
From: Edward Nevill (edward.nevill_at_[hidden])
Date: 2015-02-23 09:53:22


Hi,

I hope this is the right place to post this.

The following patch adds support for ARMs aarch64 architecture on Linux
(there is existing iOS support for aarch64).

I have run the context regression test on this on an aarch64 board running
Ubuntu 14.04 with gcc 4.9.1 and it passes all OK.

Could someone please review this patch and if OK push it?

Many thanks,
Ed.

--- CUT HERE ---
commit bd34672217ff3bcee185f9c7383179342ec2fe9b
Author: Edward Nevill <edward.nevill_at_[hidden]>
Date: Mon Feb 23 14:37:45 2015 +0000

    Add support for ARM aarch64 architecture

diff --git a/build/Jamfile.v2 b/build/Jamfile.v2
index 80d1c46..edd4400 100644
--- a/build/Jamfile.v2
+++ b/build/Jamfile.v2
@@ -253,6 +253,14 @@ alias asm_context_sources
      <toolset>darwin
    ;

+alias asm_context_sources
+ : [ make asm/make_arm64_elf_gas.o : asm/make_arm64_elf_gas.S : @gas ]
+ [ make asm/jump_arm64_elf_gas.o : asm/jump_arm64_elf_gas.S : @gas ]
+ : <address-model>64
+ <architecture>arm
+ <binary-format>elf
+ ;
+
 # MIPS
 # MIPS/O32/ELF
 alias asm_context_sources
diff --git a/config/arm.cpp b/config/arm.cpp
index 6a83737..6eece0b 100644
--- a/config/arm.cpp
+++ b/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/src/asm/jump_arm64_elf_gas.S b/src/asm/jump_arm64_elf_gas.S
new file mode 100644
index 0000000..3e0e2c2
--- /dev/null
+++ b/src/asm/jump_arm64_elf_gas.S
@@ -0,0 +1,128 @@
+/*******************************************************
+ * *
+ * ------------------------------------------------- *
+ * | 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/src/asm/make_arm64_elf_gas.S b/src/asm/make_arm64_elf_gas.S
new file mode 100644
index 0000000..5a6914f
--- /dev/null
+++ b/src/asm/make_arm64_elf_gas.S
@@ -0,0 +1,80 @@
+/*******************************************************
+ * *
+ * ------------------------------------------------- *
+ * | 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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk