• Xu Kuohai's avatar
    arm64: insn: Add encoders for LDRSB/LDRSH/LDRSW · 6c9f86d3
    Xu Kuohai authored
    To support BPF sign-extend load instructions, add encoders for
    LDRSB/LDRSH/LDRSW.
    
    LDRSB/LDRSH/LDRSW (immediate) is encoded as follows:
    
         3     2 2   2   2                       1         0         0
         0     7 6   4   2                       0         5         0
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | sz|1 1 1|0|0 1|opc|        imm12          |    Rn   |    Rt   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    LDRSB/LDRSH/LDRSW (register) is encoded as follows:
    
         3     2 2   2   2 2         1     1 1   1         0         0
         0     7 6   4   2 1         6     3 2   0         5         0
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | sz|1 1 1|0|0 0|opc|1|    Rm   | opt |S|1 0|    Rn   |    Rt   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    where:
    
       - sz
         indicates whether 8-bit, 16-bit or 32-bit data is to be loaded
    
       - opc
         opc[1] (bit 23) is always 1 and opc[0] == 1 indicates regsize
         is 32-bit. Since BPF signed load instructions always exend the
         sign bit to bit 63 regardless of whether it loads an 8-bit,
         16-bit or 32-bit data. So only 64-bit register size is required.
         That is, it's sufficient to set field opc fixed to 0x2.
    
       - opt
         Indicates whether to sign extend the offset register Rm and the
         effective bits of Rm. We set opt to 0x7 (SXTX) since we'll use
         Rm as a sgined 64-bit value in BPF.
    
       - S
         Optional only when opt field is 0x3 (LSL)
    
    In short, the above fields are encoded to the values listed below.
    
                       sz   opc  opt   S
    LDRSB (immediate)  0x0  0x2  na    na
    LDRSH (immediate)  0x1  0x2  na    na
    LDRSW (immediate)  0x2  0x2  na    na
    LDRSB (register)   0x0  0x2  0x7   0
    LDRSH (register)   0x1  0x2  0x7   0
    LDRSW (register)   0x2  0x2  0x7   0
    Signed-off-by: default avatarXu Kuohai <xukuohai@huawei.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Tested-by: default avatarFlorent Revest <revest@chromium.org>
    Acked-by: default avatarFlorent Revest <revest@chromium.org>
    Link: https://lore.kernel.org/bpf/20230815154158.717901-2-xukuohai@huaweicloud.com
    6c9f86d3
insn.h 23.3 KB