summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halgamma/alpha/gmintr.s
blob: 7271876606572f7a79bc2edf659bf128acb32fc2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//      TITLE("Clock and Eisa Interrupt Handlers")
//++
//
// Copyright (c) 1993  Digital Equipment Corporation
//
// Module Name:
//
//    gmintr.s
//
// Abstract:
//
//    This module implements first level interrupt handlers for the
//    Gamma system.
//
// Author:
//
//    Joe Notarangelo  29-Oct-1993
//    Steve Jenness    29-Oct-1993
//
// Environment:
//
//    Kernel mode only.
//
// Revision History:
//
//--

#include "halalpha.h"

        SBTTL("Interprocessor Interrupt")
//++
//
// VOID
// HalpGammaIpiInterrupt
//    )
//
// Routine Description:
//
//   This function is executed as the result of an interprocessor
//   interrupt asserted on the current processor.  This function is
//   responsible for acknowledging the interrupt and dispatching to
//   the kernel for processing.
//
// Arguments:
//
//    TrapFrame (fp/s6) - Supplies a pointer to the trap frame for
//                            the interrupt.
//
// Return Value:
//
//    None.
//
//--

        LEAF_ENTRY(HalpGammaIpiInterrupt)

//
// Acknowledge the IPI interrupt by clearing the RequestInterrupt bit
// of the IPIR register for the current processor.
//
// N.B. - Clearing the RequestInterrupt bit of the IPIR is accomplished
//        by writing a zero to the register.  This eliminates the need
//        to perform a read-modify-write operation but loses the state
//        of the RequestNodeHaltInterrupt bit.  Currently, this is fine
//        because the RequestNodeHalt feature is not used.  Were it to
//        be used in the future, then this short-cut would have to be
//        reconsidered.
//
// N.B. - The code to write a sable CPU register is inlined here for
//        performance.
//
// N.B. - The PcHalIpirSva value must reflect the location of the Ipir
//        pointer in the GAMMA_PCR structure, defined in gamma.h
//

//jnfix - define elsewhere
#define PcHalIpirSva 0x08
#define SicrIpiClear 0x1000000000000        // bit to write to clear IPI int

        call_pal rdpcr                  // v0 = pcr base address

        ldiq    t0, SicrIpiClear                    // get clear bit
        ldq     v0, PcHalReserved + PcHalIpirSva(v0) // get per-processor
                                                     // CPU IPIR SVA
        stq     t0, (v0)              // clear IPIR
        mb                              // synchronize the write

//
// Call the kernel to processor the interprocessor request.
//
        ldl     t0, __imp_KeIpiInterrupt
        jmp     zero, (t0)              // call kernel to process

//
// Control is returned from KeIpiInterrupt to the caller.
//

        .end    HalpGammaIpiInterrupt