ALL VAX: Fix vax_cpu to be model invariant and implement platform specific machine behavior in model specific machine_check routine. As per Bob Supnik. Fix #198

This commit is contained in:
Mark Pizzolato 2015-03-30 10:27:02 -07:00
parent 66dba79418
commit 5e556cc70a
7 changed files with 13 additions and 5 deletions

View file

@ -477,6 +477,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
{
int32 p2, acc;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
p2 = mchk_va + 4; /* save vap */
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take exception */
acc = ACC_MASK (KERN); /* in kernel mode */

View file

@ -437,6 +437,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
{
int32 acc, nxm;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
nxm = ((p1 == MCHK_NXM) || (p1 == MCHK_IIA) || (p1 == MCHK_IUA));
if (nxm)
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */

View file

@ -516,6 +516,9 @@ return;
int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
{
int32 acc;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
if (p1 == MCHK_BPE) /* bus error? */
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */
else

View file

@ -585,6 +585,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
{
int32 acc, err;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
err = (GET_TRAP (trpirq) << 4) | (pme << 3) | ASTLVL; /* error word */
cc = intexc (SCB_MCHK, cc, 0, IE_SVE); /* take exception */
acc = ACC_MASK (KERN); /* in kernel mode */

View file

@ -633,6 +633,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
int32 acc;
int32 mstat1, mstat2, mear, ebcs, merg, ehmsts;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
mstat1 = (MSTAT1_CPRD << MSTAT1_V_CYC); /* MBOX Status 1 */
mstat2 = MSTAT2_NXM; /* MBOX Status 2 */
mear = mchk_va; /* Memory error address */

View file

@ -640,11 +640,6 @@ else if (abortval < 0) { /* mm or rsrv or int */
break;
case SCB_MCHK: /* machine check */
/* The ka630 and ka620 CPU ROMs use double machine checks to size memory */
#if !defined(VAX_620) && !defined(VAX_630)
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
#endif
cc = machine_check (p1, opc, cc, delta); /* system specific */
in_ie = 0;
GET_CUR; /* PSL<cur> changed */

View file

@ -1643,6 +1643,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
{
int32 i, st1, st2, p2, hsir, acc;
if (in_ie) /* in exc? panic */
ABORT (STOP_INIE);
if (p1 & 0x80) /* mref? set v/p */
p1 = p1 + mchk_ref;
p2 = mchk_va + 4; /* save vap */