Hi, Ciao, Marcus License: LGPL Changelog: Use Iar (Instruction Address Register) instead of Fill[0]. siginfo.si_code uses the lower 16bit for the type of the exception. Index: dlls/ntdll/exception.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/exception.c,v retrieving revision 1.47 diff -u -r1.47 exception.c --- dlls/ntdll/exception.c 17 Aug 2002 01:19:06 -0000 1.47 +++ dlls/ntdll/exception.c 29 Aug 2002 14:53:02 -0000 @@ -49,7 +49,7 @@ #elif defined(__sparc__) # define GET_IP(context) ((LPVOID)(context)->pc) #elif defined(__powerpc__) -# define GET_IP(context) ((LPVOID)(context)->Fill[0]) +# define GET_IP(context) ((LPVOID)(context)->Iar) #else # error You must define GET_IP for this CPU #endif Index: dlls/ntdll/signal_powerpc.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/signal_powerpc.c,v retrieving revision 1.2 diff -u -r1.2 signal_powerpc.c --- dlls/ntdll/signal_powerpc.c 28 Aug 2002 23:42:34 -0000 1.2 +++ dlls/ntdll/signal_powerpc.c 29 Aug 2002 14:53:02 -0000 @@ -106,7 +106,7 @@ C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28); C(29); C(30); C(31); - CX(Fill[0],nip); + CX(Iar,nip); CX(Msr,msr); CX(Ctr,ctr); #undef CX @@ -139,7 +139,7 @@ C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28); C(29); C(30); C(31); - CX(Fill[0],nip); + CX(Iar,nip); CX(Msr,msr); CX(Ctr,ctr); #undef CX @@ -222,7 +222,7 @@ rec.NumberParameters = 0; switch (__siginfo->si_signo) { case SIGSEGV: - switch (__siginfo->si_code) { + switch ( __siginfo->si_code & 0xffff ) { case SEGV_MAPERR: case SEGV_ACCERR: rec.NumberParameters = 2; @@ -237,7 +237,7 @@ } break; case SIGBUS: - switch (__siginfo->si_code) { + switch ( __siginfo->si_code & 0xffff ) { case BUS_ADRALN: rec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT; break; @@ -256,7 +256,7 @@ } break; case SIGILL: - switch (__siginfo->si_code) { + switch ( __siginfo->si_code & 0xffff ) { case ILL_ILLOPC: /* illegal opcode */ case ILL_ILLOPN: /* illegal operand */ case ILL_ILLADR: /* illegal addressing mode */ @@ -298,7 +298,7 @@ rec.NumberParameters = 0; /* FIXME: check if we might need to modify PC */ - switch (__siginfo->si_code) { + switch (__siginfo->si_code & 0xffff) { case TRAP_BRKPT: rec.ExceptionCode = EXCEPTION_BREAKPOINT; break; @@ -324,7 +324,7 @@ /*save_fpu( &context, HANDLER_CONTEXT );*/ save_context( &context, HANDLER_CONTEXT ); - switch ( __siginfo->si_code ) { + switch ( __siginfo->si_code & 0xffff ) { case FPE_FLTSUB: rec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED; break; @@ -377,7 +377,7 @@ rec.ExceptionCode = CONTROL_C_EXIT; rec.ExceptionFlags = EXCEPTION_CONTINUABLE; rec.ExceptionRecord = NULL; - rec.ExceptionAddress = (LPVOID)context.Fill[0]; + rec.ExceptionAddress = (LPVOID)context.Iar; rec.NumberParameters = 0; EXC_RtlRaiseException( &rec, &context ); restore_context( &context, HANDLER_CONTEXT ); Index: include/winnt.h =================================================================== RCS file: /home/wine/wine/include/winnt.h,v retrieving revision 1.119 diff -u -r1.119 winnt.h --- include/winnt.h 26 Aug 2002 21:39:17 -0000 1.119 +++ include/winnt.h 29 Aug 2002 14:53:26 -0000 @@ -959,7 +959,7 @@ /* These are selected by CONTEXT_CONTROL */ DWORD Msr; - DWORD Iar; + DWORD Iar; /* Instruction Address Register , aka PC ... */ DWORD Lr; DWORD Ctr; Index: server/context_powerpc.c =================================================================== RCS file: /home/wine/wine/server/context_powerpc.c,v retrieving revision 1.1 diff -u -r1.1 context_powerpc.c --- server/context_powerpc.c 17 Aug 2002 01:19:06 -0000 1.1 +++ server/context_powerpc.c 29 Aug 2002 14:53:30 -0000 @@ -56,18 +56,13 @@ #undef IREG XREG(37,Xer); XREG(38,Cr); - } if (flags & CONTEXT_CONTROL) { + XREG(32,Iar); XREG(33,Msr); XREG(35,Ctr); - - XREG(32,Fill[0]); /* misused for PC / nip */ - - /* what is Iar? Lr? */ - /*XREG(33*4,Iar);*/ - /*XREG(33*4,Lr);*/ + XREG(36,Lr); /* 36 is LNK ... probably Lr ? */ } } if (flags & CONTEXT_FLOATING_POINT) @@ -137,14 +132,10 @@ } if (flags & CONTEXT_CONTROL) { + XREG(32,Iar); XREG(33,Msr); XREG(35,Ctr); - - XREG(32,Fill[0]); /* misused for PC / nip */ - - /* what is Iar? Lr? */ - /*XREG(33*4,Iar);*/ - /*XREG(33*4,Lr);*/ + XREG(36,Lr); } } if (flags & CONTEXT_FLOATING_POINT) @@ -202,7 +193,7 @@ { CREG(Msr); CREG(Ctr); - CREG(Fill[0]); + CREG(Iar); } if (flags & CONTEXT_INTEGER) { @@ -256,13 +247,13 @@ void *get_thread_ip( struct thread *thread ) { CONTEXT context; - context.Fill[0] = 0; + context.Iar = 0; if (suspend_for_ptrace( thread )) { get_thread_context( thread, CONTEXT_CONTROL, &context ); resume_thread( thread ); } - return (void *)context.Fill[0]; + return (void *)context.Iar; } /* determine if we should continue the thread in single-step mode */