468 lines
17 KiB
Diff
468 lines
17 KiB
Diff
From 0c117efe905a79d82f5ec638dec6f315d9e3f41c Mon Sep 17 00:00:00 2001
|
|
From: Wenlong Zhang <zhangwenlong@loongson.cn>
|
|
Date: Tue, 10 Jan 2023 20:54:06 +0800
|
|
Subject: [PATCH] add boost context support for loongarch64
|
|
|
|
---
|
|
boost/predef/other/endian.h | 3 +-
|
|
libs/context/build/Jamfile.v2 | 26 ++++
|
|
.../src/asm/jump_loongarch64_lp64_elf_gas.S | 117 ++++++++++++++++++
|
|
.../src/asm/make_loongarch64_lp64_elf_gas.S | 85 +++++++++++++
|
|
.../src/asm/ontop_loongarch64_lp64_elf_gas.S | 117 ++++++++++++++++++
|
|
tools/build/src/engine/jam.h | 4 +
|
|
tools/build/src/tools/builtin.py | 3 +
|
|
.../tools/features/architecture-feature.jam | 3 +
|
|
8 files changed, 357 insertions(+), 1 deletion(-)
|
|
create mode 100644 libs/context/src/asm/jump_loongarch64_lp64_elf_gas.S
|
|
create mode 100644 libs/context/src/asm/make_loongarch64_lp64_elf_gas.S
|
|
create mode 100644 libs/context/src/asm/ontop_loongarch64_lp64_elf_gas.S
|
|
|
|
diff --git a/boost/predef/other/endian.h b/boost/predef/other/endian.h
|
|
index d8ec63ff5..4d0630af0 100644
|
|
--- a/boost/predef/other/endian.h
|
|
+++ b/boost/predef/other/endian.h
|
|
@@ -125,7 +125,8 @@ information and acquired knowledge:
|
|
defined(__MIPSEL) || \
|
|
defined(__MIPSEL__) || \
|
|
defined(__riscv) || \
|
|
- defined(__e2k__)
|
|
+ defined(__e2k__) || \
|
|
+ defined(__loongarch64)
|
|
# undef BOOST_ENDIAN_LITTLE_BYTE
|
|
# define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
|
|
# endif
|
|
diff --git a/libs/context/build/Jamfile.v2 b/libs/context/build/Jamfile.v2
|
|
index 30e959839..68e6981a7 100644
|
|
--- a/libs/context/build/Jamfile.v2
|
|
+++ b/libs/context/build/Jamfile.v2
|
|
@@ -83,6 +83,7 @@ local rule default_abi ( )
|
|
else if [ os.platform ] = "SW_64" { tmp = aapcs ; }
|
|
else if [ os.platform ] = "MIPS32" { tmp = o32 ; }
|
|
else if [ os.platform ] = "MIPS64" { tmp = n64 ; }
|
|
+ else if [ os.platform ] = "LOONGARCH64" { tmp = lp64 ; }
|
|
return $(tmp) ;
|
|
}
|
|
|
|
@@ -92,6 +93,7 @@ feature.feature abi
|
|
ms
|
|
n32
|
|
n64
|
|
+ lp64
|
|
o32
|
|
o64
|
|
sysv
|
|
@@ -207,6 +209,30 @@ alias asm_sources
|
|
<toolset>gcc
|
|
;
|
|
|
|
+# LOONGARCH
|
|
+# LOONGARCH64/LP64/ELF
|
|
+alias asm_sources
|
|
+ : asm/make_loongarch64_lp64_elf_gas.S
|
|
+ asm/jump_loongarch64_lp64_elf_gas.S
|
|
+ asm/ontop_loongarch64_lp64_elf_gas.S
|
|
+ : <abi>lp64
|
|
+ <address-model>64
|
|
+ <architecture>loongarch64
|
|
+ <binary-format>elf
|
|
+ <toolset>clang
|
|
+ ;
|
|
+
|
|
+alias asm_sources
|
|
+ : asm/make_loongarch64_lp64_elf_gas.S
|
|
+ asm/jump_loongarch64_lp64_elf_gas.S
|
|
+ asm/ontop_loongarch64_lp64_elf_gas.S
|
|
+ : <abi>lp64
|
|
+ <address-model>64
|
|
+ <architecture>loongarch64
|
|
+ <binary-format>elf
|
|
+ <toolset>gcc
|
|
+ ;
|
|
+
|
|
# ARM64
|
|
# ARM64/AAPCS/ELF
|
|
alias asm_sources
|
|
diff --git a/libs/context/src/asm/jump_loongarch64_lp64_elf_gas.S b/libs/context/src/asm/jump_loongarch64_lp64_elf_gas.S
|
|
new file mode 100644
|
|
index 000000000..a95a9eeb9
|
|
--- /dev/null
|
|
+++ b/libs/context/src/asm/jump_loongarch64_lp64_elf_gas.S
|
|
@@ -0,0 +1,117 @@
|
|
+/*
|
|
+ Copyright loongson 2018.
|
|
+ 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 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 0 | 8 | 16 | 24 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F24 | F25 | F26 | F27 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 40 | 48 | 56 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F28 | F29 | F30 | F31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 64 | 72 | 80 | 88 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S0 | S1 | S2 | S3 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S4 | S5 | S6 | S7 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | FP | GP | RA | PC | *
|
|
+ * ------------------------------------------------- *
|
|
+ * *
|
|
+ * *****************************************************/
|
|
+
|
|
+.file "jump_loongarch64_lp64_elf_gas.S"
|
|
+.text
|
|
+.globl jump_fcontext
|
|
+.align 3
|
|
+.type jump_fcontext,@function
|
|
+jump_fcontext:
|
|
+ # reserve space on stack
|
|
+ addi.d $sp, $sp, -160
|
|
+
|
|
+ st.d $s0, $sp, 64 # save S0
|
|
+ st.d $s1, $sp, 72 # save S1
|
|
+ st.d $s2, $sp, 80 # save S2
|
|
+ st.d $s3, $sp, 88 # save S3
|
|
+ st.d $s4, $sp, 96 # save S4
|
|
+ st.d $s5, $sp, 104 # save S5
|
|
+ st.d $s6, $sp, 112 # save S6
|
|
+ st.d $s7, $sp, 120 # save S7
|
|
+ st.d $s8, $sp, 128 # save S8
|
|
+ st.d $fp, $sp, 136 # save FP
|
|
+ st.d $ra, $sp, 144 # save RA
|
|
+ st.d $ra, $sp, 152 # save RA as PC
|
|
+
|
|
+
|
|
+ fst.d $fs0, $sp, 0 # save F24
|
|
+ fst.d $fs1, $sp, 8 # save F25
|
|
+ fst.d $fs2, $sp, 16 # save F26
|
|
+ fst.d $fs3, $sp, 24 # save F27
|
|
+ fst.d $fs4, $sp, 32 # save F28
|
|
+ fst.d $fs5, $sp, 40 # save F29
|
|
+ fst.d $fs6, $sp, 48 # save F30
|
|
+ fst.d $fs7, $sp, 56 # save F31
|
|
+
|
|
+ # swap a0(new stack), sp(old stack)
|
|
+ xor $a0, $a0, $sp
|
|
+ xor $sp, $a0, $sp
|
|
+ xor $a0, $a0, $sp
|
|
+
|
|
+ fld.d $fs0, $sp, 0 # restore F24
|
|
+ fld.d $fs1, $sp, 8 # restore F25
|
|
+ fld.d $fs2, $sp, 16 # restore F26
|
|
+ fld.d $fs3, $sp, 24 # restore F27
|
|
+ fld.d $fs4, $sp, 32 # restore F28
|
|
+ fld.d $fs5, $sp, 40 # restore F29
|
|
+ fld.d $fs6, $sp, 48 # restore F30
|
|
+ fld.d $fs7, $sp, 56 # restore F31
|
|
+
|
|
+ ld.d $s0, $sp, 64 # restore S0
|
|
+ ld.d $s1, $sp, 72 # restore S1
|
|
+ ld.d $s2, $sp, 80 # restore S2
|
|
+ ld.d $s3, $sp, 88 # restore S3
|
|
+ ld.d $s4, $sp, 96 # restore S4
|
|
+ ld.d $s5, $sp, 104 # restore S5
|
|
+ ld.d $s6, $sp, 112 # restore S6
|
|
+ ld.d $s7, $sp, 120 # restore S7
|
|
+ ld.d $s8, $sp, 128 # restore S8
|
|
+ ld.d $fp, $sp, 136 # restore FP
|
|
+ ld.d $ra, $sp, 144 # restore RA
|
|
+
|
|
+ # load PC
|
|
+ ld.d $t8, $sp, 152
|
|
+
|
|
+ # adjust stack
|
|
+ addi.d $sp, $sp, 160
|
|
+
|
|
+ # jump to context
|
|
+ jr $t8
|
|
+.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_loongarch64_lp64_elf_gas.S b/libs/context/src/asm/make_loongarch64_lp64_elf_gas.S
|
|
new file mode 100644
|
|
index 000000000..20106bee4
|
|
--- /dev/null
|
|
+++ b/libs/context/src/asm/make_loongarch64_lp64_elf_gas.S
|
|
@@ -0,0 +1,85 @@
|
|
+/*
|
|
+ Copyright loongson 2018.
|
|
+ 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 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 0 | 8 | 16 | 24 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F24 | F25 | F26 | F27 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 40 | 48 | 56 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F28 | F29 | F30 | F31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 64 | 72 | 80 | 88 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S0 | S1 | S2 | S3 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S4 | S5 | S6 | S7 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | FP | GP | RA | PC | *
|
|
+ * ------------------------------------------------- *
|
|
+ * *
|
|
+ * *****************************************************/
|
|
+
|
|
+.file "make_loongarch64_lp64_elf_gas.S"
|
|
+.text
|
|
+.globl make_fcontext
|
|
+.align 3
|
|
+.type make_fcontext,@function
|
|
+make_fcontext:
|
|
+ # shift address in A0 to lower 16 byte boundary
|
|
+ li.w $t0, 0xfffffffffffffff0
|
|
+ and $a0, $a0, $t0
|
|
+
|
|
+ # reserve space for context-data on context-stack
|
|
+ addi.d $a0, $a0, -160
|
|
+
|
|
+ # third arg of make_fcontext() == address of context-function
|
|
+ st.d $a2, $a0, 152
|
|
+
|
|
+ # save address of finish as return-address for context-function
|
|
+ # will be entered after context-function returns
|
|
+ la.local $t8, finish
|
|
+ st.d $t8, $a0, 144
|
|
+
|
|
+ # return pointer to context-data
|
|
+ jr $ra
|
|
+
|
|
+finish:
|
|
+ # reload our gp register (needed for la)
|
|
+ addi.d $t0, $sp, -160
|
|
+
|
|
+ # call _exit(0)
|
|
+ # the previous function should have left the 16 bytes incoming argument
|
|
+ # area on the stack which we reuse for calling _exit
|
|
+ la.global $t8, _exit
|
|
+ move $a0, $zero
|
|
+ jr $t8
|
|
+.size make_fcontext, .-make_fcontext
|
|
+
|
|
+/* Mark that we don't need executable stack. */
|
|
+.section .note.GNU-stack,"",%progbits
|
|
diff --git a/libs/context/src/asm/ontop_loongarch64_lp64_elf_gas.S b/libs/context/src/asm/ontop_loongarch64_lp64_elf_gas.S
|
|
new file mode 100644
|
|
index 000000000..3f976fcfe
|
|
--- /dev/null
|
|
+++ b/libs/context/src/asm/ontop_loongarch64_lp64_elf_gas.S
|
|
@@ -0,0 +1,117 @@
|
|
+/*
|
|
+ Copyright loongson 2018.
|
|
+ Distributed under the Boost Software License, Version 1.0.
|
|
+ (See accompanying file LICENSE_1_0.txt or copy at
|
|
+ http://www.boost.org/LICENSE
|
|
+*/
|
|
+
|
|
+/*******************************************************
|
|
+ * *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 0 | 8 | 16 | 24 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F24 | F25 | F26 | F27 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 40 | 48 | 56 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | F28 | F29 | F30 | F31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 64 | 72 | 80 | 88 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S0 | S1 | S2 | S3 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | S4 | S5 | S6 | S7 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
|
|
+ * ------------------------------------------------- *
|
|
+ * | FP | GP | RA | PC | *
|
|
+ * ------------------------------------------------- *
|
|
+ * *
|
|
+ * *****************************************************/
|
|
+
|
|
+.file "ontop_loongarch64_lp64_elf_gas.S"
|
|
+.text
|
|
+.globl ontop_fcontext
|
|
+.align 3
|
|
+.type ontop_fcontext,@function
|
|
+ontop_fcontext:
|
|
+ # reserve space on stack
|
|
+ addi.d $sp, $sp, -160
|
|
+
|
|
+ st.d $s0, $sp, 64 # save S0
|
|
+ st.d $s1, $sp, 72 # save S1
|
|
+ st.d $s2, $sp, 80 # save S2
|
|
+ st.d $s3, $sp, 88 # save S3
|
|
+ st.d $s4, $sp, 96 # save S4
|
|
+ st.d $s5, $sp, 104 # save S5
|
|
+ st.d $s6, $sp, 112 # save S6
|
|
+ st.d $s7, $sp, 120 # save S7
|
|
+ st.d $s8, $sp, 128 # save S8
|
|
+ st.d $fp, $sp, 136 # save FP
|
|
+ st.d $ra, $sp, 144 # save RA
|
|
+ st.d $ra, $sp, 152 # save RA as PC
|
|
+
|
|
+
|
|
+ fst.d $fs0, $sp, 0 # save F24
|
|
+ fst.d $fs1, $sp, 8 # save F25
|
|
+ fst.d $fs2, $sp, 16 # save F26
|
|
+ fst.d $fs3, $sp, 24 # save F27
|
|
+ fst.d $fs4, $sp, 32 # save F28
|
|
+ fst.d $fs5, $sp, 40 # save F29
|
|
+ fst.d $fs6, $sp, 48 # save F30
|
|
+ fst.d $fs7, $sp, 56 # save F31
|
|
+
|
|
+ # swap a0,sp
|
|
+ xor $a0, $a0, $sp
|
|
+ xor $sp, $a0, $sp
|
|
+ xor $a0, $a0, $sp
|
|
+
|
|
+ fld.d $fs0, $sp, 0 # restore F24
|
|
+ fld.d $fs1, $sp, 8 # restore F25
|
|
+ fld.d $fs2, $sp, 16 # restore F26
|
|
+ fld.d $fs3, $sp, 24 # restore F27
|
|
+ fld.d $fs4, $sp, 32 # restore F28
|
|
+ fld.d $fs5, $sp, 40 # restore F29
|
|
+ fld.d $fs6, $sp, 48 # restore F30
|
|
+ fld.d $fs7, $sp, 56 # restore F31
|
|
+
|
|
+ ld.d $s0, $sp, 64 # restore S0
|
|
+ ld.d $s1, $sp, 72 # restore S1
|
|
+ ld.d $s2, $sp, 80 # restore S2
|
|
+ ld.d $s3, $sp, 88 # restore S3
|
|
+ ld.d $s4, $sp, 96 # restore S4
|
|
+ ld.d $s5, $sp, 104 # restore S5
|
|
+ ld.d $s6, $sp, 112 # restore S6
|
|
+ ld.d $s7, $sp, 120 # restore S7
|
|
+ ld.d $s8, $sp, 128 # restore S8
|
|
+ ld.d $fp, $sp, 136 # restore FP
|
|
+ ld.d $ra, $sp, 144 # restore RA
|
|
+
|
|
+ # load PC
|
|
+ move $t8, $a2
|
|
+
|
|
+ # adjust stack
|
|
+ addi.d $sp, $sp, 160
|
|
+
|
|
+ # jump to context
|
|
+ jr $t8
|
|
+.size ontop_fcontext, .-ontop_fcontext
|
|
+
|
|
+/* Mark that we don't need executable stack. */
|
|
+.section .note.GNU-stack,"",%progbits
|
|
diff --git a/tools/build/src/engine/jam.h b/tools/build/src/engine/jam.h
|
|
index 59e5f82c0..76a786979 100644
|
|
--- a/tools/build/src/engine/jam.h
|
|
+++ b/tools/build/src/engine/jam.h
|
|
@@ -446,6 +446,10 @@
|
|
#define OSPLAT "OSPLAT=PARISC"
|
|
#endif
|
|
|
|
+#ifdef __loongarch64
|
|
+ #define OSPLAT "OSPLAT=LOONGARCH64"
|
|
+#endif
|
|
+
|
|
#ifndef OSPLAT
|
|
#define OSPLAT ""
|
|
#endif
|
|
diff --git a/tools/build/src/tools/builtin.py b/tools/build/src/tools/builtin.py
|
|
index 0368f6520..02ba21013 100644
|
|
--- a/tools/build/src/tools/builtin.py
|
|
+++ b/tools/build/src/tools/builtin.py
|
|
@@ -276,6 +276,9 @@ def register_globals ():
|
|
# z Systems (aka s390x)
|
|
's390x',
|
|
|
|
+ # loongarch
|
|
+ 'loongarch64',
|
|
+
|
|
# Combined architectures for platforms/toolsets that support building for
|
|
# multiple architectures at once. "combined" would be the default multi-arch
|
|
# for the toolset.
|
|
diff --git a/tools/build/src/tools/features/architecture-feature.jam b/tools/build/src/tools/features/architecture-feature.jam
|
|
index e3203078e..1048feafd 100644
|
|
--- a/tools/build/src/tools/features/architecture-feature.jam
|
|
+++ b/tools/build/src/tools/features/architecture-feature.jam
|
|
@@ -45,6 +45,9 @@ feature.feature architecture
|
|
# RISC-V
|
|
riscv
|
|
|
|
+ # loongarch
|
|
+ loongarch64
|
|
+
|
|
# z Systems (aka s390x)
|
|
s390x
|
|
:
|
|
--
|
|
2.33.0
|
|
|