[PATCH 0/2] LoongArch: Make bounds-checking instructions useful

From: WANG Xuerui
Date: Sun Apr 16 2023 - 13:34:17 EST


From: WANG Xuerui <git@xxxxxxxxxx>

Hi,

The LoongArch-64 base architecture is capable of performing
bounds-checking either before memory accesses or alone, with specialized
instructions generating BCEs (bounds-checking error) in case of failed
assertions (ISA manual Volume 1, Sections 2.2.6.1 [1] and 2.2.10.3 [2]).
This could be useful for managed runtimes, but the exception is not
being handled so far, resulting in SIGSYSes in these cases, which is
incorrect and warrants a fix in itself.

During experimentation, it was discovered that there is already UAPI for
expressing such semantics: SIGSEGV with si_code=SEGV_BNDERR. This was
originally added for Intel MPX, and there is currently no user (!) after
the removal of MPX support a few years ago. Although the semantics is
not a 1:1 match to that of LoongArch, still it is better than
alternatives such as SIGTRAP or SIGBUS of BUS_OBJERR kind, due to being
able to convey both the value that failed assertion and the bound value.

This patch series implements just this approach: translating BCEs into
SIGSEGVs with si_code=SEGV_BNDERR, si_value set to the offending value,
and si_lower and si_upper set to resemble a range with both lower and
upper bound while in fact there is only one.

The instructions are not currently used anywhere yet in the fledgling
LoongArch ecosystem, so it's not very urgent and we could take the time
to figure out the best way forward (should SEGV_BNDERR turn out not
suitable).

[1]: https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#bound-check-memory-access-instructions
[2]: https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#_asrtlegt_d

WANG Xuerui (2):
LoongArch: Add opcodes of bounds-checking instructions
LoongArch: Relay BCE exceptions to userland as SIGSEGVs with
si_code=SEGV_BNDERR

arch/loongarch/include/asm/inst.h | 26 +++++++
arch/loongarch/include/asm/kdebug.h | 1 +
arch/loongarch/kernel/genex.S | 1 +
arch/loongarch/kernel/traps.c | 107 ++++++++++++++++++++++++++++
4 files changed, 135 insertions(+)

--
2.40.0