/kernel/trunk/core/syscall.inc |
---|
48,25 → 48,13 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;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 |
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 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
/kernel/trunk/kernel.asm |
---|
3298,12 → 3298,24 |
wrmsr_instr: |
;now counter in ecx |
;(edx:eax) esi:edi => edx:esi |
; 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 |
mov [esp+36],eax |
mov [esp+24],edx ;ret in ebx? |
@@: |
ret |
cache_disable: |
mov eax,cr0 |
or eax,01100000000000000000000000000000b |
/programs/develop/fast_call_test/MACROS.INC |
---|
129,7 → 129,11 |
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 |
136,11 → 140,33 |
__mov edx,d |
__mov esi,e |
__mov edi,f |
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 |
lang fix ru ; ru en fr ge fi |
/programs/develop/fast_call_test/test.ASM |
---|
4,7 → 4,6 |
; Compile with FASM for Kolibri |
; |
; |
SYSENTER_VAR equ 0 |
use32 |
org 0x0 |
db 'MENUET01' |
20,6 → 19,7 |
START: print 'Please wait' |
; ÷åðåç áûñòðûé âûçîâ (SYSENTER) |
__CPU_type equ p6 |
test1: mov eax, 1 |
cpuid |
test edx, 0x800 |
34,12 → 34,10 |
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 |
;---------------------------------------------- |
; ÷åðåç áûñòðûé âûçîâ (SYSCALL) |
__CPU_type equ k6 |
test2: xor eax, eax |
cpuid |
cmp ecx, "cAMD" |
75,12 → 74,9 |
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 |
.end: print ' <- Fast call (SYSCALL)' |
;---------------------------------------------- |
; ÷åðåç øëþç ïðåðûâàíèÿ |
__CPU_type equ p5 |
xor eax, eax |
cpuid |
rdtsc |
104,8 → 101,7 |
test3: mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
int 0x40 |
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà |
dec ebx |
jnz .nxt |
121,42 → 117,7 |
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: |
/programs/system/pcidev/trunk/build_en.bat |
---|
File deleted |
\ No newline at end of file |
/programs/system/pcidev/trunk/build_ge.bat |
---|
File deleted |
\ No newline at end of file |
/programs/system/pcidev/trunk/build.bat |
---|
0,0 → 1,2 |
@fasm pcidev.asm pcidev |
@pause |