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
|
;
; This file contains a 'Sample Driver' and is licensed as such
; under the terms of your license agreement with Intel or your
; vendor. This file may be modified by the user, subject to
; the additional terms of the license agreement
;
;------------------------------------------------------------------------------
;
; Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved
; This software and associated documentation (if any) is furnished
; under a license and may only be used or copied in accordance
; with the terms of the license. Except as permitted by such
; license, no part of this software or documentation may be
; reproduced, stored in a retrieval system, or transmitted in any
; form or by any means without the express written consent of
; Intel Corporation.
;
;
; Module Name:
;
; CpuAsm.asm
;
; Abstract:
;
; This is the code that supports IA32 CPU architectural protocol
;
;------------------------------------------------------------------------------
include MpEqu.inc
.686p
.model flat
.code
PAUSE32 MACRO
DB 0F3h
DB 090h
ENDM
EnableMce proc near C public
mov eax, cr4
or eax, 40h
mov cr4, eax
ret
EnableMce endp
MpMtrrSynchUpEntry PROC NEAR C PUBLIC
;
; Enter no fill cache mode, CD=1(Bit30), NW=0 (Bit29)
;
mov eax, cr0
and eax, 0DFFFFFFFh
or eax, 040000000h
mov cr0, eax
;
; Flush cache
;
wbinvd
;
; Clear PGE flag Bit 7
;
mov eax, cr4
mov edx, eax
and eax, 0FFFFFF7Fh
mov cr4, eax
;
; Flush all TLBs
;
mov eax, cr3
mov cr3, eax
mov eax, edx
ret
MpMtrrSynchUpEntry ENDP
MpMtrrSynchUpExit PROC NEAR C PUBLIC
push ebp ; C prolog
mov ebp, esp
;
; Flush all TLBs the second time
;
mov eax, cr3
mov cr3, eax
;
; Enable Normal Mode caching CD=NW=0, CD(Bit30), NW(Bit29)
;
mov eax, cr0
and eax, 09FFFFFFFh
mov cr0, eax
;
; Set PGE Flag in CR4 if set
;
mov eax, dword ptr [ebp + 8]
mov cr4, eax
pop ebp
ret
MpMtrrSynchUpExit ENDP
;-------------------------------------------------------------------------------
; AsmAcquireMPLock (&Lock);
;-------------------------------------------------------------------------------
AsmAcquireMPLock PROC near C PUBLIC
pushad
mov ebp,esp
mov al, NotVacantFlag
mov ebx, dword ptr [ebp+24h]
TryGetLock:
lock xchg al, byte ptr [ebx]
cmp al, VacantFlag
jz LockObtained
PAUSE32
jmp TryGetLock
LockObtained:
popad
ret
AsmAcquireMPLock ENDP
;-------------------------------------------------------------------------------
; AsmReleaseMPLock (&Lock);
;-------------------------------------------------------------------------------------
AsmReleaseMPLock PROC near C PUBLIC
pushad
mov ebp,esp
mov al, VacantFlag
mov ebx, dword ptr [ebp+24h]
lock xchg al, byte ptr [ebx]
popad
ret
AsmReleaseMPLock ENDP
END
|