• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
2#
3# Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
4#
5
6# This program and the accompanying materials are licensed and made available under
7
8# the terms and conditions of the BSD License that accompanies this distribution.
9
10# The full text of the license may be found at
11
12# http://opensource.org/licenses/bsd-license.php.
13
14#
15
16# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17
18# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19
20#
21
22#
23#
24#Module Name:
25#
26#  CpuIA32.c
27#
28#Abstract:
29#
30#--*/
31
32##include "CpuIA32.h"
33#include "EfiBind.h"
34
35#---------------------------------------------------------------------------
36    .586p:
37    #.MODEL flat,C
38    .code:
39
40#---------------------------------------------------------------------------
41
42.globl ASM_PFX(EfiHalt)
43.globl ASM_PFX(EfiWbinvd)
44.globl ASM_PFX(EfiInvd)
45.globl ASM_PFX(EfiCpuid)
46.globl ASM_PFX(EfiReadMsr)
47.globl ASM_PFX(EfiWriteMsr)
48.globl ASM_PFX(EfiReadTsc)
49.globl ASM_PFX(EfiDisableCache)
50.globl ASM_PFX(EfiEnableCache)
51.globl ASM_PFX(EfiGetEflags)
52.globl ASM_PFX(EfiDisableInterrupts)
53.globl ASM_PFX(EfiEnableInterrupts)
54.globl ASM_PFX(EfiCpuidExt)
55
56
57#VOID
58#EfiHalt (
59#  VOID
60#)
61ASM_PFX(EfiHalt):
62    hlt
63    ret
64#EfiHalt ENDP
65
66#VOID
67#EfiWbinvd (
68#  VOID
69#)
70ASM_PFX(EfiWbinvd):
71    wbinvd
72    ret
73#EfiWbinvd ENDP
74
75#VOID
76#EfiInvd (
77# VOID
78#)
79ASM_PFX(EfiInvd):
80    invd
81    ret
82#EfiInvd ENDP
83
84#VOID
85#EfiCpuid (IN UINT32 RegisterInEax,
86#          OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
87ASM_PFX(EfiCpuid):
88    pushl %ebp
89    movl %esp, %ebp
90    pushl %ebx
91    pushl %esi
92    pushl %edi
93    pushal
94
95    movl   8(%ebp), %eax           #RegisterInEax
96    cpuid
97    cmpl   $0, 0xC(%ebp)           # Reg
98    je     L1
99    movl        0xC(%ebp), %edi         # Reg
100
101    movl        %eax, (%edi)        # Reg->RegEax
102    movl        %ebx, 4(%edi)         # Reg->RegEbx
103    movl        %ecx, 8(%edi)         # Reg->RegEcx
104    movl        %edx, 0xC(%edi)         # Reg->RegEdx
105
106L1:
107    popal
108    popl        %edi
109    popl        %esi
110    popl        %ebx
111    popl        %ebp
112
113    ret
114#EfiCpuid ENDP
115
116
117#UINT64
118#EfiReadMsr (
119#  IN UINT32 Index
120#  );
121ASM_PFX(EfiReadMsr):
122    movl   4(%esp), %ecx           # Index
123    rdmsr
124    ret
125#EfiReadMsr ENDP
126
127#VOID
128#EfiWriteMsr (
129#  IN   UINT32  Index,
130#  IN   UINT64  Value
131#  );
132ASM_PFX(EfiWriteMsr):
133    movl   4(%esp), %ecx         # Index
134    movl   8(%esp), %eax         # DWORD PTR Value[0]
135    movl   0xC(%esp), %edx         # DWORD PTR Value[4]
136    wrmsr
137    ret
138#EfiWriteMsr ENDP
139
140#UINT64
141#EfiReadTsc (
142#  VOID
143#  )
144ASM_PFX(EfiReadTsc):
145    rdtsc
146    ret
147#EfiReadTsc ENDP
148
149#VOID
150#EfiDisableCache (
151#  VOID
152#)
153ASM_PFX(EfiDisableCache):
154    movl  %cr0, %eax
155    bswapl %eax
156    andb  $0x60, %al
157    cmpb  $0x60, %al
158    je    L2
159    movl  %cr0, %eax
160    orl   $0x60000000, %eax
161    movl  %eax, %cr0
162    wbinvd
163L2:
164    ret
165#EfiDisableCache ENDP
166
167#VOID
168#EfiEnableCache (
169#  VOID
170#  )
171ASM_PFX(EfiEnableCache):
172    wbinvd
173    movl  %cr0, %eax
174    andl  $0x9fffffff, %eax
175    movl  %eax, %cr0
176    ret
177#EfiEnableCache ENDP
178
179#UINT32
180#EfiGetEflags (
181#  VOID
182#  )
183ASM_PFX(EfiGetEflags):
184    pushfl
185    popl %eax
186    ret
187#EfiGetEflags ENDP
188
189#VOID
190#EfiDisableInterrupts (
191#  VOID
192#  )
193ASM_PFX(EfiDisableInterrupts):
194    cli
195    ret
196#EfiDisableInterrupts ENDP
197
198#VOID
199#EfiEnableInterrupts (
200#  VOID
201#  )
202ASM_PFX(EfiEnableInterrupts):
203    sti
204    ret
205#EfiEnableInterrupts ENDP
206
207#VOID
208#EfiCpuidExt (
209#  IN   UINT32              RegisterInEax,
210#  IN   UINT32              CacheLevel,
211#  OUT  EFI_CPUID_REGISTER  *Regs
212#  )
213ASM_PFX(EfiCpuidExt):
214    push   %ebx
215    push   %edi
216    push   %esi
217    pushal
218
219    movl   0x30(%esp), %eax           # RegisterInEax
220    movl   0x34(%esp), %ecx           # CacheLevel
221    cpuid
222    movl   0x38(%esp), %edi           # DWORD PTR Regs
223
224    movl   %eax, (%edi)                 # Reg->RegEax
225    movl   %ebx, 4(%edi)                # Reg->RegEbx
226    movl   %ecx, 8(%edi)                # Reg->RegEcx
227    movl   %edx, 0xC(%edi)              # Reg->RegEdx
228
229    popal
230    pop    %esi
231    pop    %edi
232    pop    %ebx
233    ret
234#EfiCpuidExt ENDP
235
236
237
238