Add field phys_bits in structure CPULoongArchState, to record max
supported physical address bits.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
target/loongarch/cpu.c | 13 +++++++------
target/loongarch/cpu.h | 2 ++
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index 55ee317bf2..f36a716282 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -517,7 +517,7 @@ static void loongarch_la464_initfn(Object *obj)
{
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
CPULoongArchState *env = &cpu->env;
- uint32_t data = 0, field;
+ uint32_t data = 0;
int i;
for (i = 0; i < 21; i++) {
@@ -531,12 +531,12 @@ static void loongarch_la464_initfn(Object *obj)
data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
if (kvm_enabled()) {
- /* GPA address width of VM is 47, field value is 47 - 1 */
- field = 0x2e;
+ /* GPA address width of VM is 47 */
+ env->phys_bits = 47;
} else {
- field = 0x2f; /* 48 bit - 1 */
+ env->phys_bits = 48;
}
- data = FIELD_DP32(data, CPUCFG1, PALEN, field);
+ data = FIELD_DP32(data, CPUCFG1, PALEN, env->phys_bits - 1);
data = FIELD_DP32(data, CPUCFG1, VALEN, 0x2f);
data = FIELD_DP32(data, CPUCFG1, UAL, 1);
data = FIELD_DP32(data, CPUCFG1, RI, 1);
@@ -632,10 +632,11 @@ static void loongarch_la132_initfn(Object *obj)
cpu->dtb_compatible = "loongarch,Loongson-1C103";
env->cpucfg[0] = 0x148042; /* PRID */
+ env->phys_bits = 32;
data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */
data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
- data = FIELD_DP32(data, CPUCFG1, PALEN, 0x1f); /* 32 bits */
+ data = FIELD_DP32(data, CPUCFG1, PALEN, env->phys_bits - 1); /* 32 bits */
data = FIELD_DP32(data, CPUCFG1, VALEN, 0x1f); /* 32 bits */
data = FIELD_DP32(data, CPUCFG1, UAL, 1);
data = FIELD_DP32(data, CPUCFG1, RI, 0);
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index 7731f6acdc..03433eb0de 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -390,6 +390,8 @@ typedef struct CPUArchState {
bool load_elf;
uint64_t elf_address;
uint32_t mp_state;
+ /* Number of physical address bits supported */
+ uint32_t phys_bits;
struct loongarch_boot_info *boot_info;
#endif
--
2.39.3