Skip to content

Commit e76baaf

Browse files
authored
Update LoongArch64 support for lazy binding. (#19)
1 parent bbd94e7 commit e76baaf

File tree

9 files changed

+40
-13
lines changed

9 files changed

+40
-13
lines changed

.github/workflows/rust.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
run: sh ci/run.sh
2626
strategy:
2727
matrix:
28-
target: [ x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, riscv64gc-unknown-linux-gnu]
28+
target: [ x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, riscv64gc-unknown-linux-gnu, loongarch64-unknown-linux-gnu]
2929
channel: [ 1.88.0, stable ]
3030
features: [ "use-syscall", "version", "log" ]
3131

@@ -44,7 +44,7 @@ jobs:
4444
run: sh ci/run.sh
4545
strategy:
4646
matrix:
47-
target: [ x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, riscv64gc-unknown-linux-gnu]
47+
target: [ x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, riscv64gc-unknown-linux-gnu, loongarch64-unknown-linux-gnu]
4848
channel: [ 1.88.0, stable ]
4949
features: [ "use-syscall" ]
5050

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ rust-version = "1.88.0"
2323
members = ["crates/windows-elf-loader", "crates/mini-loader"]
2424

2525
[workspace.dependencies]
26-
syscalls = { version = "0.6.18", default-features = false }
26+
syscalls = { version = "0.7.0", default-features = false }
2727
elf = { version = "0.8", default-features = false }
2828
cfg-if = '1.0'
2929

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ Disable the `use-syscall` feature if you don't have an operating system.
122122
| aarch64 ||| ✅(CI) |
123123
| riscv64 ||| ✅(CI) |
124124
| riscv32 ||| ✅(Manual) |
125-
| loongarch64 || | ✅(Manual) |
125+
| loongarch64 || | ✅(CI) |
126126
| x86 ||| ✅(CI) |
127127
| arm ||| ✅(CI) |
128128

README_zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Found 11 outliers among 100 measurements (11.00%)
118118
| aarch64 ||| ✅(CI) |
119119
| riscv64 ||| ✅(CI) |
120120
| riscv32 ||| ✅(Manual) |
121-
| loongarch64 || | ✅(Manual ) |
121+
| loongarch64 || | ✅(CI) |
122122
| x86 ||| ✅(CI) |
123123
| arm ||| ✅(CI) |
124124

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ fn compile_dylib(target: &String) {
1414
.arg("-C")
1515
.arg("panic=abort")
1616
.arg("-C")
17-
.arg("linker=lld")
17+
.arg("linker=rust-lld")
1818
.arg(format!("{}/{}", DYLIB_DIR_PATH, name))
1919
.arg("--out-dir")
2020
.arg("target");

src/arch/loongarch64.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,36 @@ pub(crate) const RESOLVE_FUNCTION_OFFSET: usize = 0;
3131
pub extern "C" fn dl_runtime_resolve() {
3232
core::arch::naked_asm!(
3333
"
34+
addi.d $sp, $sp, -9*8
35+
st.d $ra, $sp, 0
36+
st.d $a0, $sp, 8
37+
st.d $a1, $sp, 16
38+
st.d $a2, $sp, 24
39+
st.d $a3, $sp, 32
40+
st.d $a4, $sp, 40
41+
st.d $a5, $sp, 48
42+
st.d $a6, $sp, 56
43+
st.d $a7, $sp, 64
44+
45+
move $a0, $t0
46+
srli.d $a1, $t1, 3
47+
bl dl_fixup
48+
49+
move $t0, $a0
50+
51+
ld.d $ra, $sp, 0
52+
ld.d $a0, $sp, 8
53+
ld.d $a1, $sp, 16
54+
ld.d $a2, $sp, 24
55+
ld.d $a3, $sp, 32
56+
ld.d $a4, $sp, 40
57+
ld.d $a5, $sp, 48
58+
ld.d $a6, $sp, 56
59+
ld.d $a7, $sp, 64
60+
61+
addi.d $sp, $sp, 9*8
62+
63+
jr $t0
3464
"
3565
)
3666
}

src/arch/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,6 @@ pub(crate) fn prepare_lazy_bind(got: *mut usize, dylib: usize) {
264264
got.add(RESOLVE_FUNCTION_OFFSET)
265265
.write(dl_runtime_resolve as usize);
266266
}
267-
268-
#[cfg(target_arch = "loongarch64")]
269-
unimplemented!()
270267
}
271268

272269
#[cfg(not(feature = "rel"))]

src/os/linux_syscall.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,14 @@ impl RawFile {
191191
pub(crate) fn from_path(path: &str) -> Result<Self> {
192192
const RDONLY: u32 = 0;
193193
let name = CString::from_str(path).unwrap().to_owned();
194-
#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))]
194+
#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64", target_arch = "loongarch64")))]
195195
let fd = unsafe {
196196
from_io_ret(
197197
syscalls::raw_syscall!(Sysno::open, name.as_ptr(), RDONLY, 0),
198198
"open failed",
199199
)?
200200
};
201-
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
201+
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64", target_arch = "loongarch64"))]
202202
let fd = unsafe {
203203
const AT_FDCWD: core::ffi::c_int = -100;
204204
from_io_ret(

0 commit comments

Comments
 (0)