summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm
blob: 38d3c49744ee4038c5a4079e06e4bd9d1862c104 (plain)
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
;/*++
;
;Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
;This program and the accompanying materials                          
;are licensed and made available under the terms and conditions of the BSD License         
;which accompanies this distribution.  The full text of the license may be found at        
;http://opensource.org/licenses/bsd-license.php                                            
;                                                                                          
;THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
;WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
;
;Module Name:
;
;  CpuIA32.c
;
;Abstract:
;
;--*/

;#include "CpuIA32.h"

;---------------------------------------------------------------------------
    .586p
    .model  flat,C
    .code

;---------------------------------------------------------------------------
;VOID
;EfiHalt (
;  VOID
;)
EfiHalt PROC C PUBLIC
    hlt
    ret
EfiHalt ENDP    

;VOID
;EfiWbinvd (
;  VOID
;)
EfiWbinvd PROC C PUBLIC
    wbinvd
    ret
EfiWbinvd ENDP

;VOID
;EfiInvd (
; VOID
;)
EfiInvd PROC C PUBLIC
    invd
    ret
EfiInvd ENDP

;VOID
;EfiCpuid (IN UINT32 RegisterInEax,
;          OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
EfiCpuid PROC C PUBLIC
    push ebp
    mov  ebp, esp
    push ebx
    push esi
    push edi
    pushad

    mov    eax, dword ptr[ebp + 8] ;egisterInEax
    cpuid
    cmp    dword ptr[ebp + 0Ch], 0 ; Reg
    je     @F
    mov         edi,dword ptr [ebp+0Ch] ; Reg 

    mov         dword ptr [edi],eax ; Reg->RegEax
    mov         dword ptr [edi+4],ebx ; Reg->RegEbx
    mov         dword ptr [edi+8],ecx ; Reg->RegEcx
    mov         dword ptr [edi+0Ch],edx ; Reg->RegEdx

@@:
    popad
    pop         edi
    pop         esi
    pop         ebx
    pop         ebp
    
    ret
EfiCpuid ENDP


;UINT64
;EfiReadMsr (
;  IN UINT32 Index
;  );
EfiReadMsr PROC C PUBLIC
    mov    ecx, dword ptr [esp + 4]; Index
    rdmsr
    ret
EfiReadMsr ENDP

;VOID
;EfiWriteMsr (
;  IN   UINT32  Index,
;  IN   UINT64  Value
;  );
EfiWriteMsr PROC C PUBLIC
    mov    ecx, dword ptr [esp+4]; Index
    mov    eax, dword ptr [esp+8]; DWORD PTR Value[0]
    mov    edx, dword ptr [esp+0Ch]; DWORD PTR Value[4]
    wrmsr            
    ret
EfiWriteMsr  ENDP

;UINT64
;EfiReadTsc (
;  VOID
;  )
EfiReadTsc PROC C PUBLIC
    rdtsc
    ret
EfiReadTsc  ENDP

;VOID
;EfiDisableCache (
;  VOID
;)
EfiDisableCache PROC C PUBLIC
    mov   eax, cr0
    bswap eax
    and   al, 60h
    cmp   al, 60h
    je    @F
    mov   eax, cr0
    or    eax, 060000000h     
    mov   cr0, eax
    wbinvd
@@:
    ret
EfiDisableCache  ENDP

;VOID
;EfiEnableCache (
;  VOID
;  )
EfiEnableCache PROC C PUBLIC
    invd
    mov   eax, cr0
    and   eax, 09fffffffh         
    mov   cr0, eax
    ret
EfiEnableCache  ENDP

;UINT32
;EfiGetEflags (
;  VOID
;  )
EfiGetEflags PROC C PUBLIC
    pushfd
    pop  eax
    ret
EfiGetEflags  ENDP

;VOID
;EfiDisableInterrupts (
;  VOID
;  )
EfiDisableInterrupts PROC C PUBLIC
    cli
    ret
EfiDisableInterrupts  ENDP

;VOID
;EfiEnableInterrupts (
;  VOID
;  )
EfiEnableInterrupts  PROC C PUBLIC
    sti
    ret
EfiEnableInterrupts   ENDP

;VOID
;EfiCpuidExt (
;  IN   UINT32              RegisterInEax,
;  IN   UINT32              CacheLevel,
;  OUT  EFI_CPUID_REGISTER  *Regs              
;  )
EfiCpuidExt PROC C PUBLIC USES ebx edi esi
    pushad

    mov    eax, dword ptr [esp + 30h] ; RegisterInEax
    mov    ecx, dword ptr [esp + 34h] ; CacheLevel
    cpuid
    mov    edi, dword ptr [esp + 38h] ; DWORD PTR Regs 

    mov    dword ptr [edi], eax   	; Reg->RegEax
    mov    dword ptr [edi + 4], ebx   	; Reg->RegEbx
    mov    dword ptr [edi + 8], ecx   	; Reg->RegEcx
    mov    dword ptr [edi + 0Ch], edx   ; Reg->RegEdx

    popad
    ret
EfiCpuidExt  ENDP

	END