Dynarec now jumps straight to GPF handler if it hits a NULL selector instead of relying on interpreter code to detect the GPF. Fixes hang in Windows 98 SE upgrade setup.
This commit is contained in:
parent
f0b213fef0
commit
2f1514d3b2
2 changed files with 8 additions and 8 deletions
|
|
@ -889,9 +889,9 @@ static inline void CHECK_SEG_READ(x86seg *seg)
|
|||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(0xff);
|
||||
}
|
||||
addbyte(0x0f); /*JE end*/
|
||||
addbyte(0x0f); /*JE BLOCK_GPF_OFFSET*/
|
||||
addbyte(0x84);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
|
||||
|
||||
seg->checked = 1;
|
||||
}
|
||||
|
|
@ -925,9 +925,9 @@ static inline void CHECK_SEG_WRITE(x86seg *seg)
|
|||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(0xff);
|
||||
}
|
||||
addbyte(0x0f); /*JE end*/
|
||||
addbyte(0x0f); /*JE BLOCK_GPF_OFFSET*/
|
||||
addbyte(0x84);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
|
||||
|
||||
seg->checked = 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -626,8 +626,8 @@ static inline void CHECK_SEG_READ(x86seg *seg)
|
|||
addlong((uint32_t)&seg->base);
|
||||
addbyte(-1);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x84); /*JE end*/
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addbyte(0x84); /*JE BLOCK_GPF_OFFSET*/
|
||||
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
|
||||
|
||||
seg->checked = 1;
|
||||
}
|
||||
|
|
@ -649,8 +649,8 @@ static inline void CHECK_SEG_WRITE(x86seg *seg)
|
|||
addlong((uint32_t)&seg->base);
|
||||
addbyte(-1);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x84); /*JE end*/
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addbyte(0x84); /*JE BLOCK_GPF_OFFSET*/
|
||||
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
|
||||
|
||||
seg->checked = 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue