mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
target/riscv: remove supported from RISCVSATPMap
"supported" can be computed on the fly based on the max_satp_mode. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
211c7f9bb8
commit
dabb54c160
2 changed files with 25 additions and 13 deletions
|
@ -439,14 +439,27 @@ static void set_satp_mode_max_supported(RISCVCPU *cpu,
|
|||
bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
|
||||
const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
|
||||
|
||||
for (int i = 0; i <= satp_mode; ++i) {
|
||||
if (valid_vm[i]) {
|
||||
cpu->cfg.satp_mode.supported |= (1 << i);
|
||||
}
|
||||
assert(valid_vm[satp_mode]);
|
||||
cpu->cfg.max_satp_mode = satp_mode;
|
||||
}
|
||||
|
||||
static bool get_satp_mode_supported(RISCVCPU *cpu, uint16_t *supported)
|
||||
{
|
||||
bool rv32 = riscv_cpu_is_32bit(cpu);
|
||||
const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
|
||||
int satp_mode = cpu->cfg.max_satp_mode;
|
||||
|
||||
if (satp_mode == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
assert(cpu->cfg.satp_mode.supported & (1 << satp_mode));
|
||||
cpu->cfg.max_satp_mode = satp_mode;
|
||||
*supported = 0;
|
||||
for (int i = 0; i <= satp_mode; ++i) {
|
||||
if (valid_vm[i]) {
|
||||
*supported |= (1 << i);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Set the satp mode to the max supported */
|
||||
|
@ -1171,9 +1184,10 @@ static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
|
|||
static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
|
||||
{
|
||||
bool rv32 = riscv_cpu_is_32bit(cpu);
|
||||
uint16_t supported;
|
||||
uint8_t satp_mode_map_max;
|
||||
|
||||
if (cpu->cfg.max_satp_mode == -1) {
|
||||
if (!get_satp_mode_supported(cpu, &supported)) {
|
||||
/* The CPU wants the hypervisor to decide which satp mode to allow */
|
||||
return;
|
||||
}
|
||||
|
@ -1190,9 +1204,9 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
|
|||
*/
|
||||
for (int i = 1; i < 16; ++i) {
|
||||
if ((cpu->cfg.satp_mode.init & (1 << i)) &&
|
||||
(cpu->cfg.satp_mode.supported & (1 << i))) {
|
||||
supported & (1 << i)) {
|
||||
for (int j = i - 1; j >= 0; --j) {
|
||||
if (cpu->cfg.satp_mode.supported & (1 << j)) {
|
||||
if (supported & (1 << j)) {
|
||||
cpu->cfg.max_satp_mode = j;
|
||||
return;
|
||||
}
|
||||
|
@ -1221,7 +1235,7 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
|
|||
for (int i = satp_mode_map_max - 1; i >= 0; --i) {
|
||||
if (!(cpu->cfg.satp_mode.map & (1 << i)) &&
|
||||
(cpu->cfg.satp_mode.init & (1 << i)) &&
|
||||
(cpu->cfg.satp_mode.supported & (1 << i))) {
|
||||
(supported & (1 << i))) {
|
||||
error_setg(errp, "cannot disable %s satp mode if %s "
|
||||
"is enabled", satp_mode_str(i, false),
|
||||
satp_mode_str(satp_mode_map_max, false));
|
||||
|
|
|
@ -29,11 +29,9 @@
|
|||
*
|
||||
* init is a 16-bit bitmap used to make sure the user selected a correct
|
||||
* configuration as per the specification.
|
||||
*
|
||||
* supported is a 16-bit bitmap used to reflect the hw capabilities.
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t map, init, supported;
|
||||
uint16_t map, init;
|
||||
} RISCVSATPMap;
|
||||
|
||||
struct RISCVCPUConfig {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue