mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
target/ppc: Check effective address validity
For Radix translation, the EA range is 64-bits. when EA(2:11) are nonzero, a segment interrupt should occur. Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com> Message-Id: <20211231073122.3183583-1-clg@kaod.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
932de56970
commit
9b4eaee4d4
2 changed files with 6 additions and 0 deletions
|
@ -32,6 +32,11 @@ static bool ppc_radix64_get_fully_qualified_addr(const CPUPPCState *env,
|
||||||
vaddr eaddr,
|
vaddr eaddr,
|
||||||
uint64_t *lpid, uint64_t *pid)
|
uint64_t *lpid, uint64_t *pid)
|
||||||
{
|
{
|
||||||
|
/* When EA(2:11) are nonzero, raise a segment interrupt */
|
||||||
|
if (eaddr & ~R_EADDR_VALID_MASK) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (msr_hv) { /* MSR[HV] -> Hypervisor/bare metal */
|
if (msr_hv) { /* MSR[HV] -> Hypervisor/bare metal */
|
||||||
switch (eaddr & R_EADDR_QUADRANT) {
|
switch (eaddr & R_EADDR_QUADRANT) {
|
||||||
case R_EADDR_QUADRANT0:
|
case R_EADDR_QUADRANT0:
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
/* Radix Quadrants */
|
/* Radix Quadrants */
|
||||||
#define R_EADDR_MASK 0x3FFFFFFFFFFFFFFF
|
#define R_EADDR_MASK 0x3FFFFFFFFFFFFFFF
|
||||||
|
#define R_EADDR_VALID_MASK 0xC00FFFFFFFFFFFFF
|
||||||
#define R_EADDR_QUADRANT 0xC000000000000000
|
#define R_EADDR_QUADRANT 0xC000000000000000
|
||||||
#define R_EADDR_QUADRANT0 0x0000000000000000
|
#define R_EADDR_QUADRANT0 0x0000000000000000
|
||||||
#define R_EADDR_QUADRANT1 0x4000000000000000
|
#define R_EADDR_QUADRANT1 0x4000000000000000
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue