blob: 4c27c0f340fb8d382558fc3235b2f3e7da34796a [file] [log] [blame]
COMMENT @
Copyright (C) 2017-2025 Intel Corporation
SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
@
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;; Intel Processor Trace Marker Functionality
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TEXT segment
public __itt_pt_mark
public __itt_pt_event
public __itt_pt_mark_event
public __itt_pt_mark_threshold
public __itt_pt_write
public __itt_pt_byte
align 10h
;;; void __itt_pt_mark(unsigned char index);
__itt_pt_mark proc
and rcx,0ffh
lea r10,offset __itt_pt_mark_call_table
lea rcx,[r10 + rcx * 4]
jmp rcx
align 04h
dd 0, 1, 2, 3 ;;; GUID
dd 0fadefadeh ;;; magic marker
__itt_pt_mark_call_table:
dd 256 dup(0000c2c3h OR (( $ - offset __itt_pt_mark_call_table) SHL 14))
__itt_pt_mark endp
align 10h
__itt_pt_byte proc
and rcx,0ffh
lea r10,offset __itt_pt_byte_call_table
add rcx,r10
jmp rcx
align 04h
dd 0, 1, 2, 3 ;;; GUID
dd 0fadedeafh ;;; magic marker
__itt_pt_byte_call_table:
db 256 dup(0c3h)
__itt_pt_byte endp
align 10h
__itt_pt_event proc
rdpmc
mov cl,al
call __itt_pt_byte
mov cl,ah
call __itt_pt_byte
shr eax,16
mov cl,al
call __itt_pt_byte
mov cl,ah
call __itt_pt_byte
mov cl,dl
call __itt_pt_byte
mov cl,dh
call __itt_pt_byte
shr edx,16
mov cl,dl
call __itt_pt_byte
mov cl,dh
call __itt_pt_byte
ret
__itt_pt_event endp
align 10h
__itt_pt_mark_event proc
test rcx,1
jnz odd
mov r8,rcx
xor rcx,rcx
call __itt_pt_event
mov rcx,r8
jmp __itt_pt_mark
odd:
call __itt_pt_mark
xor rcx,rcx
jmp __itt_pt_event
__itt_pt_mark_event endp
align 10h
__itt_pt_flush proc
lea rax,offset __itt_pt_mark_flush_1
jmp rax
align 10h
nop
__itt_pt_mark_flush_1:
lea rax,offset __itt_pt_mark_flush_2
jmp rax
align 10h
nop
nop
__itt_pt_mark_flush_2:
lea rax,offset __itt_pt_mark_flush_3
jmp rax
align 10h
nop
nop
nop
__itt_pt_mark_flush_3:
ret
__itt_pt_flush endp
align 10h
;;; int __itt_pt_mark_threshold(unsigned char index, unsigned long long* tmp, int threshold);
__itt_pt_mark_threshold proc
mov r9,rcx ;;; index
mov r10,rdx ;;; tmp
xor rdx,rdx
xor rax,rax
test rcx,1
jnz mark_end
mark_begin:
mov rcx,(1 SHL 30) + 1
rdpmc
shl rdx,32
or rdx,rax
mov [r10],rdx
mov rcx,r9
jmp __itt_pt_mark
mark_end:
mov rcx,(1 SHL 30) + 1
rdpmc
shl rdx,32
or rdx,rax
sub rdx,[r10]
cmp rdx,r8 ;;; threshold
mov rcx,r9
jnc found
jmp __itt_pt_mark
found:
call __itt_pt_mark
jmp __itt_pt_flush
__itt_pt_mark_threshold endp
;;; PTWRITE
align 10h
;;; void __itt_pt_write(unsigned long long value);
dd 0, 1, 2, 3 ;;; GUID
__itt_pt_write proc
;;; ptwrite rcx
db 0F3h, 48h, 0Fh, 0AEh, 0E1h
ret
__itt_pt_write endp
;;;
_TEXT ends
end