Unaligned memory access with JDK
Palmer Dabbelt
palmer at dabbelt.com
Thu Jul 28 21:19:10 UTC 2022
On Thu, 28 Jul 2022 13:50:00 PDT (-0700), vladimir.kempik at gmail.com wrote:
> Hello
> I was recently playing with a simple risc-v core running on an fpga and found the idk crashes on it.
> It crashes with SIG_ILL : ILL_TRP, on a simple load from memory instruction.
> So I figured the main issue is unaligned memory access MacroAssembler::stop() and that risc-v core was pretty simple and didn’t support unaligned memory access.
> Here is what I found:
>
> void MacroAssembler::stop(const char* msg) {
> const char * msg1 = ((uint64_t)msg) & ~0x07 + 0x08;
> BLOCK_COMMENT(msg1);
> illegal_instruction(Assembler::csr::time);
> emit_int64((uintptr_t)msg1);
> }
>
> and emit_64 is :
> void emit_int64( int64_t x) { *((int64_t*) end()) = x; set_end(end() + sizeof(int64_t)); }
>
> the problem is that the end() pointer is shared between emit_int64, emit_int32, emit_int8, etc, and non of them do care about natural memory alignment for processed types:
>
> void emit_int32(int32_t x) {
> address curr = end();
> *((int32_t*) curr) = x;
> set_end(curr + sizeof(int32_t));
> }
>
> void emit_int8(int8_t x1) {
> address curr = end();
> *((int8_t*) curr++) = x1;
> set_end(curr);
> }
>
> So my question is - risc-v cores without unaligned memory access support - are they supported by risc-v openjdk port ?
Support for misaligned accesses lives in a weird grey area in RISC-V:
misaligned accesses used to be mandated by the ISA, but that requirement
was removed in 2018 via 61cadb9 ("Provide new description of misaligned
load/store behavior compatible with privileged architecture."). I just
sent a patch to document this, looks like we never bothered to write it
down (probably because nobody was watching for the ISA change).
That said, some implementations support misaligned accesses via a M-mode
trap handler, as implementations can do essentially anything they want
in RISC-V. IIUC most of the RISC-V OpenJDK port was done on systems
that have hardware support for misaligned accesses, but even on systems
that trap to M-mode the port should function correctly -- sure it'll be
slow, but the support should otherwise be transparent to userspace (and
even to Linux). It might be worth fixing that performance issue, but if
you're seeing a SIGILL from a misaligned access then there's likely also
a functional bug in the emulation routines or Linux.
More information about the riscv-port-dev
mailing list