The code path to get to this problem is quite short:

TLBENT fill (uint32 va, int32 lnt, int32 acc, int32 *stat)
{
int32 ptidx = (((uint32) va) >> 7) & ~03;
int32 tlbpte, ptead, pte, tbi, vpn;
static TLBENT zero_pte = { 0, 0 };

if (va & VA_S0) { /* system space? */
    if (ptidx >= d_slr) /* system */
        MM_ERR (PR_LNV);
    ptead = (d_sbr + ptidx) & PAMASK;
    }
else {
    if (va & VA_P1) { /* P1? */
        if (ptidx < d_p1lr)
            MM_ERR (PR_LNV);
        ptead = d_p1br + ptidx;
        }
    else {                                              /* P0 */
        if (ptidx >= d_p0lr)
            MM_ERR (PR_LNV);
        ptead = d_p0br + ptidx;
        }
    if ((ptead & VA_S0) == 0)
ABORT (STOP_PPTE); /* ppte must be sys */

ANSI C (and old C) both define right shifts on unsigned integers as doing zero fills from the left. Therefore, ptidx must have seven leading 0's and, by the mask operation, 2 trailing 0's. Note that ptidx passes the length checks, or the abort wouldn't be reached.

At the stop, the console is still active, and it should be possible to dump P0BR and P1BR. Note that the internal form (d_p0br and d_p1br) has been modified from the visible form. So put a breakpoint on the ABORT or a print statement beforehand (the joys of open sauce) to check that the internal values are all right.

    if ((ptead & VA_S0) == 0){
printf ("PTE not SYS abort, ptead = %x, ptidx = %X, d_p0br = %X, d_p1br = %X\r\n", ptead, ptidx, d_p0br, d_p1br); ABORT (STOP_PPTE); /* ppte must be sys */
        }

The cr-lf is needed because the console is still in raw mode at that point.

/Bob

On 2/17/2016 3:22 PM, [email protected] wrote:
Message: 3
Date: Wed, 17 Feb 2016 15:14:04 -0500
From: Paul Koning<[email protected]>
To: Howard Bussey<[email protected]>
Cc: simh mailing list<[email protected]>
Subject: Re: [Simh] Recent build crashes on OSX
Message-ID:<[email protected]>
Content-Type: text/plain; charset=utf-8


>On Feb 17, 2016, at 3:01 PM, Howard Bussey<[email protected]>  wrote:
>
>Googling “Process PTE …” shows this occurred before:
>
>http://mailman.trailing-edge.com/pipermail/simh/2010-May/010760.html
>
>The suggestion was to try turning off optimization when compiling simh…
In that case, gcc is the compiler.  In the case Michael mentioned, it's LLVM.  
So the conclusion is that it's a SimH bug, non-compliant code that gets caught 
by modern optimizing compilers.

Turning on GCC warnings may help; a lot of issues of this kind are reported as warnings 
if you build with -Wall.  I don't see anything interesting when I try that on OSX, but 
that's LLVM.  When I try it on Linux, I get a bunch of possible uninitialized variables 
-- those are sometimes false warnings but worth looking at.  More interesting is a bunch 
of "does break strict-aliasing rules".  Those indicate incorrect (not ANSI 
compliant) code that you used to be able to get away with, but can't any longer when 
optimization is enabled.  The correct way to handle those errors is to fix the code, not 
to disable the warning or the optimization (as is done by some other software teams).

More info can be found 
here:https://homes.cs.washington.edu/~akcheung/papers/apsys12.pdf  -- a very 
good article that all C programmers should read.


_______________________________________________
Simh mailing list
[email protected]
http://mailman.trailing-edge.com/mailman/listinfo/simh

Reply via email to