]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/Library/CpuIA32Lib/X64/Cpu.S
Vlv2TbltDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Vlv2TbltDevicePkg / Library / CpuIA32Lib / X64 / Cpu.S
CommitLineData
3cbfba02
DW
1#\r
2#\r
3# Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved\r
4# \r\r
9dc8036d
MK
5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7# \r\r
8#\r
9#\r
10#* Module Name:\r
11#*\r
12#* Cpu.asm\r
13#*\r
14#* Abstract:\r
15#*\r
16#------------------------------------------------------------------------------\r
17##include <EfiBind.h>\r
18\r
19.globl ASM_PFX(EfiHalt)\r
20.globl ASM_PFX(EfiWbinvd)\r
21.globl ASM_PFX(EfiInvd)\r
22.globl ASM_PFX(EfiCpuid)\r
23.globl ASM_PFX(EfiReadTsc)\r
24.globl ASM_PFX(EfiDisableCache)\r
25.globl ASM_PFX(EfiEnableCache)\r
26.globl ASM_PFX(EfiReadMsr)\r
27.globl ASM_PFX(EfiWriteMsr)\r
28.globl ASM_PFX(EfiGetEflags)\r
29.globl ASM_PFX(EfiDisableInterrupts)\r
30.globl ASM_PFX(EfiEnableInterrupts)\r
31.globl ASM_PFX(EfiCpuidExt)\r
32\r
33.text\r
34\r
35\r
36#------------------------------------------------------------------------------\r
37# VOID\r
38# EfiHalt (\r
39# VOID\r
40# )\r
41#------------------------------------------------------------------------------\r
42ASM_PFX(EfiHalt):\r
43 hlt\r
44 retq\r
45\r
46\r
47#------------------------------------------------------------------------------\r
48# VOID\r
49# EfiWbinvd (\r
50# VOID\r
51# )\r
52#------------------------------------------------------------------------------\r
53ASM_PFX(EfiWbinvd):\r
54 wbinvd\r
55 retq\r
56\r
57\r
58#------------------------------------------------------------------------------\r
59# VOID\r
60# EfiInvd (\r
61# VOID\r
62# )\r
63#------------------------------------------------------------------------------\r
64ASM_PFX(EfiInvd):\r
65 invd\r
66 retq\r
67\r
68#------------------------------------------------------------------------------\r
69# VOID\r
70# EfiCpuid (\r
71# IN UINT32 RegisterInEax, // rcx\r
72# OUT EFI_CPUID_REGISTER *Reg OPTIONAL // rdx\r
73# )\r
74#------------------------------------------------------------------------------\r
75ASM_PFX(EfiCpuid):\r
76 push %rbx\r
77 mov %rdx,%r8\r
78 mov %rcx,%rax\r
79 cpuid\r
80 cmp $0x0,%r8\r
81 je _Exit\r
82 mov %eax,(%r8)\r
83 mov %ebx,0x4(%r8)\r
84 mov %ecx,0x8(%r8)\r
85 mov %edx,0xc(%r8)\r
86_Exit:\r
87 pop %rbx\r
88 retq\r
89\r
90#------------------------------------------------------------------------------\r
91# UINT64\r
92# EfiReadMsr (\r
93# IN UINT32 Index, // rcx\r
94# )\r
95#------------------------------------------------------------------------------\r
96ASM_PFX(EfiReadMsr):\r
97 rdmsr\r
98 shl $0x20,%rdx\r
99 or %rdx,%rax\r
100 retq\r
101\r
102#------------------------------------------------------------------------------\r
103# VOID\r
104# EfiWriteMsr (\r
105# IN UINT32 Index, // rcx\r
106# IN UINT64 Value // rdx\r
107# )\r
108#------------------------------------------------------------------------------\r
109ASM_PFX(EfiWriteMsr):\r
110 mov %rdx,%rax\r
111 sar $0x20,%rdx\r
112 wrmsr\r
113 retq\r
114\r
115#------------------------------------------------------------------------------\r
116# UINT64\r
117# EfiReadTsc (\r
118# VOID\r
119# );\r
120#------------------------------------------------------------------------------\r
121ASM_PFX(EfiReadTsc):\r
122 rdtsc\r
123 shl $0x20,%rax\r
124 shrd $0x20,%rdx,%rax\r
125 retq\r
126\r
127#------------------------------------------------------------------------------\r
128# VOID\r
129# EfiDisableCache (\r
130# VOID\r
131# );\r
132#------------------------------------------------------------------------------\r
133ASM_PFX(EfiDisableCache):\r
134# added a check to see if cache is already disabled. If it is, then skip.\r
135 mov %cr0,%rax\r
136 and $0x60000000,%rax\r
137 cmp $0x0,%rax\r
138 jne 1f\r
139 mov %cr0,%rax\r
140 or $0x60000000,%rax\r
141 mov %rax,%cr0\r
142 wbinvd\r
1431:\r
144 retq\r
145\r
146#------------------------------------------------------------------------------\r
147# VOID\r
148# EfiEnableCache (\r
149# VOID\r
150# );\r
151#------------------------------------------------------------------------------\r
152ASM_PFX(EfiEnableCache):\r
153 wbinvd\r
154 mov %cr0,%rax\r
155 and $0xffffffff9fffffff,%rax\r
156 mov %rax,%cr0\r
157 retq\r
158\r
159#------------------------------------------------------------------------------\r
160# UINTN\r
161# EfiGetEflags (\r
162# VOID\r
163# );\r
164#------------------------------------------------------------------------------\r
165ASM_PFX(EfiGetEflags):\r
166 pushfq\r
167 pop %rax\r
168 retq\r
169\r
170#------------------------------------------------------------------------------\r
171# VOID\r
172# EfiDisableInterrupts (\r
173# VOID\r
174# );\r
175#------------------------------------------------------------------------------\r
176ASM_PFX(EfiDisableInterrupts):\r
177 cli\r
178 ret\r
179\r
180#------------------------------------------------------------------------------\r
181# VOID\r
182# EfiEnableInterrupts (\r
183# VOID\r
184# );\r
185#------------------------------------------------------------------------------\r
186ASM_PFX(EfiEnableInterrupts):\r
187 sti\r
188 ret\r
189#------------------------------------------------------------------------------\r
190# VOID\r
191# EfiCpuidExt (\r
192# IN UINT32 RegisterInEax,\r
193# IN UINT32 CacheLevel,\r
194# OUT EFI_CPUID_REGISTER *Regs\r
195# )\r
196#------------------------------------------------------------------------------\r
197ASM_PFX(EfiCpuidExt):\r
198 push %rbx\r
199 mov %rcx,%rax\r
200 mov %rdx,%rcx\r
201 cpuid\r
202 mov %eax,(%r8)\r
203 mov %ebx,0x4(%r8)\r
204 mov %ecx,0x8(%r8)\r
205 mov %edx,0xc(%r8)\r
206 pop %rbx\r
207 retq\r