1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
;*************************************************************************
;*************************************************************************
;** **
;** (C)Copyright 1985-2009, American Megatrends, Inc. **
;** **
;** All Rights Reserved. **
;** **
;** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
;** **
;** Phone: (770)-246-8600 **
;** **
;*************************************************************************
;*************************************************************************
;*************************************************************************
; $Header: /Alaska/SOURCE/Core/Modules/x64Core/x64AsmLib/CPULib_CpuID.asm 2 11/11/11 3:40p Artems $
;
; $Revision: 2 $
;
; $Date: 11/11/11 3:40p $
;*************************************************************************
; Revision History
; ----------------
; $Log: /Alaska/SOURCE/Core/Modules/x64Core/x64AsmLib/CPULib_CpuID.asm $
;
; 2 11/11/11 3:40p Artems
; Bug fix: Verify pointer is not NULL, when return value
;
; 1 10/01/10 5:07p Felixp
;
; 1 8/24/06 12:57p Felixp
;
;*************************************************************************
;<AMI_FHDR_START>
;
; Name:
;
; Description:
;
;<AMI_FHDR_END>
;*************************************************************************
.code
;*************************************************************************
;<AMI_PHDR_START>
;
; Name: CPULib_CpuID
;
; Description:
; VOID CPULib_CpuID(IN UINT32 CpuIDIndex, IN UINT32 *pRegEAX,
; IN UINT32 *pRegEBX, IN UINT32 *pRegECX, IN UINT32 *pRegEDX) issues the
; CPUID instruction with the index provided and returns the register values.
;
; Input:
; IN UINT32 CpuIDIndex
; 32-bit CPUID index.
;
; IN UINT32 *pRegEAX
; Value of EAX after CPUID instruction.
;
; IN UINT32 *pRegEBX
; Value of EBX after CPUID instruction.
;
; IN UINT32 *pRegECX
; Value of ECX after CPUID instruction.
;
; IN UINT32 *pRegEDX
; Value of EDX after CPUID instruction.
;
; Output:
; VOID.
;
; Modified:
;
; Referrals:
;
; Notes:
;
;<AMI_PHDR_END>
;*************************************************************************
CPULib_CpuID proc
;rcx = CpuIDIndex
;rdx = pRegEax
;r8 = pRegEBX
;r9 = pRegECX
;[rsp + 8] = pRegEDX:DWORD
push rbx
mov r11, [rsp + 30h] ;pRegEDX
mov r10, r9 ;pRegECX
mov r9, r8 ;pRegEBX
mov r8, rdx ;pRegEAX
mov eax, ecx
mov ecx, [r10]
cpuid
or r8, r8
jz skip1
mov [r8], eax
skip1:
or r9, r9
jz skip2
mov [r9], ebx
skip2:
or r10, r10
jz skip3
mov [r10], ecx
skip3:
or r11, r11
jz skip4
mov [r11], edx
skip4:
pop rbx
ret
CPULib_CpuID endp
END
;*************************************************************************
;*************************************************************************
;** **
;** (C)Copyright 1985-2009, American Megatrends, Inc. **
;** **
;** All Rights Reserved. **
;** **
;** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
;** **
;** Phone: (770)-246-8600 **
;** **
;*************************************************************************
|