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