85 строки
1.6 KiB
NASM
85 строки
1.6 KiB
NASM
;
|
|
; Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
|
|
;
|
|
|
|
ifndef _WIN64
|
|
.386
|
|
.model flat, c
|
|
endif ; !_WIN64
|
|
|
|
OPTION PROLOGUE:NONE
|
|
OPTION EPILOGUE:NONE
|
|
.code
|
|
|
|
ifndef _WIN64
|
|
|
|
_WorkGroup_callKernel proc
|
|
push ebp
|
|
mov ebp, esp
|
|
mov esp, 10h[ebp] ; stackPtr
|
|
mov edx, 0Ch[ebp] ; entryPoint
|
|
push 08h[ebp] ; params
|
|
call edx
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
_WorkGroup_callKernel endp
|
|
|
|
_WorkGroup_callKernelProtectedReturn proc
|
|
mov eax, ebp
|
|
mov ebp, esp
|
|
mov esp, 0Ch[ebp] ; stackPtr
|
|
sub esp, CPUKERNEL_STACK_ALIGN
|
|
mov 04h[esp], eax ; save ebp
|
|
mov 00h[esp], ebx ; save ebx
|
|
mov ebx, 00h[ebp] ; return address
|
|
mov edx, 08h[ebp] ; entryPoint
|
|
|
|
push 04h[ebp] ; params
|
|
call edx
|
|
|
|
mov edx, ebx
|
|
mov ecx, ebp
|
|
mov ebx, 04h[esp] ; load ebx
|
|
mov ebp, 08h[esp] ; load ebp
|
|
mov esp, ecx
|
|
add esp, 04h ; skip return address
|
|
jmp edx
|
|
_WorkGroup_callKernelProtectedReturn endp
|
|
|
|
else ; _WIN64
|
|
|
|
_WorkGroup_callKernel proc
|
|
push rbp
|
|
mov rbp, rsp
|
|
mov rsp, r8 ; stackPtr
|
|
call rdx
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
_WorkGroup_callKernel endp
|
|
|
|
_WorkGroup_callKernelProtectedReturn proc
|
|
mov rax, rbp
|
|
mov rbp, rsp
|
|
mov rsp, r8 ; stackPtr
|
|
sub rsp, CPUKERNEL_STACK_ALIGN
|
|
mov 08h[rsp], rax ; save rbp
|
|
mov 00h[rsp], rbx ; save rbx
|
|
mov rbx, [rbp] ; return address
|
|
|
|
call rdx
|
|
|
|
mov rdx, rbx
|
|
mov rcx, rbp
|
|
mov rbx, 00h[rsp] ; load rbx
|
|
mov rbp, 08h[rsp] ; load rbp
|
|
mov rsp, rcx
|
|
add rsp, 08h ; skip return address
|
|
jmp rdx
|
|
_WorkGroup_callKernelProtectedReturn endp
|
|
|
|
endif ; _WIN64
|
|
|
|
end
|