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#*    Cpu.asm
27#*
28#*   Abstract:
29#*
30#------------------------------------------------------------------------------
31##include <EfiBind.h>
32
33.globl ASM_PFX(EfiHalt)
34.globl ASM_PFX(EfiWbinvd)
35.globl ASM_PFX(EfiInvd)
36.globl ASM_PFX(EfiCpuid)
37.globl ASM_PFX(EfiReadTsc)
38.globl ASM_PFX(EfiDisableCache)
39.globl ASM_PFX(EfiEnableCache)
40.globl ASM_PFX(EfiReadMsr)
41.globl ASM_PFX(EfiWriteMsr)
42.globl ASM_PFX(EfiGetEflags)
43.globl ASM_PFX(EfiDisableInterrupts)
44.globl ASM_PFX(EfiEnableInterrupts)
45.globl ASM_PFX(EfiCpuidExt)
46
47.text
48
49
50#------------------------------------------------------------------------------
51#  VOID
52#  EfiHalt (
53#    VOID
54#    )
55#------------------------------------------------------------------------------
56ASM_PFX(EfiHalt):
57    hlt
58    retq
59
60
61#------------------------------------------------------------------------------
62#  VOID
63#  EfiWbinvd (
64#    VOID
65#    )
66#------------------------------------------------------------------------------
67ASM_PFX(EfiWbinvd):
68    wbinvd
69    retq
70
71
72#------------------------------------------------------------------------------
73#  VOID
74#  EfiInvd (
75#    VOID
76#    )
77#------------------------------------------------------------------------------
78ASM_PFX(EfiInvd):
79    invd
80    retq
81
82#------------------------------------------------------------------------------
83#  VOID
84#  EfiCpuid (
85#    IN   UINT32              RegisterInEax,          // rcx
86#    OUT  EFI_CPUID_REGISTER  *Reg           OPTIONAL // rdx
87#    )
88#------------------------------------------------------------------------------
89ASM_PFX(EfiCpuid):
90      push   %rbx
91      mov    %rdx,%r8
92      mov    %rcx,%rax
93      cpuid
94      cmp    $0x0,%r8
95      je     _Exit
96      mov    %eax,(%r8)
97      mov    %ebx,0x4(%r8)
98      mov    %ecx,0x8(%r8)
99      mov    %edx,0xc(%r8)
100_Exit:
101      pop    %rbx
102      retq
103
104#------------------------------------------------------------------------------
105#  UINT64
106#  EfiReadMsr (
107#    IN   UINT32  Index,  // rcx
108#    )
109#------------------------------------------------------------------------------
110ASM_PFX(EfiReadMsr):
111      rdmsr
112      shl    $0x20,%rdx
113      or     %rdx,%rax
114      retq
115
116#------------------------------------------------------------------------------
117#  VOID
118#  EfiWriteMsr (
119#    IN   UINT32  Index,  // rcx
120#    IN   UINT64  Value   // rdx
121#    )
122#------------------------------------------------------------------------------
123ASM_PFX(EfiWriteMsr):
124      mov    %rdx,%rax
125      sar    $0x20,%rdx
126      wrmsr
127      retq
128
129#------------------------------------------------------------------------------
130# UINT64
131# EfiReadTsc (
132#   VOID
133#   );
134#------------------------------------------------------------------------------
135ASM_PFX(EfiReadTsc):
136      rdtsc
137      shl    $0x20,%rax
138      shrd   $0x20,%rdx,%rax
139      retq
140
141#------------------------------------------------------------------------------
142# VOID
143# EfiDisableCache (
144#   VOID
145#   );
146#------------------------------------------------------------------------------
147ASM_PFX(EfiDisableCache):
148# added a check to see if cache is already disabled. If it is, then skip.
149      mov    %cr0,%rax
150      and    $0x60000000,%rax
151      cmp    $0x0,%rax
152      jne    1f
153      mov    %cr0,%rax
154      or     $0x60000000,%rax
155      mov    %rax,%cr0
156      wbinvd
1571:
158      retq
159
160#------------------------------------------------------------------------------
161# VOID
162# EfiEnableCache (
163#   VOID
164#   );
165#------------------------------------------------------------------------------
166ASM_PFX(EfiEnableCache):
167      wbinvd
168      mov    %cr0,%rax
169      and    $0xffffffff9fffffff,%rax
170      mov    %rax,%cr0
171      retq
172
173#------------------------------------------------------------------------------
174# UINTN
175# EfiGetEflags (
176#   VOID
177#   );
178#------------------------------------------------------------------------------
179ASM_PFX(EfiGetEflags):
180      pushfq
181      pop    %rax
182      retq
183
184#------------------------------------------------------------------------------
185# VOID
186# EfiDisableInterrupts (
187#   VOID
188#   );
189#------------------------------------------------------------------------------
190ASM_PFX(EfiDisableInterrupts):
191    cli
192    ret
193
194#------------------------------------------------------------------------------
195# VOID
196# EfiEnableInterrupts (
197#   VOID
198#   );
199#------------------------------------------------------------------------------
200ASM_PFX(EfiEnableInterrupts):
201    sti
202    ret
203#------------------------------------------------------------------------------
204#  VOID
205#  EfiCpuidExt (
206#    IN   UINT32              RegisterInEax,
207#    IN   UINT32              CacheLevel,
208#    OUT  EFI_CPUID_REGISTER  *Regs
209#    )
210#------------------------------------------------------------------------------
211ASM_PFX(EfiCpuidExt):
212      push   %rbx
213      mov    %rcx,%rax
214      mov    %rdx,%rcx
215      cpuid
216      mov    %eax,(%r8)
217      mov    %ebx,0x4(%r8)
218      mov    %ecx,0x8(%r8)
219      mov    %edx,0xc(%r8)
220      pop    %rbx
221      retq
222