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:
parent
66dba79418
commit
5e556cc70a
7 changed files with 13 additions and 5 deletions
|
@ -477,6 +477,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
{
|
{
|
||||||
int32 p2, acc;
|
int32 p2, acc;
|
||||||
|
|
||||||
|
if (in_ie) /* in exc? panic */
|
||||||
|
ABORT (STOP_INIE);
|
||||||
p2 = mchk_va + 4; /* save vap */
|
p2 = mchk_va + 4; /* save vap */
|
||||||
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take exception */
|
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take exception */
|
||||||
acc = ACC_MASK (KERN); /* in kernel mode */
|
acc = ACC_MASK (KERN); /* in kernel mode */
|
||||||
|
|
|
@ -437,6 +437,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
{
|
{
|
||||||
int32 acc, nxm;
|
int32 acc, nxm;
|
||||||
|
|
||||||
|
if (in_ie) /* in exc? panic */
|
||||||
|
ABORT (STOP_INIE);
|
||||||
nxm = ((p1 == MCHK_NXM) || (p1 == MCHK_IIA) || (p1 == MCHK_IUA));
|
nxm = ((p1 == MCHK_NXM) || (p1 == MCHK_IIA) || (p1 == MCHK_IUA));
|
||||||
if (nxm)
|
if (nxm)
|
||||||
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */
|
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */
|
||||||
|
|
|
@ -516,6 +516,9 @@ return;
|
||||||
int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
{
|
{
|
||||||
int32 acc;
|
int32 acc;
|
||||||
|
|
||||||
|
if (in_ie) /* in exc? panic */
|
||||||
|
ABORT (STOP_INIE);
|
||||||
if (p1 == MCHK_BPE) /* bus error? */
|
if (p1 == MCHK_BPE) /* bus error? */
|
||||||
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */
|
cc = intexc (SCB_MCHK, cc, 0, IE_EXC); /* take normal exception */
|
||||||
else
|
else
|
||||||
|
|
|
@ -585,6 +585,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
{
|
{
|
||||||
int32 acc, err;
|
int32 acc, err;
|
||||||
|
|
||||||
|
if (in_ie) /* in exc? panic */
|
||||||
|
ABORT (STOP_INIE);
|
||||||
err = (GET_TRAP (trpirq) << 4) | (pme << 3) | ASTLVL; /* error word */
|
err = (GET_TRAP (trpirq) << 4) | (pme << 3) | ASTLVL; /* error word */
|
||||||
cc = intexc (SCB_MCHK, cc, 0, IE_SVE); /* take exception */
|
cc = intexc (SCB_MCHK, cc, 0, IE_SVE); /* take exception */
|
||||||
acc = ACC_MASK (KERN); /* in kernel mode */
|
acc = ACC_MASK (KERN); /* in kernel mode */
|
||||||
|
|
|
@ -633,6 +633,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
int32 acc;
|
int32 acc;
|
||||||
int32 mstat1, mstat2, mear, ebcs, merg, ehmsts;
|
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 */
|
mstat1 = (MSTAT1_CPRD << MSTAT1_V_CYC); /* MBOX Status 1 */
|
||||||
mstat2 = MSTAT2_NXM; /* MBOX Status 2 */
|
mstat2 = MSTAT2_NXM; /* MBOX Status 2 */
|
||||||
mear = mchk_va; /* Memory error address */
|
mear = mchk_va; /* Memory error address */
|
||||||
|
|
|
@ -640,11 +640,6 @@ else if (abortval < 0) { /* mm or rsrv or int */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCB_MCHK: /* machine check */
|
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 */
|
cc = machine_check (p1, opc, cc, delta); /* system specific */
|
||||||
in_ie = 0;
|
in_ie = 0;
|
||||||
GET_CUR; /* PSL<cur> changed */
|
GET_CUR; /* PSL<cur> changed */
|
||||||
|
|
|
@ -1643,6 +1643,8 @@ int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||||
{
|
{
|
||||||
int32 i, st1, st2, p2, hsir, acc;
|
int32 i, st1, st2, p2, hsir, acc;
|
||||||
|
|
||||||
|
if (in_ie) /* in exc? panic */
|
||||||
|
ABORT (STOP_INIE);
|
||||||
if (p1 & 0x80) /* mref? set v/p */
|
if (p1 & 0x80) /* mref? set v/p */
|
||||||
p1 = p1 + mchk_ref;
|
p1 = p1 + mchk_ref;
|
||||||
p2 = mchk_va + 4; /* save vap */
|
p2 = mchk_va + 4; /* save vap */
|
||||||
|
|
Loading…
Add table
Reference in a new issue