• WANG Xuerui's avatar
    LoongArch: Relay BCE exceptions to userland as SIGSEGV with si_code=SEGV_BNDERR · c23e7f01
    WANG Xuerui authored
    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: default avatarWANG Xuerui <git@xen0n.name>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    c23e7f01
inst.h 17.1 KB