mirror of https://github.com/xemu-project/xemu.git
target/riscv: misa to ISA string conversion fix
Some bits in RISC-V `misa' CSR should not be reflected in the ISA string. For instance, `S' and `U' (represents existence of supervisor and user mode, respectively) in `misa' CSR must not be copied since neither `S' nor `U' are valid single-letter extensions. This commit also removes all reserved/dropped single-letter "extensions" from the list. - "B": Not going to be a single-letter extension (misa.B is reserved). - "J": Not going to be a single-letter extension (misa.J is reserved). - "K": Not going to be a single-letter extension (misa.K is reserved). - "L": Dropped. - "N": Dropped. - "T": Dropped. It also clarifies that the variable `riscv_single_letter_exts' is a single-letter extension order list. Signed-off-by: Tsukasa OI <research_trasio@irq.a4lg.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <4a4c11213a161a7eedabe46abe58b351bb0e2ef2.1648473008.git.research_trasio@irq.a4lg.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
f32d82f6c3
commit
0e2c377023
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
/* RISC-V CPU definitions */
|
/* RISC-V CPU definitions */
|
||||||
|
|
||||||
static const char riscv_exts[26] = "IEMAFDQCLBJTPVNSUHKORWXYZG";
|
static const char riscv_single_letter_exts[] = "IEMAFDQCPVH";
|
||||||
|
|
||||||
const char * const riscv_int_regnames[] = {
|
const char * const riscv_int_regnames[] = {
|
||||||
"x0/zero", "x1/ra", "x2/sp", "x3/gp", "x4/tp", "x5/t0", "x6/t1",
|
"x0/zero", "x1/ra", "x2/sp", "x3/gp", "x4/tp", "x5/t0", "x6/t1",
|
||||||
|
@ -911,12 +911,12 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
|
||||||
char *riscv_isa_string(RISCVCPU *cpu)
|
char *riscv_isa_string(RISCVCPU *cpu)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const size_t maxlen = sizeof("rv128") + sizeof(riscv_exts) + 1;
|
const size_t maxlen = sizeof("rv128") + sizeof(riscv_single_letter_exts);
|
||||||
char *isa_str = g_new(char, maxlen);
|
char *isa_str = g_new(char, maxlen);
|
||||||
char *p = isa_str + snprintf(isa_str, maxlen, "rv%d", TARGET_LONG_BITS);
|
char *p = isa_str + snprintf(isa_str, maxlen, "rv%d", TARGET_LONG_BITS);
|
||||||
for (i = 0; i < sizeof(riscv_exts); i++) {
|
for (i = 0; i < sizeof(riscv_single_letter_exts) - 1; i++) {
|
||||||
if (cpu->env.misa_ext & RV(riscv_exts[i])) {
|
if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) {
|
||||||
*p++ = qemu_tolower(riscv_exts[i]);
|
*p++ = qemu_tolower(riscv_single_letter_exts[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
Loading…
Reference in New Issue