Thursday, July 06, 2006

ENTRY(return_from_int)

ENTRY(return_from_int)
/* If someone else already raised IRQ 15, do nothing. */
csync;
p2.l = lo(ILAT);
p2.h = hi(ILAT);
r0 = [p2];
cc = bittst (r0, EVT_IVG15_P);
if cc jump 2f;

/------------------
Check for IRQ 15
-------------------/

/* if not return to user mode, get out */
p2.l = lo(IPEND);
p2.h = hi(IPEND);
r0 = [p2];
r1 = 0x17(Z);
r2 = ~r1;
r2.h = 0;
/--------
r2.h = 0, r2.l =~(0x17)
---------/
r0 = r2 & r0;
r1 = 1;
r1 = r0 - r1;
r2 = r0 & r1;
/------------
Don't care about EMU, RST, NMI, Global Interrupt Disable
-------------/
cc = r2 == 0;
if !cc jump 2f;
/--------------------
If there is Nested interrupt, jump 2f.
---------------------/

/* Lower the interrupt level to 15. */
p0.l = lo(EVT15);
p0.h = hi(EVT15);
p1.l = schedule_and_signal_from_int;
p1.h = schedule_and_signal_from_int;
[p0] = p1;
csync;
r0 = 0x801f (z);
STI r0;
raise 15; /* raise evt15 to do signal or reschedule */
rti;
2:
rts;

No comments:

Blog Archive