]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/Library/CpuIA32Lib/IA32/CpuIA32.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / Library / CpuIA32Lib / IA32 / CpuIA32.c
1 /** @file
2
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
4
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7
8
9 Module Name:
10
11
12 CpuIA32.c
13
14 Abstract:
15
16 --*/
17
18 #include <Library/CpuIA32.h>
19
20 VOID
21 EfiHalt (VOID)
22 {
23 __asm {
24 hlt
25 }
26 }
27
28 VOID
29 EfiWbinvd (VOID)
30 {
31 __asm {
32 wbinvd
33 }
34 }
35
36 VOID
37 EfiInvd (VOID)
38 {
39 __asm {
40 invd
41 }
42 }
43
44 VOID
45 EfiCpuid (IN UINT32 RegisterInEax,
46 OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
47 {
48 __asm {
49 pushad
50
51 mov eax, RegisterInEax
52 cpuid
53 cmp Reg, 0
54 je _Exit
55 mov edi, DWORD PTR Reg
56
57 mov DWORD PTR [edi].RegEax, eax ; Reg->RegEax
58 mov DWORD PTR [edi].RegEbx, ebx ; Reg->RegEbx
59 mov DWORD PTR [edi].RegEcx, ecx ; Reg->RegEcx
60 mov DWORD PTR [edi].RegEdx, edx ; Reg->RegEdx
61
62 _Exit:
63 popad
64 }
65 }
66
67 UINT64
68 EfiReadMsr (IN UINT32 Index)
69 {
70 __asm {
71 mov ecx, Index
72 rdmsr
73 }
74 }
75
76 VOID
77 EfiWriteMsr (
78 IN UINT32 Index,
79 IN UINT64 Value
80 )
81 {
82 __asm {
83 mov ecx, Index
84 mov eax, DWORD PTR Value[0]
85 mov edx, DWORD PTR Value[4]
86 wrmsr
87 }
88 }
89
90 UINT64
91 EfiReadTsc (VOID)
92 {
93 __asm {
94 rdtsc
95 }
96 }
97
98 VOID
99 EfiDisableCache (VOID)
100 {
101 __asm {
102 mov eax, cr0
103 bswap eax
104 and al, 60h
105 cmp al, 60h
106 je Exit
107 mov eax, cr0
108 or eax, 060000000h
109 mov cr0, eax
110 wbinvd
111 Exit:
112 }
113 }
114
115 VOID
116 EfiEnableCache (VOID)
117 {
118 __asm {
119 wbinvd
120 mov eax, cr0
121 and eax, 09fffffffh
122 mov cr0, eax
123 }
124 }
125
126 UINT32
127 EfiGetEflags (
128 VOID
129 )
130 {
131 __asm {
132 pushfd
133 pop eax
134 }
135 }
136
137 VOID
138 EfiDisableInterrupts (VOID)
139 {
140 __asm {
141 cli
142 }
143 }
144
145 VOID
146 EfiEnableInterrupts (
147 VOID
148 )
149 {
150 __asm {
151 sti
152 }
153 }
154
155 VOID
156 EfiCpuidExt (
157 IN UINT32 RegisterInEax,
158 IN UINT32 CacheLevel,
159 OUT EFI_CPUID_REGISTER *Regs
160 )
161 {
162 __asm {
163 pushad
164
165 mov eax, RegisterInEax
166 mov ecx, CacheLevel
167 cpuid
168 mov edi, DWORD PTR Regs
169
170 mov DWORD PTR [edi].RegEax, eax ; Reg->RegEax
171 mov DWORD PTR [edi].RegEbx, ebx ; Reg->RegEbx
172 mov DWORD PTR [edi].RegEcx, ecx ; Reg->RegEcx
173 mov DWORD PTR [edi].RegEdx, edx ; Reg->RegEdx
174
175 popad
176 }
177 }