1
2TITLE   Cpu.asm: Assembly code for the x64 resources
3
4;
5; This file contains an 'Intel Sample Driver' and is
6; licensed for Intel CPUs and chipsets under the terms of your
7; license agreement with Intel or your vendor.  This file may
8; be modified by the user, subject to additional terms of the
9; license agreement
10;
11;
12; Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
13;
14
15; This program and the accompanying materials are licensed and made available under
16
17; the terms and conditions of the BSD License that accompanies this distribution.
18
19; The full text of the license may be found at
20
21; http://opensource.org/licenses/bsd-license.php.
22
23;
24
25; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
26
27; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
28
29;
30
31;
32;
33;
34;
35;*   Module Name:
36;*
37;*    Cpu.asm
38;*
39;*   Abstract:
40;*
41;------------------------------------------------------------------------------
42
43text    SEGMENT
44
45
46;------------------------------------------------------------------------------
47;  VOID
48;  EfiHalt (
49;    VOID
50;    )
51;------------------------------------------------------------------------------
52EfiHalt PROC    PUBLIC
53    hlt
54    ret
55EfiHalt ENDP
56
57
58;------------------------------------------------------------------------------
59;  VOID
60;  EfiWbinvd (
61;    VOID
62;    )
63;------------------------------------------------------------------------------
64EfiWbinvd PROC    PUBLIC
65    wbinvd
66    ret
67EfiWbinvd ENDP
68
69
70;------------------------------------------------------------------------------
71;  VOID
72;  EfiInvd (
73;    VOID
74;    )
75;------------------------------------------------------------------------------
76EfiInvd PROC    PUBLIC
77    invd
78    ret
79EfiInvd ENDP
80
81;------------------------------------------------------------------------------
82;  VOID
83;  EfiCpuid (
84;    IN   UINT32              RegisterInEax,          // rcx
85;    OUT  EFI_CPUID_REGISTER  *Reg           OPTIONAL // rdx
86;    )
87;------------------------------------------------------------------------------
88EfiCpuid PROC   PUBLIC
89    push  rbx
90
91    mov   r8,   rdx         ; r8 = *Reg
92    mov   rax,  rcx         ; RegisterInEax
93    cpuid
94    cmp   r8,   0
95    je    _Exit
96    mov   [r8 +  0], eax    ; Reg->RegEax
97    mov   [r8 +  4], ebx    ; Reg->RegEbx
98    mov   [r8 +  8], ecx    ; Reg->RegEcx
99    mov   [r8 + 12], edx    ; Reg->RegEdx
100
101_Exit:
102    pop   rbx
103    ret
104EfiCpuid  ENDP
105
106;------------------------------------------------------------------------------
107;  UINT64
108;  EfiReadMsr (
109;    IN   UINT32  Index,  // rcx
110;    )
111;------------------------------------------------------------------------------
112EfiReadMsr PROC  PUBLIC
113    rdmsr
114    sal     rdx, 32   ; edx:eax -> rax
115    or      rax, rdx  ; rax = edx:eax
116    ret
117EfiReadMsr  ENDP
118
119;------------------------------------------------------------------------------
120;  VOID
121;  EfiWriteMsr (
122;    IN   UINT32  Index,  // rcx
123;    IN   UINT64  Value   // rdx
124;    )
125;------------------------------------------------------------------------------
126EfiWriteMsr PROC   PUBLIC
127    mov     rax,  rdx   ; rdx = Value
128    sar     rdx,  32    ; convert rdx to edx upper 32-bits
129    wrmsr               ; wrmsr[ecx] result = edx:eax
130    ret
131EfiWriteMsr  ENDP
132
133
134;------------------------------------------------------------------------------
135; UINT64
136; EfiReadTsc (
137;   VOID
138;   );
139;------------------------------------------------------------------------------
140EfiReadTsc PROC    PUBLIC
141    rdtsc
142    shl     rax, 32
143    shrd    rax, rdx, 32
144    ret
145EfiReadTsc  ENDP
146
147;------------------------------------------------------------------------------
148; VOID
149; EfiDisableCache (
150;   VOID
151;   );
152;------------------------------------------------------------------------------
153EfiDisableCache PROC    PUBLIC
154; added a check to see if cache is already disabled. If it is, then skip.
155    mov   rax, cr0
156    and   rax, 060000000h
157    cmp   rax, 0
158    jne   @f
159    mov   rax, cr0
160    or    rax, 060000000h
161    mov   cr0, rax
162    wbinvd
163@@:
164    ret
165EfiDisableCache ENDP
166
167;------------------------------------------------------------------------------
168; VOID
169; EfiEnableCache (
170;   VOID
171;   );
172;------------------------------------------------------------------------------
173EfiEnableCache PROC    PUBLIC
174    wbinvd
175    mov   rax, cr0
176    and   rax, 09fffffffh
177    mov   cr0, rax
178    ret
179EfiEnableCache ENDP
180
181;------------------------------------------------------------------------------
182; UINTN
183; EfiGetEflags (
184;   VOID
185;   );
186;------------------------------------------------------------------------------
187EfiGetEflags PROC    PUBLIC
188    pushfq
189    pop   rax
190    ret
191EfiGetEflags  ENDP
192
193;------------------------------------------------------------------------------
194; VOID
195; EfiDisableInterrupts (
196;   VOID
197;   );
198;------------------------------------------------------------------------------
199EfiDisableInterrupts PROC    PUBLIC
200    cli
201    ret
202EfiDisableInterrupts  ENDP
203
204;------------------------------------------------------------------------------
205; VOID
206; EfiEnableInterrupts (
207;   VOID
208;   );
209;------------------------------------------------------------------------------
210EfiEnableInterrupts PROC    PUBLIC
211    sti
212    ret
213EfiEnableInterrupts  ENDP
214;------------------------------------------------------------------------------
215;  VOID
216;  EfiCpuidExt (
217;    IN   UINT32              RegisterInEax,
218;    IN   UINT32              CacheLevel,
219;    OUT  EFI_CPUID_REGISTER  *Regs
220;    )
221;------------------------------------------------------------------------------
222EfiCpuidExt PROC    PUBLIC
223     push   rbx
224     mov    rax, rcx          ; rax = RegisterInEax
225     mov    rcx, rdx          ; rcx = CacheLevel
226
227     cpuid
228     mov    [r8 + 0 ],  eax   ; Reg->RegEax
229     mov    [r8 + 4 ],  ebx   ; Reg->RegEbx
230     mov    [r8 + 8 ],  ecx   ; Reg->RegEcx
231     mov    [r8 + 12],  edx   ; Reg->RegEdx
232
233     pop rbx
234     ret
235EfiCpuidExt  ENDP
236END
237