blob: 96307712c09c8b885e12962ff90453f6301005eb [file] [log] [blame]
thughes4ee64962004-06-16 20:51:45 +00001
2##--------------------------------------------------------------------##
njn68980862005-06-18 18:31:26 +00003##--- CPUID interface. m_cpuid.S ---##
thughes4ee64962004-06-16 20:51:45 +00004##--------------------------------------------------------------------##
5
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
njn53612422005-03-12 16:22:54 +000010 Copyright (C) 2000-2005 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 */
36.globl VG_(has_cpuid)
njn68980862005-06-18 18:31:26 +000037#if defined(VGA_x86)
38 VG_(has_cpuid):
tomb9c3d462005-03-29 09:53:47 +000039 pushl %ebp
40 movl %esp, %ebp
41 pushl %ecx
42 pushfl
43 pushfl
44 popl %eax
45 movl %eax, %ecx
46 xorl $0x200000, %eax
47 pushl %eax
48 popfl
49 pushfl
50 popl %eax
51 popfl
52 xorl %ecx, %eax
53 andl $0x200000, %eax
54 shrl $21, %eax
55 popl %ecx
56 movl %ebp, %esp
57 popl %ebp
58 ret
njn68980862005-06-18 18:31:26 +000059#elif defined(VGA_amd64)
60 VG_(has_cpuid):
61 movq $1, %rax
62 ret
cerion85665ca2005-06-20 15:51:07 +000063#elif defined(VGA_appc32)
64//CAB: TODO
njn68980862005-06-18 18:31:26 +000065#endif
tomb9c3d462005-03-29 09:53:47 +000066
67/*
68 void VG_(cpuid)(UInt eax,
njn68980862005-06-18 18:31:26 +000069 UInt* eax_ret, UInt* ebx_ret, UInt* ecx_ret, UInt* edx_ret)
thughes4ee64962004-06-16 20:51:45 +000070 */
71.globl VG_(cpuid)
njn68980862005-06-18 18:31:26 +000072#if defined(VGA_x86)
73 VG_(cpuid):
thughes4ee64962004-06-16 20:51:45 +000074 pushl %ebp
75 movl %esp, %ebp
76 pushl %eax
77 pushl %ebx
78 pushl %ecx
79 pushl %edx
80 pushl %esi
81 movl 8(%ebp), %eax
82 cpuid
83 movl 12(%ebp), %esi
84 testl %esi, %esi
85 jz 1f
86 movl %eax, (%esi)
njn68980862005-06-18 18:31:26 +000087 1:
thughes4ee64962004-06-16 20:51:45 +000088 movl 16(%ebp), %esi
89 testl %esi, %esi
90 jz 2f
91 movl %ebx, (%esi)
njn68980862005-06-18 18:31:26 +000092 2:
thughes4ee64962004-06-16 20:51:45 +000093 movl 20(%ebp), %esi
94 testl %esi, %esi
95 jz 3f
96 movl %ecx, (%esi)
njn68980862005-06-18 18:31:26 +000097 3:
thughes4ee64962004-06-16 20:51:45 +000098 movl 24(%ebp), %esi
99 testl %esi, %esi
100 jz 4f
101 movl %edx, (%esi)
njn68980862005-06-18 18:31:26 +0000102 4:
thughes4ee64962004-06-16 20:51:45 +0000103 popl %esi
104 popl %edx
105 popl %ecx
106 popl %ebx
107 popl %eax
108 movl %ebp, %esp
109 popl %ebp
110 ret
njn68980862005-06-18 18:31:26 +0000111#elif defined(VGA_amd64)
112 VG_(cpuid):
113 pushq %rbp
114 movq %rsp, %rbp
115 pushq %rbx
116 movl %edi, %eax
117 movq %rdx, %rdi
118 movq %rcx, %r9
119 /*
120 eax_ret now in %rsi
121 ebx_ret now in %rdi
122 ecx_ret now in %r9
123 edx_ret now in %r8
124 */
125 cpuid
126 testq %rsi, %rsi
127 jz 1f
128 movl %eax, (%rsi)
129 1:
130 testq %rdi, %rdi
131 jz 2f
132 movl %ebx, (%rdi)
133 2:
134 testq %r9, %r9
135 jz 3f
136 movl %ecx, (%r9)
137 3:
138 testq %r8, %r8
139 jz 4f
140 movl %edx, (%r8)
141 4:
142 popq %rbx
143 movq %rbp, %rsp
144 popq %rbp
145 ret
cerion85665ca2005-06-20 15:51:07 +0000146#elif defined(VGA_appc32)
147//CAB: TODO
njn68980862005-06-18 18:31:26 +0000148#endif
thughes4ad52d02004-06-27 17:37:21 +0000149
150/* Let the linker know we don't need an executable stack */
151.section .note.GNU-stack,"",@progbits
njn68980862005-06-18 18:31:26 +0000152
thughes4ad52d02004-06-27 17:37:21 +0000153##--------------------------------------------------------------------##
njn68980862005-06-18 18:31:26 +0000154##--- end ---##
thughes4ad52d02004-06-27 17:37:21 +0000155##--------------------------------------------------------------------##