Subversion Repositories HelenOS-historic

Rev

Rev 125 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 125 Rev 348
Line 24... Line 24...
24
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
# The code below just interfaces the CPUID instruction.
-
 
30
# CPU recognition logic is contained in higher-level functions.
-
 
31
 
-
 
32
.text
29
.text
33
 
30
 
34
.global has_cpuid
31
.global has_cpuid
35
.global cpuid
-
 
36
.global rdtsc
-
 
37
 
32
 
38
 
33
 
39
## Determine CPUID support
34
## Determine CPUID support
40
#
35
#
41
# Return 0 in EAX if CPUID is not support, 1 if supported.
36
# Return 0 in EAX if CPUID is not supported, 1 if supported.
42
#
37
#
43
has_cpuid:
38
has_cpuid:
44
	push %ebx
-
 
45
	
-
 
46
	pushf			# store flags
39
	pushf			# store flags
47
	popl %eax		# read flags
40
	popl %eax		# read flags
48
	movl %eax,%ebx		# copy flags
41
	movl %eax,%edx		# copy flags
49
	btcl $21,%ebx		# swap the ID bit
42
	btcl $21,%edx		# swap the ID bit
50
	pushl %ebx
43
	pushl %edx
51
	popf			# propagate the change into flags
44
	popf			# propagate the change into flags
52
	pushf
45
	pushf
53
	popl %ebx		# read flags	
46
	popl %edx		# read flags	
54
	andl $(1<<21),%eax	# interested only in ID bit
47
	andl $(1<<21),%eax	# interested only in ID bit
55
	andl $(1<<21),%ebx
48
	andl $(1<<21),%edx
56
	xorl %ebx,%eax		# 0 if not supported, 1 if supported
49
	xorl %edx,%eax		# 0 if not supported, 1 if supported
57
	
-
 
58
	pop %ebx
-
 
59
	ret
-
 
60
 
-
 
61
 
-
 
62
## Get CPUID data
-
 
63
#
-
 
64
# This code is just an interfaces the CPUID instruction, CPU recognition
-
 
65
# logic is contained in higher-level functions.
-
 
66
#
-
 
67
# The C prototype is:
-
 
68
#   void cpuid(__u32 cmd, struct cpu_info *info)
-
 
69
#
-
 
70
# @param cmd  CPUID command.
-
 
71
# @param info Buffer to store CPUID output.
-
 
72
#
-
 
73
cpuid:
-
 
74
	pushl %ebp
-
 
75
	movl %esp,%ebp
-
 
76
	pusha
-
 
77
 
-
 
78
	movl 8(%ebp),%eax	# load the command into %eax
-
 
79
	movl 12(%ebp),%esi	# laod the address of the info struct
-
 
80
 
-
 
81
	cpuid	
-
 
82
	movl %eax,0(%esi)
-
 
83
	movl %ebx,4(%esi)
-
 
84
	movl %ecx,8(%esi)
-
 
85
	movl %edx,12(%esi)
-
 
86
 
-
 
87
	popa
-
 
88
	popl %ebp
-
 
89
	ret
-
 
90
 
-
 
91
rdtsc:
-
 
92
	rdtsc
-
 
93
	ret
50
	ret