386_common: Handle IOPB segment limit corner case more like the old code
This commit is contained in:
@@ -1429,26 +1429,29 @@ x86illegal(void)
|
|||||||
int
|
int
|
||||||
checkio(uint32_t port, int mask)
|
checkio(uint32_t port, int mask)
|
||||||
{
|
{
|
||||||
uint16_t t;
|
uint32_t t;
|
||||||
|
|
||||||
cpl_override = 1;
|
cpl_override = 1;
|
||||||
t = readmemw(tr.base, 0x66);
|
t = readmemw(tr.base, 0x66);
|
||||||
|
|
||||||
if (cpu_state.abrt) {
|
if (UNLIKELY(cpu_state.abrt)) {
|
||||||
cpl_override = 0;
|
cpl_override = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((t + (port >> 3UL) + 1) > tr.limit) {
|
t += (port >> 3UL);
|
||||||
|
mask <<= (port & 7);
|
||||||
|
if (UNLIKELY(mask & 0xff00)) {
|
||||||
|
if (LIKELY(t < tr.limit))
|
||||||
|
mask &= readmemwl(tr.base + t);
|
||||||
|
} else {
|
||||||
|
if (LIKELY(t <= tr.limit))
|
||||||
|
mask &= readmembl(tr.base + t);
|
||||||
|
}
|
||||||
cpl_override = 0;
|
cpl_override = 0;
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = readmemwl(tr.base + t + (port >> 3));
|
|
||||||
cpl_override = 0;
|
|
||||||
return (t >> (port & 7)) & mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef OLD_DIVEXCP
|
#ifdef OLD_DIVEXCP
|
||||||
# define divexcp() \
|
# define divexcp() \
|
||||||
{ \
|
{ \
|
||||||
|
Reference in New Issue
Block a user