mirror of
https://github.com/xemu-project/xemu.git
synced 2024-12-03 17:11:01 +00:00
target/ppc: Yet another fix for KVM-HV HPTE accessors
As stated in the1ad9f0a464
commit log, the returned entries are not a whole PTEG. It was not a problem before1ad9f0a464
as it would read a single record assuming it contains a whole PTEG but now the code tries reading the entire PTEG and "if ((n - i) < invalid)" produces negative values which then are converted to size_t for memset() and that throws seg fault. This fixes the math. While here, fix the last @i increment as well. Fixes:1ad9f0a464
"target/ppc: Fix KVM-HV HPTE accessors" Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
8e5dc9ba49
commit
a36593e167
@ -2667,21 +2667,24 @@ void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n)
|
||||
|
||||
hdr = (struct kvm_get_htab_header *)buf;
|
||||
while ((i < n) && ((char *)hdr < (buf + rc))) {
|
||||
int invalid = hdr->n_invalid;
|
||||
int invalid = hdr->n_invalid, valid = hdr->n_valid;
|
||||
|
||||
if (hdr->index != (ptex + i)) {
|
||||
hw_error("kvmppc_read_hptes: Unexpected HPTE index %"PRIu32
|
||||
" != (%"HWADDR_PRIu" + %d", hdr->index, ptex, i);
|
||||
}
|
||||
|
||||
memcpy(hptes + i, hdr + 1, HASH_PTE_SIZE_64 * hdr->n_valid);
|
||||
i += hdr->n_valid;
|
||||
if (n - i < valid) {
|
||||
valid = n - i;
|
||||
}
|
||||
memcpy(hptes + i, hdr + 1, HASH_PTE_SIZE_64 * valid);
|
||||
i += valid;
|
||||
|
||||
if ((n - i) < invalid) {
|
||||
invalid = n - i;
|
||||
}
|
||||
memset(hptes + i, 0, invalid * HASH_PTE_SIZE_64);
|
||||
i += hdr->n_invalid;
|
||||
i += invalid;
|
||||
|
||||
hdr = (struct kvm_get_htab_header *)
|
||||
((char *)(hdr + 1) + HASH_PTE_SIZE_64 * hdr->n_valid);
|
||||
|
Loading…
Reference in New Issue
Block a user