blob: 42df34344e159783fc7a9c11c856514c6cc1d85a [file] [log] [blame]
thughes4ee64962004-06-16 20:51:45 +00001
sewardj0e24d092006-10-17 20:47:13 +00002/*--------------------------------------------------------------------*/
3/*--- CPUID interface. m_cpuid.S ---*/
4/*--------------------------------------------------------------------*/
thughes4ee64962004-06-16 20:51:45 +00005
6/*
njnb9c427c2004-12-01 14:14:42 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
thughes4ee64962004-06-16 20:51:45 +00009
sewardj9eecbbb2010-05-03 21:37:12 +000010 Copyright (C) 2000-2010 Julian Seward
thughes4ee64962004-06-16 20:51:45 +000011 jseward@acm.org
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
sewardj45f4e7c2005-09-27 19:20:21 +000031#include "pub_core_basics_asm.h"
thughes4ee64962004-06-16 20:51:45 +000032
33/*
tomb9c3d462005-03-29 09:53:47 +000034 Bool VG_(has_cpuid)(void)
35 */
njn68980862005-06-18 18:31:26 +000036#if defined(VGA_x86)
sewardj59570ff2010-01-01 11:59:33 +000037.text
38.globl VG_(has_cpuid)
njn68980862005-06-18 18:31:26 +000039 VG_(has_cpuid):
tomb9c3d462005-03-29 09:53:47 +000040 pushl %ebp
41 movl %esp, %ebp
42 pushl %ecx
43 pushfl
44 pushfl
45 popl %eax
46 movl %eax, %ecx
47 xorl $0x200000, %eax
48 pushl %eax
49 popfl
50 pushfl
51 popl %eax
52 popfl
53 xorl %ecx, %eax
54 andl $0x200000, %eax
55 shrl $21, %eax
56 popl %ecx
57 movl %ebp, %esp
58 popl %ebp
59 ret
njn68980862005-06-18 18:31:26 +000060#elif defined(VGA_amd64)
sewardj59570ff2010-01-01 11:59:33 +000061.text
62.globl VG_(has_cpuid)
njn68980862005-06-18 18:31:26 +000063 VG_(has_cpuid):
64 movq $1, %rax
65 ret
66#endif
tomb9c3d462005-03-29 09:53:47 +000067
68/*
69 void VG_(cpuid)(UInt eax,
njn68980862005-06-18 18:31:26 +000070 UInt* eax_ret, UInt* ebx_ret, UInt* ecx_ret, UInt* edx_ret)
thughes4ee64962004-06-16 20:51:45 +000071 */
njn68980862005-06-18 18:31:26 +000072#if defined(VGA_x86)
sewardj59570ff2010-01-01 11:59:33 +000073.text
74.globl VG_(cpuid)
njn68980862005-06-18 18:31:26 +000075 VG_(cpuid):
thughes4ee64962004-06-16 20:51:45 +000076 pushl %ebp
77 movl %esp, %ebp
78 pushl %eax
79 pushl %ebx
80 pushl %ecx
81 pushl %edx
82 pushl %esi
83 movl 8(%ebp), %eax
84 cpuid
85 movl 12(%ebp), %esi
86 testl %esi, %esi
87 jz 1f
88 movl %eax, (%esi)
njn68980862005-06-18 18:31:26 +000089 1:
thughes4ee64962004-06-16 20:51:45 +000090 movl 16(%ebp), %esi
91 testl %esi, %esi
92 jz 2f
93 movl %ebx, (%esi)
njn68980862005-06-18 18:31:26 +000094 2:
thughes4ee64962004-06-16 20:51:45 +000095 movl 20(%ebp), %esi
96 testl %esi, %esi
97 jz 3f
98 movl %ecx, (%esi)
njn68980862005-06-18 18:31:26 +000099 3:
thughes4ee64962004-06-16 20:51:45 +0000100 movl 24(%ebp), %esi
101 testl %esi, %esi
102 jz 4f
103 movl %edx, (%esi)
njn68980862005-06-18 18:31:26 +0000104 4:
thughes4ee64962004-06-16 20:51:45 +0000105 popl %esi
106 popl %edx
107 popl %ecx
108 popl %ebx
109 popl %eax
110 movl %ebp, %esp
111 popl %ebp
112 ret
njn68980862005-06-18 18:31:26 +0000113#elif defined(VGA_amd64)
sewardj59570ff2010-01-01 11:59:33 +0000114.text
115.globl VG_(cpuid)
njn68980862005-06-18 18:31:26 +0000116 VG_(cpuid):
117 pushq %rbp
118 movq %rsp, %rbp
119 pushq %rbx
120 movl %edi, %eax
121 movq %rdx, %rdi
122 movq %rcx, %r9
123 /*
124 eax_ret now in %rsi
125 ebx_ret now in %rdi
126 ecx_ret now in %r9
127 edx_ret now in %r8
128 */
129 cpuid
130 testq %rsi, %rsi
131 jz 1f
132 movl %eax, (%rsi)
133 1:
134 testq %rdi, %rdi
135 jz 2f
136 movl %ebx, (%rdi)
137 2:
138 testq %r9, %r9
139 jz 3f
140 movl %ecx, (%r9)
141 3:
142 testq %r8, %r8
143 jz 4f
144 movl %edx, (%r8)
145 4:
146 popq %rbx
147 movq %rbp, %rsp
148 popq %rbp
149 ret
150#endif
sewardj745fc452006-10-17 02:03:11 +0000151
sewardj67b38c32010-01-01 12:44:12 +0000152#if defined(VGP_x86_linux) || defined(VGP_amd64_linux)
thughes4ad52d02004-06-27 17:37:21 +0000153/* Let the linker know we don't need an executable stack */
154.section .note.GNU-stack,"",@progbits
sewardj745fc452006-10-17 02:03:11 +0000155#endif
156
sewardj0e24d092006-10-17 20:47:13 +0000157/*--------------------------------------------------------------------*/
158/*--- end ---*/
159/*--------------------------------------------------------------------*/