Skip to content

Commit

Permalink
Merge pull request #197 from loongson-zn/develop
Browse files Browse the repository at this point in the history
Add support for loongarch64
  • Loading branch information
olk authored Feb 21, 2022
2 parents 83f9988 + e1001c4 commit fb8cda1
Show file tree
Hide file tree
Showing 9 changed files with 385 additions and 2 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ unset(_default_abi)

## Arch-and-model

set(_all_archs arm arm64 mips32 mips64 ppc32 ppc64 riscv64 s390x i386 x86_64 combined)
set(_all_archs arm arm64 loongarch64 mips32 mips64 ppc32 ppc64 riscv64 s390x i386 x86_64 combined)

# Try at start to auto determine arch from CMake.
if(CMAKE_SYSTEM_PROCESSOR IN_LIST _all_archs)
Expand All @@ -72,7 +72,7 @@ else()
endif()
endif()

set(BOOST_CONTEXT_ARCHITECTURE "${_default_arch}" CACHE STRING "Boost.Context architecture (arm, arm64, mips32, mips64, ppc32, ppc64, riscv64, s390x, i386, x86_64, combined)")
set(BOOST_CONTEXT_ARCHITECTURE "${_default_arch}" CACHE STRING "Boost.Context architecture (arm, arm64, loongarch64, mips32, mips64, ppc32, ppc64, riscv64, s390x, i386, x86_64, combined)")
set_property(CACHE BOOST_CONTEXT_ARCHITECTURE PROPERTY STRINGS ${_all_archs})

unset(_all_archs)
Expand Down
13 changes: 13 additions & 0 deletions build/Jamfile.v2
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,19 @@ alias asm_sources
<toolset>darwin
;

# LOONGARCH64
# LOONGARCH64/SYSV/ELF
alias asm_sources
: asm/make_loongarch64_sysv_elf_gas.S
asm/jump_loongarch64_sysv_elf_gas.S
asm/ontop_loongarch64_sysv_elf_gas.S
: <abi>sysv
<address-model>64
<architecture>loongarch
<binary-format>elf
<toolset>gcc
;

# MIPS
# MIPS32/O32/ELF
alias asm_sources
Expand Down
4 changes: 4 additions & 0 deletions build/architecture.jam
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ rule deduce-architecture ( properties * )
{
return <architecture>arm ;
}
else if [ configure.builds /boost/architecture//loongarch : $(properties) : loongarch ]
{
return <architecture>loongarch ;
}
else if [ configure.builds /boost/architecture//mips : $(properties) : mips ]
{
return <architecture>mips ;
Expand Down
1 change: 1 addition & 0 deletions doc/architectures.qbk
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ architectures:
[[arm (aarch32)] [AAPCS|ELF] [AAPCS|PE] [-] [AAPCS|MACH-O]]
[[arm (aarch64)] [AAPCS|ELF] [-] [AAPCS|MACH-O] [AAPCS|MACH-O]]
[[i386] [SYSV|ELF] [MS|PE] [SYSV|MACH-O] [-]]
[[loongarch64] [SYSV|ELF] [-] [-] [-]]
[[mips] [O32|N64|ELF] [-] [-] [-]]
[[ppc32] [SYSV|ELF|XCOFF] [-] [SYSV|MACH-O] [-]]
[[ppc64] [SYSV|ELF|XCOFF] [-] [SYSV|MACH-O] [-]]
Expand Down
27 changes: 27 additions & 0 deletions doc/context.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3379,6 +3379,33 @@
</para>
</entry>
</row>
<row>
<entry>
<para>
loongarch64
</para>
</entry>
<entry>
<para>
SYSV|ELF
</para>
</entry>
<entry>
<para>
-
</para>
</entry>
<entry>
<para>
-
</para>
</entry>
<entry>
<para>
-
</para>
</entry>
</row>
<row>
<entry>
<para>
Expand Down
27 changes: 27 additions & 0 deletions doc/html/context/architectures.html
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,33 @@
</td>
</tr>
<tr>
<td>
<p>
loongarch64
</p>
</td>
<td>
<p>
SYSV|ELF
</p>
</td>
<td>
<p>
-
</p>
</td>
<td>
<p>
-
</p>
</td>
<td>
<p>
-
</p>
</td>
</tr>
<tr>
<td>
<p>
mips
Expand Down
121 changes: 121 additions & 0 deletions src/asm/jump_loongarch64_sysv_elf_gas.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | FS0 | FS1 | FS2 | FS3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | FS4 | FS5 | FS6 | FS7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 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 | *
* ------------------------------------------------- *
* | S8 | FP | RA | PC | *
* ------------------------------------------------- *
* *
* *****************************************************/

.file "jump_loongarch64_sysv_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,@function
jump_fcontext:
# reserve space on stack
addi.d $sp, $sp, -160

# save fs0 - fs7
fst.d $fs0, $sp, 0
fst.d $fs1, $sp, 8
fst.d $fs2, $sp, 16
fst.d $fs3, $sp, 24
fst.d $fs4, $sp, 32
fst.d $fs5, $sp, 40
fst.d $fs6, $sp, 48
fst.d $fs7, $sp, 56

# save s0 - s8, fp, ra
st.d $s0, $sp, 64
st.d $s1, $sp, 72
st.d $s2, $sp, 80
st.d $s3, $sp, 88
st.d $s4, $sp, 96
st.d $s5, $sp, 104
st.d $s6, $sp, 112
st.d $s7, $sp, 120
st.d $s8, $sp, 128
st.d $fp, $sp, 136
st.d $ra, $sp, 144

# save RA as PC
st.d $ra, $sp, 152

# store SP (pointing to context-data) in A2
move $a2, $sp

# restore SP (pointing to context-data) from A0
move $sp, $a0

# load fs0 - fs7
fld.d $fs0, $sp, 0
fld.d $fs1, $sp, 8
fld.d $fs2, $sp, 16
fld.d $fs3, $sp, 24
fld.d $fs4, $sp, 32
fld.d $fs5, $sp, 40
fld.d $fs6, $sp, 48
fld.d $fs7, $sp, 56

#load s0 - s7
ld.d $s0, $sp, 64
ld.d $s1, $sp, 72
ld.d $s2, $sp, 80
ld.d $s3, $sp, 88
ld.d $s4, $sp, 96
ld.d $s5, $sp, 104
ld.d $s6, $sp, 112
ld.d $s7, $sp, 120
ld.d $s8, $sp, 128
ld.d $fp, $sp, 136
ld.d $ra, $sp, 144

# return transfer_t from jump
# pass transfer_t as first arg in context function
# a0 == FCTX, a1 == DATA
move $a0, $a2

# load PC
ld.d $a2, $sp, 152

# restore stack
addi.d $sp, $sp, 160

# jump to context
jr $a2
.size jump_fcontext, .-jump_fcontext

/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
72 changes: 72 additions & 0 deletions src/asm/make_loongarch64_sysv_elf_gas.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | FS0 | FS1 | FS2 | FS3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | FS4 | FS5 | FS6 | FS7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 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 | *
* ------------------------------------------------- *
* | S8 | FP | RA | PC | *
* ------------------------------------------------- *
* *
* *****************************************************/

.file "make_loongarch64_sysv_elf_gas.S"
.text
.globl make_fcontext
.align 2
.type make_fcontext,@function
make_fcontext:
# shift address in A0 to lower 16 byte boundary
bstrins.d $a0, $zero, 3, 0

# 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 $a4, finish
st.d $a4, $a0, 144

# return pointer to context-data
jr $ra

finish:
# exit code is zero
li.d $a0, 0
# call _exit(0)
b %plt(_exit)

.size make_fcontext, .-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
Loading

0 comments on commit fb8cda1

Please sign in to comment.