rCore icon indicating copy to clipboard operation
rCore copied to clipboard

Weird code generation on RISC-V 64

Open gjz010 opened this issue 3 years ago • 1 comments

The following code in memory.rs emits strange assembly code causing an infinite loop:

// T is specialized to some struct sized 336..
#[naked]
#[inline(never)]
#[link_section = ".text.copy_user"]
unsafe extern "C" fn write_user<T>(dst: *mut T, src: *const T) -> usize {
    dst.copy_from_nonoverlapping(src, 1);
    0
}

Generated assembly:

ffffffffc02000d6 <_ZN5rcore6memory12copy_to_user10write_user17h75f60bbde319fcafE>:
ffffffffc02000d6:	15000613          	li	a2,336 // struct size. 3rd argument of memcpy.
ffffffffc02000da:	00086097          	auipc	ra,0x86 // WHY IS IT USING ra FOR INTERMEDIATE ADDRESS CALCULATION?
ffffffffc02000de:	0f0080e7          	jalr	240(ra) # ffffffffc02861ca <memcpy> // now ra = ffffffffc02000e2 <li a0, 0>
ffffffffc02000e2:	4501                	li	a0,0 // BANG!
ffffffffc02000e4:	8082                	ret // goto BANG!

It seems that rustc optimizing copy_from_nonoverlapping into memcpy (in the naked function) results in this issue, but I'm not sure.

gjz010 avatar May 08 '21 20:05 gjz010

Seems these codes were introduced by @jiegec: https://github.com/rcore-os/rCore/commit/92a9674f6640be7563613b3dc6cf7f18ab965818#diff-daec1639ddc202cd1b84917f388b4323b107696dab34069cdb0af3133837102d

@jiegec 🍉🍉🍉

wangrunji0408 avatar May 10 '21 08:05 wangrunji0408