Fast calls

* multi thread program support
* MSR protect
* fast_call_test update
---------------------------
old code:
	int 0x40

code for Intel SYSENTER:
	push	ebp
	mov	ebp, esp
	push	..ret_point
	sysenter
 ..ret_point:
	pop	edx
	pop	ecx

code for AMD SYSCALL:
	push	ecx
	syscall
	pop	ecx

recommendation: use mcall from macros.inc

git-svn-id: svn://kolibrios.org@477 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Iliya Mihailov (Ghost) 2007-05-07 12:54:32 +00:00
parent 4869fa5f70
commit 2432006d40
7 changed files with 68 additions and 82 deletions

View File

@ -48,25 +48,13 @@ i40:
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uglobal
;times 100 db ?
;sysenter_stack:
;endg
align 32
SYSENTER_VAR equ 0
sysenter_entry:
; Íàñòðàèâàåì ñòåê
; cli sysenter clear IF
; push eax
; mov eax, [ss:CURRENT_TASK]
; shl eax, 8
; mov eax, [ss:SLOT_BASE + eax + APPDATA.pl0_stack]
; lea esp, [eax + RING0_STACK_SIZE] ; configure ESP
; mov eax, [ss:sysenter_stack - 4] ; eax - original eax, from app
mov esp, [ss:tss._esp0]
sti
push ebp ; save app esp + 4
mov ebp, [ebp] ; ebp - original ebp
;------------------
pushad
cld
@ -85,8 +73,13 @@ sysenter_entry:
popad
;------------------
mov edx, [SYSENTER_VAR] ; eip
mov ecx, [SYSENTER_VAR + 4] ; esp
xchg ecx, [ss:esp] ; â âåðøèí ñòåêà - app ecx, ecx - app esp + 4
sub ecx, 4
xchg edx, [ecx] ; edx - return point, & save original edx
push edx
mov edx, [ss:esp + 4]
mov [ecx + 4], edx ; save original ecx
pop edx
sysexit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -3298,12 +3298,24 @@ ret
wrmsr_instr:
;now counter in ecx
;(edx:eax) esi:edi => edx:esi
mov eax,esi
wrmsr
mov [esp+36],eax
mov [esp+24],edx ;ret in ebx?
; Fast Call MSR can't be destroy
; Íî MSR_AMD_EFER ìîæíî èçìåíÿòü, ò.ê. â ýòîì ðåãèñòðå ëèø
; âêëþ÷àþòñÿ/âûêëþ÷àþòñÿ ðàñøèðåííûå âîçìîæíîñòè
cmp ecx, MSR_SYSENTER_CS
je @f
cmp ecx, MSR_SYSENTER_ESP
je @f
cmp ecx, MSR_SYSENTER_EIP
je @f
cmp ecx, MSR_AMD_STAR
je @f
mov eax, esi
wrmsr
@@:
ret
cache_disable:
mov eax,cr0
or eax,01100000000000000000000000000000b

View File

@ -129,16 +129,42 @@ macro __mov reg,a { ; mike.dld
end if
}
macro mcall a,b,c,d,e,f { ; mike.dld
__CPU_type equ p5
SYSENTER_VAR equ 0
macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls
local ..ret_point
__mov eax,a
__mov ebx,b
__mov ecx,c
__mov edx,d
__mov esi,e
__mov edi,f
int 0x40
}
if __CPU_type eq p5
int 0x40
else
if __CPU_type eq p6
push ebp
mov ebp, esp
push ..ret_point ; it may be 2 or 5 byte
sysenter
..ret_point:
pop edx
pop ecx
else
if __CPU_type eq k6
push ecx
syscall
pop ecx
else
display 'ERROR : unknown CPU type'
int 0x40
end if
end if
end if
}
; language for programs

View File

@ -4,7 +4,6 @@
; Compile with FASM for Kolibri
;
;
SYSENTER_VAR equ 0
use32
org 0x0
db 'MENUET01'
@ -20,6 +19,7 @@ include 'debug.inc'
START: print 'Please wait'
; ÷åðåç áûñòðûé âûçîâ (SYSENTER)
__CPU_type equ p6
test1: mov eax, 1
cpuid
test edx, 0x800
@ -34,12 +34,10 @@ test1: mov eax, 1
mov [old_tsc + 4], edx
mov ebx, 0x100000
mov dword[SYSENTER_VAR], .ret_p
mov [SYSENTER_VAR + 4], esp
align 32
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà
sysenter ; ïîðòÿòñÿ ecx, edx
.ret_p: dec ebx
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà
; ïîðòÿòñÿ ecx, edx
dec ebx
jnz .nxt
xor eax, eax
@ -56,6 +54,7 @@ test1: mov eax, 1
;----------------------------------------------
; ÷åðåç áûñòðûé âûçîâ (SYSCALL)
__CPU_type equ k6
test2: xor eax, eax
cpuid
cmp ecx, "cAMD"
@ -75,12 +74,9 @@ test2: xor eax, eax
mov ebx, 0x100000
align 32
.nxt: mov eax, 19
push ecx
syscall
pop ecx
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà
.ret_p: dec ebx
dec ebx
jnz .nxt
xor eax, eax
@ -96,6 +92,7 @@ test2: xor eax, eax
.end: print ' <- Fast call (SYSCALL)'
;----------------------------------------------
; ÷åðåç øëþç ïðåðûâàíèÿ
__CPU_type equ p5
xor eax, eax
cpuid
rdtsc
@ -104,8 +101,7 @@ test2: xor eax, eax
test3: mov ebx, 0x100000
align 32
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà
int 0x40
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà
dec ebx
jnz .nxt
@ -121,42 +117,7 @@ test3: mov ebx, 0x100000
debug_print_hex eax
print ' <- Interrupt'
call show_alive
mov eax, -1
int 0x40
mcall -1
;---------------------------------------------
show_alive:
; ÷åðåç áûñòðûé âûçîâ, íàñòðàèâàåì ðåãèñòðû äëÿ âîçâðàòà
mov eax, 63
mov ebx, 1
mov esi, msg_Ok
.nxt: mov cl, [esi]
test cl, cl
jz .end
mov dword[SYSENTER_VAR], .ret_p
mov [SYSENTER_VAR + 4], esp
sysenter ; ïîðòÿòñÿ ecx, edx
.ret_p: inc esi
jmp .nxt
.end: ret
; ÷åðåç øëþç ïðåðûâàíèÿ
; mov eax, 63
; mov ebx, 1
; mov esi, msg_Ok
; @@: mov cl, [esi]
; test cl, cl
; jz @f
; int 0x40
; inc esi
; jmp @b
; @@: ret
old_tsc: dd 0, 0
msg_Ok db 'Alive!', 10, 13, 0
I_END:

View File

@ -0,0 +1,2 @@
@fasm pcidev.asm pcidev
@pause

View File

@ -1,4 +0,0 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm pcidev.asm pcidev
@pause

View File

@ -1,4 +0,0 @@
@erase lang.inc
@echo lang fix ge >lang.inc
@fasm pcidev.asm pcidev
@pause