mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -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;
|
bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
|
||||||
const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
|
const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
|
||||||
|
|
||||||
for (int i = 0; i <= satp_mode; ++i) {
|
assert(valid_vm[satp_mode]);
|
||||||
if (valid_vm[i]) {
|
cpu->cfg.max_satp_mode = satp_mode;
|
||||||
cpu->cfg.satp_mode.supported |= (1 << i);
|
}
|
||||||
}
|
|
||||||
|
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));
|
*supported = 0;
|
||||||
cpu->cfg.max_satp_mode = satp_mode;
|
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 */
|
/* 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)
|
static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
|
||||||
{
|
{
|
||||||
bool rv32 = riscv_cpu_is_32bit(cpu);
|
bool rv32 = riscv_cpu_is_32bit(cpu);
|
||||||
|
uint16_t supported;
|
||||||
uint8_t satp_mode_map_max;
|
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 */
|
/* The CPU wants the hypervisor to decide which satp mode to allow */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1190,9 +1204,9 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
|
||||||
*/
|
*/
|
||||||
for (int i = 1; i < 16; ++i) {
|
for (int i = 1; i < 16; ++i) {
|
||||||
if ((cpu->cfg.satp_mode.init & (1 << 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) {
|
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;
|
cpu->cfg.max_satp_mode = j;
|
||||||
return;
|
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) {
|
for (int i = satp_mode_map_max - 1; i >= 0; --i) {
|
||||||
if (!(cpu->cfg.satp_mode.map & (1 << i)) &&
|
if (!(cpu->cfg.satp_mode.map & (1 << i)) &&
|
||||||
(cpu->cfg.satp_mode.init & (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 "
|
error_setg(errp, "cannot disable %s satp mode if %s "
|
||||||
"is enabled", satp_mode_str(i, false),
|
"is enabled", satp_mode_str(i, false),
|
||||||
satp_mode_str(satp_mode_map_max, 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
|
* init is a 16-bit bitmap used to make sure the user selected a correct
|
||||||
* configuration as per the specification.
|
* configuration as per the specification.
|
||||||
*
|
|
||||||
* supported is a 16-bit bitmap used to reflect the hw capabilities.
|
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t map, init, supported;
|
uint16_t map, init;
|
||||||
} RISCVSATPMap;
|
} RISCVSATPMap;
|
||||||
|
|
||||||
struct RISCVCPUConfig {
|
struct RISCVCPUConfig {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue