LoongArch: Relay BCE exceptions to userland as SIGSEGV with si_code=SEGV_BNDERR
SEGV_BNDERR was introduced initially for supporting the Intel MPX, but
fell into disuse after the MPX support was removed. The LoongArch
bounds-checking instructions behave very differently than MPX, but
overall the interface is still kind of suitable for conveying the
information to userland when bounds-checking assertions trigger, so we
wouldn't have to invent more UAPI. Specifically, when the BCE triggers,
a SEGV_BNDERR is sent to userland, with si_addr set to the out-of-bounds
address or value (in asrt{gt,le}'s case), and one of si_lower or
si_upper set to the configured bound depending on the faulting
instruction. The other bound is set to either 0 or ULONG_MAX to resemble
a range with both lower and upper bounds.
Note that it is possible to have si_addr == si_lower in case of a
failing asrtgt or {ld,st}gt, because those instructions test for strict
greater-than relationship. This should not pose a problem for userland,
though, because the faulting PC is available for the application to
associate back to the exact instruction for figuring out the
expectation.
Example exception context generated by a faulting `asrtgt.d t0, t1`
(assert t0 > t1 or BCE) with t0=100 and t1=200:
> pc
00005555558206a4 ra
00007ffff2d854fc tp
00007ffff2f2f180 sp
00007ffffbf9fb80
> a0
0000000000000002 a1
00007ffffbf9fce8 a2
00007ffffbf9fd00 a3
00007ffff2ed4558
> a4
0000000000000000 a5
00007ffff2f044c8 a6
00007ffffbf9fce0 a7
fffffffffffff000
> t0
0000000000000064 t1
00000000000000c8 t2
00007ffffbfa2d5e t3
00007ffff2f12aa0
> t4
00007ffff2ed6158 t5
00007ffff2ed6158 t6
000000000000002e t7
0000000003d8f538
> t8
0000000000000005 u0
0000000000000000 s9
0000000000000000 s0
00007ffffbf9fce8
> s1
0000000000000002 s2
0000000000000000 s3
00007ffff2f2c038 s4
0000555555820610
> s5
00007ffff2ed5000 s6
0000555555827e38 s7
00007ffffbf9fd00 s8
0000555555827e38
> ra:
00007ffff2d854fc
> ERA:
00005555558206a4
> CRMD:
000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE)
> PRMD:
00000007 (PPLV3 +PIE -PWE)
> EUEN:
00000000 (-FPE -SXE -ASXE -BTE)
> ECFG:
0007181c (LIE=2-4,11-12 VS=7)
> ESTAT:
000a0000 [BCE] (IS= ECode=10 EsubCode=0)
> PRID:
0014c010 (Loongson-64bit, Loongson-3A5000)
Signed-off-by: WANG Xuerui <git@xen0n.name>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>