ppc/pnv: Fail DMA access if page permissions are not correct
If an iommu page has wrong permissions, an error message is displayed, but the access is allowed, which is odd. This patch fixes it. Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20220121152350.381685-1-fbarrat@linux.ibm.com> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
e31ea5d89b
commit
50c8e11ac0
@ -816,18 +816,19 @@ static void pnv_phb3_translate_tve(PnvPhb3DMASpace *ds, hwaddr addr,
|
||||
}
|
||||
|
||||
/* We exit the loop with TCE being the final TCE */
|
||||
tce_mask = ~((1ull << tce_shift) - 1);
|
||||
tlb->iova = addr & tce_mask;
|
||||
tlb->translated_addr = tce & tce_mask;
|
||||
tlb->addr_mask = ~tce_mask;
|
||||
tlb->perm = tce & 3;
|
||||
if ((is_write & !(tce & 2)) || ((!is_write) && !(tce & 1))) {
|
||||
phb3_error(phb, "TCE access fault at 0x%"PRIx64, taddr);
|
||||
phb3_error(phb, " xlate %"PRIx64":%c TVE=%"PRIx64, addr,
|
||||
is_write ? 'W' : 'R', tve);
|
||||
phb3_error(phb, " tta=%"PRIx64" lev=%d tts=%d tps=%d",
|
||||
tta, lev, tts, tps);
|
||||
return;
|
||||
}
|
||||
tce_mask = ~((1ull << tce_shift) - 1);
|
||||
tlb->iova = addr & tce_mask;
|
||||
tlb->translated_addr = tce & tce_mask;
|
||||
tlb->addr_mask = ~tce_mask;
|
||||
tlb->perm = tce & 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1291,18 +1291,19 @@ static void pnv_phb4_translate_tve(PnvPhb4DMASpace *ds, hwaddr addr,
|
||||
}
|
||||
|
||||
/* We exit the loop with TCE being the final TCE */
|
||||
tce_mask = ~((1ull << tce_shift) - 1);
|
||||
tlb->iova = addr & tce_mask;
|
||||
tlb->translated_addr = tce & tce_mask;
|
||||
tlb->addr_mask = ~tce_mask;
|
||||
tlb->perm = tce & 3;
|
||||
if ((is_write & !(tce & 2)) || ((!is_write) && !(tce & 1))) {
|
||||
phb_error(ds->phb, "TCE access fault at 0x%"PRIx64, taddr);
|
||||
phb_error(ds->phb, " xlate %"PRIx64":%c TVE=%"PRIx64, addr,
|
||||
is_write ? 'W' : 'R', tve);
|
||||
phb_error(ds->phb, " tta=%"PRIx64" lev=%d tts=%d tps=%d",
|
||||
tta, lev, tts, tps);
|
||||
return;
|
||||
}
|
||||
tce_mask = ~((1ull << tce_shift) - 1);
|
||||
tlb->iova = addr & tce_mask;
|
||||
tlb->translated_addr = tce & tce_mask;
|
||||
tlb->addr_mask = ~tce_mask;
|
||||
tlb->perm = tce & 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user