xref: /OK3568_Linux_fs/kernel/tools/perf/arch/x86/util/archinsn.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include "../../../../arch/x86/include/asm/insn.h"
3*4882a593Smuzhiyun #include "archinsn.h"
4*4882a593Smuzhiyun #include "event.h"
5*4882a593Smuzhiyun #include "machine.h"
6*4882a593Smuzhiyun #include "thread.h"
7*4882a593Smuzhiyun #include "symbol.h"
8*4882a593Smuzhiyun 
arch_fetch_insn(struct perf_sample * sample,struct thread * thread,struct machine * machine)9*4882a593Smuzhiyun void arch_fetch_insn(struct perf_sample *sample,
10*4882a593Smuzhiyun 		     struct thread *thread,
11*4882a593Smuzhiyun 		     struct machine *machine)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun 	struct insn insn;
14*4882a593Smuzhiyun 	int len;
15*4882a593Smuzhiyun 	bool is64bit = false;
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun 	if (!sample->ip)
18*4882a593Smuzhiyun 		return;
19*4882a593Smuzhiyun 	len = thread__memcpy(thread, machine, sample->insn, sample->ip, sizeof(sample->insn), &is64bit);
20*4882a593Smuzhiyun 	if (len <= 0)
21*4882a593Smuzhiyun 		return;
22*4882a593Smuzhiyun 	insn_init(&insn, sample->insn, len, is64bit);
23*4882a593Smuzhiyun 	insn_get_length(&insn);
24*4882a593Smuzhiyun 	if (insn_complete(&insn) && insn.length <= len)
25*4882a593Smuzhiyun 		sample->insn_len = insn.length;
26*4882a593Smuzhiyun }
27