Subversion Repositories Kolibri OS

Rev

Rev 375 | Rev 477 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
375 Ghost 1
;
2
; Kolibri Fast Calls test
3
;
4
;   Compile with FASM for Kolibri
5
;
6
;
7
SYSENTER_VAR	equ	0
8
use32
9
org	0x0
10
	db    'MENUET01'
11
	dd     0x01
12
	dd     START
13
	dd     I_END
14
	dd     0x1000
15
	dd     0x1000
16
	dd     0x0, 0x0
17
 
18
include 'macros.inc'
19
include 'debug.inc'
20
 
398 Ghost 21
START:	print	'Please wait'
22
	; через быстрый вызов (SYSENTER)
23
test1:	mov	eax, 1
24
	cpuid
25
	test	edx, 0x800
26
	jnz	.ok
27
	dps	'unsupported     '
28
	jmp	.end
29
.ok:
375 Ghost 30
	xor	eax, eax
31
	cpuid
32
	rdtsc
33
	mov	[old_tsc], eax
34
	mov	[old_tsc + 4], edx
35
 
398 Ghost 36
	mov	ebx, 0x100000
375 Ghost 37
	mov	dword[SYSENTER_VAR], .ret_p
38
	mov	[SYSENTER_VAR + 4], esp
39
	align	32
40
.nxt:	mov	eax, 19 	; функция пустышка
41
	sysenter		; портятся ecx, edx
42
.ret_p: dec	ebx
43
	jnz	.nxt
44
 
45
	xor	eax, eax
46
	cpuid
47
	rdtsc
48
	cmp	eax, [old_tsc]
49
	jnb	@f
50
	dec	edx
51
@@:	sub	eax, [old_tsc]
52
	sub	edx, [old_tsc + 4]
53
	debug_print_hex edx
54
	debug_print_hex eax
398 Ghost 55
.end:	print	' <- Fast call (SYSENTER)'
375 Ghost 56
 
398 Ghost 57
	;----------------------------------------------
58
	; через быстрый вызов (SYSCALL)
59
test2:	xor	eax, eax
60
	cpuid
61
	cmp	ecx, "cAMD"
62
	je	.ok
63
.nf:	dps	'unsupported     '
64
	jmp	.end
65
.ok:	mov	eax, 0x80000001
66
	cpuid
67
	test	edx, 0x800  ; bit_11 - SYSCALL/SYSRET support
68
	jz	.nf
375 Ghost 69
 
70
	xor	eax, eax
71
	cpuid
72
	rdtsc
73
	mov	[old_tsc], eax
74
	mov	[old_tsc + 4], edx
398 Ghost 75
 
76
	mov	ebx, 0x100000
375 Ghost 77
	align	32
398 Ghost 78
.nxt:	mov	eax, 19
79
	push	ecx
80
	syscall
81
	pop	ecx
82
 
83
.ret_p: dec	ebx
84
	jnz	.nxt
85
 
86
	xor	eax, eax
87
	cpuid
88
	rdtsc
89
	cmp	eax, [old_tsc]
90
	jnb	@f
91
	dec	edx
92
@@:	sub	eax, [old_tsc]
93
	sub	edx, [old_tsc + 4]
94
	debug_print_hex edx
95
	debug_print_hex eax
96
.end:	print	' <- Fast call (SYSCALL)'
97
	;----------------------------------------------
98
	; через шлюз прерывания
99
	xor	eax, eax
100
	cpuid
101
	rdtsc
102
	mov	[old_tsc], eax
103
	mov	[old_tsc + 4], edx
104
 
105
test3:	mov	ebx, 0x100000
106
	align	32
375 Ghost 107
.nxt:	mov	eax, 19 	; функция пустышка
108
	int	0x40
109
	dec	ebx
110
	jnz	.nxt
111
 
112
	xor	eax, eax
113
	cpuid
114
	rdtsc
115
	cmp	eax, [old_tsc]
116
	jnb	@f
117
	dec	edx
118
@@:	sub	eax, [old_tsc]
119
	sub	edx, [old_tsc + 4]
120
	debug_print_hex edx
121
	debug_print_hex eax
122
	print	' <- Interrupt'
123
 
124
	call	show_alive
125
	mov	eax, -1
126
	int	0x40
127
;---------------------------------------------
128
show_alive:
129
	; через быстрый вызов, настраиваем регистры для возврата
130
	mov	eax, 63
131
	mov	ebx, 1
132
	mov	esi, msg_Ok
133
.nxt:	mov	cl, [esi]
134
	test	cl, cl
135
	jz	.end
136
 
137
	mov	dword[SYSENTER_VAR], .ret_p
138
	mov	[SYSENTER_VAR + 4], esp
139
	sysenter		; портятся ecx, edx
140
 
141
.ret_p: inc	esi
142
	jmp	.nxt
143
.end:	ret
144
	; через шлюз прерывания
145
	; mov   eax, 63
146
	; mov   ebx, 1
147
	; mov   esi, msg_Ok
148
; @@:   mov     cl, [esi]
149
	; test  cl, cl
150
	; jz    @f
151
 
152
	; int   0x40
153
 
154
	; inc   esi
155
	; jmp   @b
156
; @@:   ret
157
 
158
 
159
old_tsc:	dd	0, 0
160
 
161
msg_Ok	db	'Alive!', 10, 13, 0
162
I_END: