mirror of
https://git.proxmox.com/git/qemu
synced 2025-07-09 19:08:05 +00:00
Fix off-by-one in address check.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3382 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
ea6fd42fa2
commit
89fc88da4c
@ -131,18 +131,14 @@ static int get_physical_address (CPUState *env, target_ulong *physical,
|
|||||||
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
||||||
}
|
}
|
||||||
#if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64)
|
#if defined(TARGET_MIPSN32) || defined(TARGET_MIPS64)
|
||||||
/*
|
} else if (address < 0x4000000000000000ULL) {
|
||||||
XXX: Assuming :
|
|
||||||
- PABITS = 36 (correct for MIPS64R1)
|
|
||||||
*/
|
|
||||||
} else if (address < 0x3FFFFFFFFFFFFFFFULL) {
|
|
||||||
/* xuseg */
|
/* xuseg */
|
||||||
if (UX && address < (0x3FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
if (UX && address < (0x3FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
||||||
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
||||||
} else {
|
} else {
|
||||||
ret = TLBRET_BADADDR;
|
ret = TLBRET_BADADDR;
|
||||||
}
|
}
|
||||||
} else if (address < 0x7FFFFFFFFFFFFFFFULL) {
|
} else if (address < 0x8000000000000000ULL) {
|
||||||
/* xsseg */
|
/* xsseg */
|
||||||
if ((supervisor_mode || kernel_mode) &&
|
if ((supervisor_mode || kernel_mode) &&
|
||||||
SX && address < (0x7FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
SX && address < (0x7FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
||||||
@ -150,16 +146,17 @@ static int get_physical_address (CPUState *env, target_ulong *physical,
|
|||||||
} else {
|
} else {
|
||||||
ret = TLBRET_BADADDR;
|
ret = TLBRET_BADADDR;
|
||||||
}
|
}
|
||||||
} else if (address < 0xBFFFFFFFFFFFFFFFULL) {
|
} else if (address < 0xC000000000000000ULL) {
|
||||||
/* xkphys */
|
/* xkphys */
|
||||||
|
/* XXX: Assumes PABITS = 36 (correct for MIPS64R1) */
|
||||||
if (kernel_mode && KX &&
|
if (kernel_mode && KX &&
|
||||||
(address & 0x07FFFFFFFFFFFFFFULL) < 0X0000000FFFFFFFFFULL) {
|
(address & 0x07FFFFFFFFFFFFFFULL) < 0x0000000FFFFFFFFFULL) {
|
||||||
*physical = address & 0X0000000FFFFFFFFFULL;
|
*physical = address & 0x0000000FFFFFFFFFULL;
|
||||||
*prot = PAGE_READ | PAGE_WRITE;
|
*prot = PAGE_READ | PAGE_WRITE;
|
||||||
} else {
|
} else {
|
||||||
ret = TLBRET_BADADDR;
|
ret = TLBRET_BADADDR;
|
||||||
}
|
}
|
||||||
} else if (address < 0xFFFFFFFF7FFFFFFFULL) {
|
} else if (address < 0xFFFFFFFF80000000ULL) {
|
||||||
/* xkseg */
|
/* xkseg */
|
||||||
if (kernel_mode && KX &&
|
if (kernel_mode && KX &&
|
||||||
address < (0xFFFFFFFF7FFFFFFFULL & env->SEGMask)) {
|
address < (0xFFFFFFFF7FFFFFFFULL & env->SEGMask)) {
|
||||||
@ -185,7 +182,7 @@ static int get_physical_address (CPUState *env, target_ulong *physical,
|
|||||||
ret = TLBRET_BADADDR;
|
ret = TLBRET_BADADDR;
|
||||||
}
|
}
|
||||||
} else if (address < (int32_t)0xE0000000UL) {
|
} else if (address < (int32_t)0xE0000000UL) {
|
||||||
/* sseg */
|
/* sseg (kseg2) */
|
||||||
if (supervisor_mode || kernel_mode) {
|
if (supervisor_mode || kernel_mode) {
|
||||||
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
ret = env->tlb->map_address(env, physical, prot, address, rw, access_type);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user