From: buhr@umanitoba.ca (Kevin Andrew Buhr)
Subject: Help needed understanding OS/2 register dumps
Organization: University of Manitoba, Canada
Date: Fri, 21 Aug 1992 21:43:28 GMT

Sorry to sound Newbie-esque, but I'm a little confused by the OS/2
register dumps displayed for SYS3172 (A program caused exception ...)
and SYS3175 (A program generated an access violation at ...) system
errors.

We often get errors like this when using Lotus 1-2-3, Wordperfect for
Windows, and Procomm Plus for Windows.  The errors vary slightly, but
they all occur at the same EIP (though the CS is sometimes slightly
different, like 217 instead of 277, suggesting perhaps that the error
is occurring at various points during program initialization or maybe just
that OS/2 is supplying slightly different selectors for whatever
reason).

The errors are usually access violations, but witness the following:

	SYS3172
	A program caused exception c0000005 at 0000f426
	The system could not dispatch the exception.  The program was
	terminated without running exception handlers.
	P1=00000008 P2=00000434 P3=XXXXXXXX P4=XXXXXXXX
	EAX=469f154f EBX=00000000 ECX=00000000 EDX=00000004
	ESI=00000256 EDI=0000a1a0
	DS=154f DSACC=00f3 DSLIM=0000d60f
	ES=010f ESACC=00f3 ESLIM=0000d61f
	FS=bf4e FSACC=00f3 FSLIM=00002ec9
	GS=bf56 GSACC=00f3 GSLIM=00001ed7
	CS:EIP=0277:00005176 CSACC=00fb CSLIM=00007faf
	SS:ESP=0436:00004e48 SSACC=00f3 SSLIM=0000064f
	EBP=00000000 FLG=00000636

Now, when OS/2 crashes really hard, it tells me I have an 048600b4,
which probably means the B4 stepping, if that makes any difference.
The box is a PS/2 Model 90 486.

Anyway, here's what bothers me about this register dump:

	1.  What the heck is exception c0000005?  How does one go
	    about generating an exception c0000005 even if one *wants*
	    to?  In my sheltered experience, exceptions are numbered
	    by referring to the vector they are normally dispatched
	    to.  For example, the BOUND exception would be referred to
	    as exception 5.  No wonder OS/2 can't dispatch exception
	    c00000005:  with that many vectors, it would have no room
	    for programs.  ;-)

	    Is this some clever way of combining an error code *and*
	    exception number in the same number?  If so, I can't
	    decode it.  Is the top word normally ignored, suggesting
	    that a BOUND exception occurred?  How could this possibly
	    make any sense?  As I've said, I normally get "access
	    violations" at this address.  Why would a BOUND
	    instruction cause these?

	2.  What are P1, P2, P3, and P4?  Neither P1 nor P2 is CR0,
	    because they don't have bit 0 set.  Are they some subset
	    of the control register bits?  Are they coprocessor control
	    registers?  Are they test registers?  Are they exception
	    error codes?  I can't interpret them as any of these.

	3.  The exception occured "at 0000f426", apparently.  Is this
	    a physical address?  Is this a logical address?

	4.  I originally assumed that FLG=00000636 referred to the
	    extended flags register.  If so, why isn't bit 5 zero?  In
	    another similar error, I've been told that FLG=00000634.
	    Why isn't bit 1 one?  I thought these bits had these
	    values at all times in all 80x86 implementations.

What's going on here?  Am I way off base?  Is the entire dump encoded
so only OS/2 system programmers will know what *really* happened?  Is
my CPU sick?  Is my memory sick?  Is my swapfile sick?  Is this a
serious OS/2 exception handling bug?  And on, and on...

FYI, I have the new kernel running (6.142 or 6.412--can't remember
which) with the new OS2LDR for >16MB even though I only have 8 Megs.
I get the PMV2001's all the time, unless I make the SWAPFILE really
big.  Still, I got these errors periodically without any of these
fixes applied.  Though, maybe they made more sense back then:  I never
checked the value of FLG or P1 when I first started getting them.

Long winded replies and RTFM's and RTFAQ's are welcome--just tell me
which FM and FAQ apply in the latter two cases.

Kevin Buhr <buhr@ccu.UManitoba.CA>