void

expected_software_handling_of_ADE_trap()

{

/* Only %r0-%r7 can be used from here to Point#1 because the register window control registers may not have valid value until Point#1. It is recommended that only %r0-%r7 are used as general-purpose registers (GPR) in the whole single-ADE trap handler, if possible. */

ASI_SCRATCH_REGp %rX;

ASI_SCRATCH_REGq %rY; %rX ASI_UGESR;

if ((%rX && 0x07) 0) {

/* multiple-ADE trap occurrence */

invoke panic routine and take system dump as much as possible with the running environment of ASI_ERROR_CONTROL.WEAK_ED == 1;

}

if (%rX.IUG_%R == 1) {

%r1-%r31 except %rX and %rY %r0; %y %r0;

%tstate.pstate %r0; /* because ccr or asi field in %tstate.pstate contains the error */

}

else {

save required %r1-%r7 to the ADE trap save area, using %rX, %rY, ASI_SCRATCH_REGp and ASI_SCRATCH_REGq;

/* whole %r save and restore is required to retry the context with PSTATE.AG == 1 */

}

if (ASI_UGESR.IUG_PSTATE == 1) { %tstate.pstate %r0;

%tpc %r0; %pil %r0; %wstate %r0;

All general-purpose registers in the register window %r0; Set the register window control registers

(CWP, CANSAVE, CANRESTORE, OTHERWIN, CLEANWIN) to appropriate values;

}

/* Point#1: Program can use the general-purpose registers except %r0-%r7 after this because the register window control registers were validated in the above step. */

if ((ASI_UGESR.IAUG_CRE == 1) ( ASI_UGESR.IAUG_TSBCTXT == 1) (ASI_UGESR.IUG_TSBP == 1) (ASI_UGESR.IUG_TSTATE == 1) (ASI_UGESR.IUG_%F==1)) {

Write to each register with an error indication, to erase as many register errors as possible;

}

if (ASI_UGESR.IUG_DTLB == 1) { execute demap_all for DTLB;

/* A locked fDTLB entry with uncorrectable error is not removed by this operation. A locked fDTLB entry with UE never detects its tag match or

172 SPARC JPS1 Implementation Supplement: Fujitsu SPARC64 V • Release 1.0, 1 July 2002

Page 183
Image 183
Fujitsu Fujitsu SPARC64 V manual Void ExpectedsoftwarehandlingofADEtrap