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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
title "Interprocessor Interrupt"
;++
;
;Copyright (c) 1991 Microsoft Corporation
;
;Module Name:
;
; ixipi.asm
;
;Abstract:
;
; Provides the HAL support for Interprocessor Interrupts.
; This is the UP version.
;
;Author:
;
; John Vert (jvert) 16-Jul-1991
;
;Revision History:
;
;--
.386p
.xlist
include hal386.inc
include callconv.inc ; calling convention macros
include i386\kimacro.inc
include i386\ix8259.inc
EXTRNP _KiCoprocessorError,0,IMPORT
EXTRNP Kei386EoiHelper,0,IMPORT
EXTRNP _HalBeginSystemInterrupt,3
EXTRNP _HalEndSystemInterrupt,2
extrn _HalpDefaultInterruptAffinity:DWORD
extrn _HalpActiveProcessors:DWORD
page ,132
subttl "Post InterProcessor Interrupt"
INIT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; VOID
; HalInitializeProcessor(
; ULONG Number
; );
;
;Routine Description:
;
; Initialize hal pcr values for current processor (if any)
; (called shortly after processor reaches kernel, before
; HalInitSystem if P0)
;
; IPI's and KeReadir/LowerIrq's must be available once this function
; returns. (IPI's are only used once two or more processors are
; available)
;
;Arguments:
;
; Number - Logical processor number of calling processor
;
;Return Value:
;
; None.
;
;--
cPublicProc _HalInitializeProcessor ,1
;
; Initialize PcIDR in PCR to enable slave IRQ
;
mov fs:PcIDR, 0fffffffbh
mov dword ptr fs:PcStallScaleFactor, INITIAL_STALL_COUNT
mov eax, dword ptr [esp+4]
lock bts _HalpDefaultInterruptAffinity, eax
lock bts _HalpActiveProcessors, eax
stdRET _HalInitializeProcessor
stdENDP _HalInitializeProcessor
INIT ends
_TEXT$03 SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; VOID
; HalRequestIpi(
; IN ULONG Mask
; );
;
;Routine Description:
;
; Requests an interprocessor interrupt
;
;Arguments:
;
; Mask - Supplies a mask of the processors to interrupt
;
;Return Value:
;
; None.
;
;--
cPublicProc _HalRequestIpi ,1
if DBG
int 3
endif
stdRET _HalRequestIpi
stdENDP _HalRequestIpi
page ,132
subttl "80387 Irq13 Interrupt Handler"
;++
;
; VOID
; HalpIrq13Handler (
; );
;
; Routine Description:
;
; When the 80387 detects an error, it raises its error line. This
; was supposed to be routed directly to the 386 to cause a trap 16
; (which would actually occur when the 386 encountered the next FP
; instruction).
;
; However, the ISA design routes the error line to IRQ13 on the
; slave 8259. So an interrupt will be generated whenever the 387
; discovers an error.
;
; This routine handles that interrupt and passes control to the kernel
; coprocessor error handler.
;
; Arguments:
;
; None.
; Interrupt is disabled.
;
; Return Value:
;
; None.
;
;--
ENTER_DR_ASSIST Hi13_a, Hi13_t
cPublicProc _HalpIrq13Handler ,0
;
; Save machine state in trap frame
;
ENTER_INTERRUPT Hi13_a, Hi13_t ; (ebp) -> Trap frame
;
; Save previous IRQL
;
push 13 + PRIMARY_VECTOR_BASE ; Vector
sub esp, 4 ; make space for OldIrql
stdCall _HalBeginSystemInterrupt, <I386_80387_IRQL,13 + PRIMARY_VECTOR_BASE,esp>
stdCall _KiCoprocessorError ; call CoprocessorError handler
;
; Clear the busy latch so that the 386 doesn't mistakenly think
; that the 387 is still busy.
;
xor al,al
out I386_80387_BUSY_PORT, al
INTERRUPT_EXIT ; will return to caller
stdENDP _HalpIrq13Handler
_TEXT$03 ENDS
END
|