tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: rust and rust-bin confusion



> Date: Sun, 11 May 2025 13:00:33 +0900
> From: Rin Okuyama <rokuyama.rk%gmail.com@localhost>
> 
> ```
>     0x05e89a2c <+204>:     ldrex     r2, [r4]
> ...
>     0x05e89a3c <+220>:     mcr     15, 0, r0, cr7, cr10, {5}
>     0x05e89a40 <+224>:     strex     r1, r3, [r4]
>     0x05e89a44 <+228>:     cmp   r1, #0
>     0x05e89a48 <+232>:     bne 0x5e89a0c
> ```
> 
> Here, `mcr ...` is armv6 variant of `dmb`, which is dropped for
> armv8, and emulated by illegal insn handler; reservation made by
> `strex` is lost and `strex` always fails unconditionally.

Can you try running this on a kernel with SCTLR_EL1.CP15BEN enabled?

https://nxr.netbsd.org/xref/src/sys/arch/aarch64/aarch64/locore.S?r=1.95#1000

Just move it from the sctlr_clear bits to the sctlr_set bits.  (On
Linux there is a sysctl-equivalent for toggling this at runtime,
abi.cp15_barrier:
https://www.kernel.org/doc/Documentation/arm64/legacy_instructions.txt)

I believe this is an llvm code generation bug
(https://github.com/llvm/llvm-project/issues/41201) but until llvm
fixes it (or we patch llvm -- and, perhaps, rust-internal-llvm -- to
fix it), this might help to make progress on armv8 hardware if it
still supports this MCR instruction (CP15DMB).


Home | Main Index | Thread Index | Old Index