@samitouri / QOSamiQemu / commits / 9273cda722

disas/riscv.c: add 'cbo' insns to disassembler

We forgot to add 'cbo' insns to disas/riscv.c. The result is that the disassembler recognizes all of them as 'lq', an insn that happens to share the same opcode space. While we're at it reorder cbo_* entries in insn32.decode using opcode order instead of insn name. Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3480 Signed-off-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260519204714.1376551-1-daniel.barboza@oss.qualcomm.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Daniel Henrique Barboza committed May 19, 2026 at 17:47 UTC 9273cda72293ed2f414a0f239c4ac78fb7838c0e
2 files changed +29 -2
disas/riscv.c
+28 -1
@@ -985,6 +985,10 @@ typedef enum {
985 rv_op_ssamoswap_d = 953,
986 rv_op_c_sspush = 954,
987 rv_op_c_sspopchk = 955,
988 + rv_op_cbo_inval = 956,
989 + rv_op_cbo_clean = 957,
990 + rv_op_cbo_flush = 958,
991 + rv_op_cbo_zero = 959,
992 } rv_op;
993
994 /* register names */
@@ -2255,6 +2259,10 @@ const rv_opcode_data rvi_opcode_data[] = {
2259 rv_op_sspush, 0 },
2260 { "c.sspopchk", rv_codec_cmop_ss, rv_fmt_rs1, NULL, rv_op_sspopchk,
2261 rv_op_sspopchk, 0 },
2262 + { "cbo.inval", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
2263 + { "cbo.clean", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
2264 + { "cbo.flush", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
2265 + { "cbo.zero", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
2266 };
2267
2268 /* CSR names */
@@ -2876,7 +2884,26 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
2884 switch ((inst >> 12) & 0b111) {
2885 case 0: op = rv_op_fence; break;
2886 case 1: op = rv_op_fence_i; break;
2879 - case 2: op = rv_op_lq; break;
2887 + case 2:
2888 + /*
2889 + * 'lq' shares the "(...) 010 ..... 0001111" opcode space
2890 + * with 'cbo' insns. Check the next 5 bits to select
2891 + * what we want:
2892 + *
2893 + * cbo_inval 0000000 00000 ..... 010 00000 0001111
2894 + * cbo_clean 0000000 00001 ..... 010 00000 0001111
2895 + * cbo_flush 0000000 00010 ..... 010 00000 0001111
2896 + * cbo_zero 0000000 00100 ..... 010 00000 0001111
2897 + *
2898 + * Anything that doesn't match these will default to 'lq'.
2899 + */
2900 + switch ((inst >> 17) & 0b11111) {
2901 + case 0: op = rv_op_cbo_inval; break;
2902 + case 1: op = rv_op_cbo_clean; break;
2903 + case 2: op = rv_op_cbo_flush; break;
2904 + case 4: op = rv_op_cbo_zero; break;
2905 + default: op = rv_op_lq; break;
2906 + }
2907 }
2908 break;
2909 case 4:
target/riscv/insn32.decode
+1 -1
@@ -207,9 +207,9 @@ ldu ............ ..... 111 ..... 0000011 @i
207 {
208 [
209 # *** RV32 Zicbom Standard Extension ***
210 + cbo_inval 0000000 00000 ..... 010 00000 0001111 @sfence_vm
211 cbo_clean 0000000 00001 ..... 010 00000 0001111 @sfence_vm
212 cbo_flush 0000000 00010 ..... 010 00000 0001111 @sfence_vm
212 - cbo_inval 0000000 00000 ..... 010 00000 0001111 @sfence_vm
213
214 # *** RV32 Zicboz Standard Extension ***
215 cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm