aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBibo Mao <maobibo@loongson.cn>2025-02-19 15:07:00 +0800
committerBibo Mao <maobibo@loongson.cn>2025-02-25 16:05:31 +0800
commit0262c8075e9dc62a53a4bd15ea8d92a4c9adf018 (patch)
treeaeda4ab9d525c809da4af1da3f65473acb53709d
parent7bd4eaa847fcdbc4505d9ab95dafa21791d8302a (diff)
downloadqemu-0262c8075e9dc62a53a4bd15ea8d92a4c9adf018.zip
qemu-0262c8075e9dc62a53a4bd15ea8d92a4c9adf018.tar.gz
qemu-0262c8075e9dc62a53a4bd15ea8d92a4c9adf018.tar.bz2
target/loongarch: Correct maximum physical address in KVM mode
On 3A5000 system, the physical address space width for host is 48, however 47 bit for KVM VM. For KVM VM, size of physical address space is the same with that of virtual user space address. Here modify physical address space width with 47 bit in KVM mode. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Bibo Mao <maobibo@loongson.cn>
-rw-r--r--target/loongarch/cpu.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index e91f4a5..f203fcc 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -406,7 +406,7 @@ static void loongarch_la464_initfn(Object *obj)
{
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
CPULoongArchState *env = &cpu->env;
- uint32_t data = 0;
+ uint32_t data = 0, field;
int i;
for (i = 0; i < 21; i++) {
@@ -419,7 +419,13 @@ static void loongarch_la464_initfn(Object *obj)
data = FIELD_DP32(data, CPUCFG1, ARCH, 2);
data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
- data = FIELD_DP32(data, CPUCFG1, PALEN, 0x2f);
+ if (kvm_enabled()) {
+ /* GPA address width of VM is 47, field value is 47 - 1 */
+ field = 0x2e;
+ } else {
+ field = 0x2f; /* 48 bit - 1 */
+ }
+ data = FIELD_DP32(data, CPUCFG1, PALEN, field);
data = FIELD_DP32(data, CPUCFG1, VALEN, 0x2f);
data = FIELD_DP32(data, CPUCFG1, UAL, 1);
data = FIELD_DP32(data, CPUCFG1, RI, 1);