diff options
author | Alexandru Elisei <alexandru.elisei@arm.com> | 2022-06-29 11:39:05 +0100 |
---|---|---|
committer | Will Deacon <will@kernel.org> | 2022-07-01 16:31:59 +0100 |
commit | 6a1f699108e5c2a280d7cd1f1ae4816b8250a29f (patch) | |
tree | cb819ea4eacbe9572b924054313ec51d6428ab75 | |
parent | c86ef0b86366ce7e1320a902b2aa738166187667 (diff) | |
download | kvmtool-6a1f699108e5c2a280d7cd1f1ae4816b8250a29f.tar.gz |
arm64: pvtime: Use correct region size
pvtime uses ARM_PVTIME_BASE instead of ARM_PVTIME_SIZE for the size of the
memory region given to the guest, which causes to the following error when
creating a flash device (via the -F/--flash command line argument):
Error: RAM (read-only) region [2000000-27fffff] would overlap RAM region [1020000-203ffff]
The read-only region represents the guest memory where the flash image is
copied by kvmtool. The region starting at 0x102_0000 (ARM_PVTIME_BASE) is
the pvtime region, which should be 64K in size. kvmtool erroneously creates
the region to be ARM_PVTIME_BASE in size instead, and the last address
becomes:
ARM_PVTIME_BASE + ARM_PVTIME_BASE - 1 = 0x102_0000 + 0x102_0000 - 1 = 0x203_ffff
which corresponds to the end of the region from the error message.
Do the right thing and make the pvtime memory region ARM_PVTIME_SIZE = 64K
bytes, as it was intended.
Fixes: 7d4671e5d372 ("aarch64: Add stolen time support")
Reported-by: Pierre Gondois <pierre.gondois@arm.com>
Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Sebastian Ene <sebastianene@google.com>
Link: https://lore.kernel.org/r/20220629103905.24480-1-alexandru.elisei@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r-- | arm/aarch64/pvtime.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/arm/aarch64/pvtime.c b/arm/aarch64/pvtime.c index a49cf3ed..2933ac7c 100644 --- a/arm/aarch64/pvtime.c +++ b/arm/aarch64/pvtime.c @@ -14,15 +14,15 @@ static int pvtime__alloc_region(struct kvm *kvm) char *mem; int ret = 0; - mem = mmap(NULL, ARM_PVTIME_BASE, PROT_RW, + mem = mmap(NULL, ARM_PVTIME_SIZE, PROT_RW, MAP_ANON_NORESERVE, -1, 0); if (mem == MAP_FAILED) return -errno; ret = kvm__register_ram(kvm, ARM_PVTIME_BASE, - ARM_PVTIME_BASE, mem); + ARM_PVTIME_SIZE, mem); if (ret) { - munmap(mem, ARM_PVTIME_BASE); + munmap(mem, ARM_PVTIME_SIZE); return ret; } @@ -36,8 +36,8 @@ static int pvtime__teardown_region(struct kvm *kvm) return 0; kvm__destroy_mem(kvm, ARM_PVTIME_BASE, - ARM_PVTIME_BASE, usr_mem); - munmap(usr_mem, ARM_PVTIME_BASE); + ARM_PVTIME_SIZE, usr_mem); + munmap(usr_mem, ARM_PVTIME_SIZE); usr_mem = NULL; return 0; } |