target/riscv/tcg: handle profile MISA bits
The profile support is handling multi-letter extensions only. Let's add support for MISA bits as well. We'll go through every known MISA bit. If the profile doesn't declare the bit as mandatory, ignore it. Otherwise, set the bit in env->misa_ext and env->misa_ext_mask. Now that we're setting profile MISA bits, one can use the rv64i CPU to boot Linux using the following options: -cpu rv64i,rva22u64=true,rv39=true,s=true,zifencei=true In the near future, when rva22s64 (where, 's', 'zifencei' and sv39 are mandatory), is implemented, rv64i will be able to boot Linux loading rva22s64 and no additional flags. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20231218125334.37184-14-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
a8c31f935c
commit
3ba8462c4c
@ -946,6 +946,27 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
|
||||
profile->user_set = true;
|
||||
profile->enabled = value;
|
||||
|
||||
for (i = 0; misa_bits[i] != 0; i++) {
|
||||
uint32_t bit = misa_bits[i];
|
||||
|
||||
if (!(profile->misa_ext & bit)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bit == RVI && !profile->enabled) {
|
||||
/*
|
||||
* Disabling profiles will not disable the base
|
||||
* ISA RV64I.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
|
||||
g_hash_table_insert(misa_ext_user_opts,
|
||||
GUINT_TO_POINTER(bit),
|
||||
(gpointer)value);
|
||||
riscv_cpu_write_misa_bit(cpu, bit, profile->enabled);
|
||||
}
|
||||
|
||||
for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
|
||||
ext_offset = profile->ext_offsets[i];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user