forked from KolibriOS/kolibrios
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:
parent
4869fa5f70
commit
2432006d40
@ -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
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
2
programs/system/pcidev/trunk/build.bat
Normal file
2
programs/system/pcidev/trunk/build.bat
Normal file
@ -0,0 +1,2 @@
|
||||
@fasm pcidev.asm pcidev
|
||||
@pause
|
@ -1,4 +0,0 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm pcidev.asm pcidev
|
||||
@pause
|
@ -1,4 +0,0 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ge >lang.inc
|
||||
@fasm pcidev.asm pcidev
|
||||
@pause
|
Loading…
Reference in New Issue
Block a user