mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
target/ppc: Fix ordering of hash MMU accesses
With mttcg, we can have MMU lookups happening at the same time as the guest modifying the page tables. Since the HPTEs of the hash table MMU contains two words (or double worlds on 64-bit), we need to make sure we read them in the right order, with the correct memory barrier. Additionally, when using emulated SPAPR mode, the hypercalls writing to the hash table must also perform the udpates in the right order. Note: This part is still not entirely correct Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20190215170029.15641-7-clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
2819282dae
commit
3054b0ca4b
3 changed files with 31 additions and 2 deletions
|
@ -1524,8 +1524,25 @@ static void spapr_store_hpte(PPCVirtualHypervisor *vhyp, hwaddr ptex,
|
|||
if (!spapr->htab) {
|
||||
kvmppc_write_hpte(ptex, pte0, pte1);
|
||||
} else {
|
||||
stq_p(spapr->htab + offset, pte0);
|
||||
stq_p(spapr->htab + offset + HASH_PTE_SIZE_64 / 2, pte1);
|
||||
if (pte0 & HPTE64_V_VALID) {
|
||||
stq_p(spapr->htab + offset + HASH_PTE_SIZE_64 / 2, pte1);
|
||||
/*
|
||||
* When setting valid, we write PTE1 first. This ensures
|
||||
* proper synchronization with the reading code in
|
||||
* ppc_hash64_pteg_search()
|
||||
*/
|
||||
smp_wmb();
|
||||
stq_p(spapr->htab + offset, pte0);
|
||||
} else {
|
||||
stq_p(spapr->htab + offset, pte0);
|
||||
/*
|
||||
* When clearing it we set PTE0 first. This ensures proper
|
||||
* synchronization with the reading code in
|
||||
* ppc_hash64_pteg_search()
|
||||
*/
|
||||
smp_wmb();
|
||||
stq_p(spapr->htab + offset + HASH_PTE_SIZE_64 / 2, pte1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue