Backout "ignoresegv" support on FreeBSD/x86 for now. Unfortunately, the

configure script would hang whereas standalone testing will pass all tests.
Any idea why??
- Unix/sigsegv.cpp (ix86_skip_instruction): Add decoder for mozbl instruction.
  (SIGSEGV_REGISTER_FILE [FreeBSD/x86]): Note why we start at EDI offset
  rather than plain sigcontext pointer. i.e. I don't know sigset_t size
  beforehand and don't intend to.
This commit is contained in:
gbeauche 2002-05-20 18:12:01 +00:00
parent edb377f181
commit d7c4d7afbf
3 changed files with 10 additions and 5 deletions

View File

@ -3,8 +3,7 @@ V1.0 (snapshot) - <date>
just 60Hz (e.g. moving the mouse made the caret blink faster)
- Unix: cleaned up pthread attributes [Brian Johnson]
- Unix: fixed floppy problems under Linux
- Unix: implement "ignoresegv" feature on Linux/x86, Linux/ppc, Darwin/ppc,
FreeBSD/x86
- Unix: implement "ignoresegv" feature on Linux/x86, Linux/ppc, Darwin/ppc
V1.0 (snapshot) - 15.Jan.2002
- added support for on-the-fly video resolution and depth switching, and

View File

@ -578,7 +578,7 @@ Unix:
Set this to "true" to ignore illegal memory accesses. The default
is "false". This feature is only implemented on the following
platforms: Linux/x86, Linux/ppc, Darwin/ppc, FreeBSD/x86.
platforms: Linux/x86, Linux/ppc, Darwin/ppc.
AmigaOS:

View File

@ -217,8 +217,11 @@ static void powerpc_decode_instruction(instruction_t *instruction, unsigned int
#define SIGSEGV_FAULT_ADDRESS sip->si_addr
#if (defined(i386) || defined(__i386__))
#define SIGSEGV_FAULT_INSTRUCTION (((struct sigcontext *)scp)->sc_eip)
#define SIGSEGV_REGISTER_FILE ((unsigned int *)&(((struct sigcontext *)scp)->sc_edi))
#define SIGSEGV_REGISTER_FILE ((unsigned int *)&(((struct sigcontext *)scp)->sc_edi)) /* EDI is the first GPR (even below EIP) in sigcontext */
/* (gb) Disable because this would hang configure script for some reason
* though standalone testing gets it right. Any idea why?
#define SIGSEGV_SKIP_INSTRUCTION ix86_skip_instruction
*/
#endif
#if defined(__linux__)
#if (defined(i386) || defined(__i386__))
@ -463,7 +466,9 @@ static bool ix86_skip_instruction(unsigned int * regs)
// Decode instruction
switch (eip[0]) {
case 0x0f:
if (eip[1] == 0xb7) { // MOVZX r32, r/m16
switch (eip[1]) {
case 0xb6: // MOVZX r32, r/m8
case 0xb7: // MOVZX r32, r/m16
switch (eip[2] & 0xc0) {
case 0x80:
reg = (eip[2] >> 3) & 7;
@ -479,6 +484,7 @@ static bool ix86_skip_instruction(unsigned int * regs)
break;
}
len += 3 + ix86_step_over_modrm(eip + 2);
break;
}
break;
case 0x8a: // MOV r8, r/m8