1*74fe6c29SRuslan Bukin /*
2*74fe6c29SRuslan Bukin  * Copyright (c) 2013-2018, Intel Corporation
3*74fe6c29SRuslan Bukin  *
4*74fe6c29SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
5*74fe6c29SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
6*74fe6c29SRuslan Bukin  *
7*74fe6c29SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
8*74fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer.
9*74fe6c29SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
10*74fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
11*74fe6c29SRuslan Bukin  *    and/or other materials provided with the distribution.
12*74fe6c29SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
13*74fe6c29SRuslan Bukin  *    may be used to endorse or promote products derived from this software
14*74fe6c29SRuslan Bukin  *    without specific prior written permission.
15*74fe6c29SRuslan Bukin  *
16*74fe6c29SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*74fe6c29SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*74fe6c29SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*74fe6c29SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*74fe6c29SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*74fe6c29SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*74fe6c29SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*74fe6c29SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*74fe6c29SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*74fe6c29SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*74fe6c29SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
27*74fe6c29SRuslan Bukin  */
28*74fe6c29SRuslan Bukin 
29*74fe6c29SRuslan Bukin #include "pt_decoder_function.h"
30*74fe6c29SRuslan Bukin #include "pt_packet_decoder.h"
31*74fe6c29SRuslan Bukin #include "pt_query_decoder.h"
32*74fe6c29SRuslan Bukin #include "pt_opcodes.h"
33*74fe6c29SRuslan Bukin 
34*74fe6c29SRuslan Bukin #include "intel-pt.h"
35*74fe6c29SRuslan Bukin 
36*74fe6c29SRuslan Bukin 
37*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_unknown = {
38*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_unknown,
39*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_unknown,
40*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_decode_unknown,
41*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_unknown
42*74fe6c29SRuslan Bukin };
43*74fe6c29SRuslan Bukin 
44*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_pad = {
45*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_pad,
46*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_pad,
47*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_decode_pad,
48*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_pad
49*74fe6c29SRuslan Bukin };
50*74fe6c29SRuslan Bukin 
51*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_psb = {
52*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_psb,
53*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_psb,
54*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
55*74fe6c29SRuslan Bukin 	/* .flags =  */ 0
56*74fe6c29SRuslan Bukin };
57*74fe6c29SRuslan Bukin 
58*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tip = {
59*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tip,
60*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tip,
61*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
62*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_tip
63*74fe6c29SRuslan Bukin };
64*74fe6c29SRuslan Bukin 
65*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tnt_8 = {
66*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tnt_8,
67*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tnt_8,
68*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
69*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_tnt
70*74fe6c29SRuslan Bukin };
71*74fe6c29SRuslan Bukin 
72*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tnt_64 = {
73*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tnt_64,
74*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tnt_64,
75*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
76*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_tnt
77*74fe6c29SRuslan Bukin };
78*74fe6c29SRuslan Bukin 
79*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tip_pge = {
80*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tip_pge,
81*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tip_pge,
82*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
83*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
84*74fe6c29SRuslan Bukin };
85*74fe6c29SRuslan Bukin 
86*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tip_pgd = {
87*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tip_pgd,
88*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tip_pgd,
89*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
90*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
91*74fe6c29SRuslan Bukin };
92*74fe6c29SRuslan Bukin 
93*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_fup = {
94*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_fup,
95*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_fup,
96*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_fup,
97*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_fup
98*74fe6c29SRuslan Bukin };
99*74fe6c29SRuslan Bukin 
100*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_pip = {
101*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_pip,
102*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_pip,
103*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_pip,
104*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
105*74fe6c29SRuslan Bukin };
106*74fe6c29SRuslan Bukin 
107*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_ovf = {
108*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_ovf,
109*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_ovf,
110*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
111*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_psbend | pdff_event
112*74fe6c29SRuslan Bukin };
113*74fe6c29SRuslan Bukin 
114*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_mode = {
115*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_mode,
116*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_mode,
117*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_mode,
118*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
119*74fe6c29SRuslan Bukin };
120*74fe6c29SRuslan Bukin 
121*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_psbend = {
122*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_psbend,
123*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_psbend,
124*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
125*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_psbend
126*74fe6c29SRuslan Bukin };
127*74fe6c29SRuslan Bukin 
128*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tsc = {
129*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tsc,
130*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tsc,
131*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_tsc,
132*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_timing
133*74fe6c29SRuslan Bukin };
134*74fe6c29SRuslan Bukin 
135*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_cbr = {
136*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_cbr,
137*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_cbr,
138*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_cbr,
139*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_timing | pdff_event
140*74fe6c29SRuslan Bukin };
141*74fe6c29SRuslan Bukin 
142*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_tma = {
143*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_tma,
144*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_tma,
145*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_decode_tma,
146*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_timing
147*74fe6c29SRuslan Bukin };
148*74fe6c29SRuslan Bukin 
149*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_mtc = {
150*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_mtc,
151*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_mtc,
152*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_decode_mtc,
153*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_timing
154*74fe6c29SRuslan Bukin };
155*74fe6c29SRuslan Bukin 
156*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_cyc = {
157*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_cyc,
158*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_cyc,
159*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_decode_cyc,
160*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_timing
161*74fe6c29SRuslan Bukin };
162*74fe6c29SRuslan Bukin 
163*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_stop = {
164*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_stop,
165*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_stop,
166*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
167*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
168*74fe6c29SRuslan Bukin };
169*74fe6c29SRuslan Bukin 
170*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_vmcs = {
171*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_vmcs,
172*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_vmcs,
173*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_vmcs,
174*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
175*74fe6c29SRuslan Bukin };
176*74fe6c29SRuslan Bukin 
177*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_mnt = {
178*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_mnt,
179*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_mnt,
180*74fe6c29SRuslan Bukin 	/* .header = */ pt_qry_header_mnt,
181*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
182*74fe6c29SRuslan Bukin };
183*74fe6c29SRuslan Bukin 
184*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_exstop = {
185*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_exstop,
186*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_exstop,
187*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
188*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
189*74fe6c29SRuslan Bukin };
190*74fe6c29SRuslan Bukin 
191*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_mwait = {
192*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_mwait,
193*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_mwait,
194*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
195*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
196*74fe6c29SRuslan Bukin };
197*74fe6c29SRuslan Bukin 
198*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_pwre = {
199*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_pwre,
200*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_pwre,
201*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
202*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
203*74fe6c29SRuslan Bukin };
204*74fe6c29SRuslan Bukin 
205*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_pwrx = {
206*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_pwrx,
207*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_pwrx,
208*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
209*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
210*74fe6c29SRuslan Bukin };
211*74fe6c29SRuslan Bukin 
212*74fe6c29SRuslan Bukin const struct pt_decoder_function pt_decode_ptw = {
213*74fe6c29SRuslan Bukin 	/* .packet = */ pt_pkt_decode_ptw,
214*74fe6c29SRuslan Bukin 	/* .decode = */ pt_qry_decode_ptw,
215*74fe6c29SRuslan Bukin 	/* .header = */ NULL,
216*74fe6c29SRuslan Bukin 	/* .flags =  */ pdff_event
217*74fe6c29SRuslan Bukin };
218*74fe6c29SRuslan Bukin 
219*74fe6c29SRuslan Bukin 
pt_df_fetch(const struct pt_decoder_function ** dfun,const uint8_t * pos,const struct pt_config * config)220*74fe6c29SRuslan Bukin int pt_df_fetch(const struct pt_decoder_function **dfun, const uint8_t *pos,
221*74fe6c29SRuslan Bukin 		const struct pt_config *config)
222*74fe6c29SRuslan Bukin {
223*74fe6c29SRuslan Bukin 	const uint8_t *begin, *end;
224*74fe6c29SRuslan Bukin 	uint8_t opc, ext, ext2;
225*74fe6c29SRuslan Bukin 
226*74fe6c29SRuslan Bukin 	if (!dfun || !config)
227*74fe6c29SRuslan Bukin 		return -pte_internal;
228*74fe6c29SRuslan Bukin 
229*74fe6c29SRuslan Bukin 	/* Clear the decode function in case of errors. */
230*74fe6c29SRuslan Bukin 	*dfun = NULL;
231*74fe6c29SRuslan Bukin 
232*74fe6c29SRuslan Bukin 	begin = config->begin;
233*74fe6c29SRuslan Bukin 	end = config->end;
234*74fe6c29SRuslan Bukin 
235*74fe6c29SRuslan Bukin 	if (!pos || (pos < begin) || (end < pos))
236*74fe6c29SRuslan Bukin 		return -pte_nosync;
237*74fe6c29SRuslan Bukin 
238*74fe6c29SRuslan Bukin 	if (pos == end)
239*74fe6c29SRuslan Bukin 		return -pte_eos;
240*74fe6c29SRuslan Bukin 
241*74fe6c29SRuslan Bukin 	opc = *pos++;
242*74fe6c29SRuslan Bukin 	switch (opc) {
243*74fe6c29SRuslan Bukin 	default:
244*74fe6c29SRuslan Bukin 		/* Check opcodes that require masking. */
245*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_tnt_8) == pt_opc_tnt_8) {
246*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tnt_8;
247*74fe6c29SRuslan Bukin 			return 0;
248*74fe6c29SRuslan Bukin 		}
249*74fe6c29SRuslan Bukin 
250*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_cyc) == pt_opc_cyc) {
251*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_cyc;
252*74fe6c29SRuslan Bukin 			return 0;
253*74fe6c29SRuslan Bukin 		}
254*74fe6c29SRuslan Bukin 
255*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_tip) == pt_opc_tip) {
256*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tip;
257*74fe6c29SRuslan Bukin 			return 0;
258*74fe6c29SRuslan Bukin 		}
259*74fe6c29SRuslan Bukin 
260*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_fup) == pt_opc_fup) {
261*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_fup;
262*74fe6c29SRuslan Bukin 			return 0;
263*74fe6c29SRuslan Bukin 		}
264*74fe6c29SRuslan Bukin 
265*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_tip) == pt_opc_tip_pge) {
266*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tip_pge;
267*74fe6c29SRuslan Bukin 			return 0;
268*74fe6c29SRuslan Bukin 		}
269*74fe6c29SRuslan Bukin 
270*74fe6c29SRuslan Bukin 		if ((opc & pt_opm_tip) == pt_opc_tip_pgd) {
271*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tip_pgd;
272*74fe6c29SRuslan Bukin 			return 0;
273*74fe6c29SRuslan Bukin 		}
274*74fe6c29SRuslan Bukin 
275*74fe6c29SRuslan Bukin 		*dfun = &pt_decode_unknown;
276*74fe6c29SRuslan Bukin 		return 0;
277*74fe6c29SRuslan Bukin 
278*74fe6c29SRuslan Bukin 	case pt_opc_pad:
279*74fe6c29SRuslan Bukin 		*dfun = &pt_decode_pad;
280*74fe6c29SRuslan Bukin 		return 0;
281*74fe6c29SRuslan Bukin 
282*74fe6c29SRuslan Bukin 	case pt_opc_mode:
283*74fe6c29SRuslan Bukin 		*dfun = &pt_decode_mode;
284*74fe6c29SRuslan Bukin 		return 0;
285*74fe6c29SRuslan Bukin 
286*74fe6c29SRuslan Bukin 	case pt_opc_tsc:
287*74fe6c29SRuslan Bukin 		*dfun = &pt_decode_tsc;
288*74fe6c29SRuslan Bukin 		return 0;
289*74fe6c29SRuslan Bukin 
290*74fe6c29SRuslan Bukin 	case pt_opc_mtc:
291*74fe6c29SRuslan Bukin 		*dfun = &pt_decode_mtc;
292*74fe6c29SRuslan Bukin 		return 0;
293*74fe6c29SRuslan Bukin 
294*74fe6c29SRuslan Bukin 	case pt_opc_ext:
295*74fe6c29SRuslan Bukin 		if (pos == end)
296*74fe6c29SRuslan Bukin 			return -pte_eos;
297*74fe6c29SRuslan Bukin 
298*74fe6c29SRuslan Bukin 		ext = *pos++;
299*74fe6c29SRuslan Bukin 		switch (ext) {
300*74fe6c29SRuslan Bukin 		default:
301*74fe6c29SRuslan Bukin 			/* Check opcodes that require masking. */
302*74fe6c29SRuslan Bukin 			if ((ext & pt_opm_ptw) == pt_ext_ptw) {
303*74fe6c29SRuslan Bukin 				*dfun = &pt_decode_ptw;
304*74fe6c29SRuslan Bukin 				return 0;
305*74fe6c29SRuslan Bukin 			}
306*74fe6c29SRuslan Bukin 
307*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_unknown;
308*74fe6c29SRuslan Bukin 			return 0;
309*74fe6c29SRuslan Bukin 
310*74fe6c29SRuslan Bukin 		case pt_ext_psb:
311*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_psb;
312*74fe6c29SRuslan Bukin 			return 0;
313*74fe6c29SRuslan Bukin 
314*74fe6c29SRuslan Bukin 		case pt_ext_ovf:
315*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_ovf;
316*74fe6c29SRuslan Bukin 			return 0;
317*74fe6c29SRuslan Bukin 
318*74fe6c29SRuslan Bukin 		case pt_ext_tnt_64:
319*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tnt_64;
320*74fe6c29SRuslan Bukin 			return 0;
321*74fe6c29SRuslan Bukin 
322*74fe6c29SRuslan Bukin 		case pt_ext_psbend:
323*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_psbend;
324*74fe6c29SRuslan Bukin 			return 0;
325*74fe6c29SRuslan Bukin 
326*74fe6c29SRuslan Bukin 		case pt_ext_cbr:
327*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_cbr;
328*74fe6c29SRuslan Bukin 			return 0;
329*74fe6c29SRuslan Bukin 
330*74fe6c29SRuslan Bukin 		case pt_ext_pip:
331*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_pip;
332*74fe6c29SRuslan Bukin 			return 0;
333*74fe6c29SRuslan Bukin 
334*74fe6c29SRuslan Bukin 		case pt_ext_tma:
335*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_tma;
336*74fe6c29SRuslan Bukin 			return 0;
337*74fe6c29SRuslan Bukin 
338*74fe6c29SRuslan Bukin 		case pt_ext_stop:
339*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_stop;
340*74fe6c29SRuslan Bukin 			return 0;
341*74fe6c29SRuslan Bukin 
342*74fe6c29SRuslan Bukin 		case pt_ext_vmcs:
343*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_vmcs;
344*74fe6c29SRuslan Bukin 			return 0;
345*74fe6c29SRuslan Bukin 
346*74fe6c29SRuslan Bukin 		case pt_ext_exstop:
347*74fe6c29SRuslan Bukin 		case pt_ext_exstop_ip:
348*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_exstop;
349*74fe6c29SRuslan Bukin 			return 0;
350*74fe6c29SRuslan Bukin 
351*74fe6c29SRuslan Bukin 		case pt_ext_mwait:
352*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_mwait;
353*74fe6c29SRuslan Bukin 			return 0;
354*74fe6c29SRuslan Bukin 
355*74fe6c29SRuslan Bukin 		case pt_ext_pwre:
356*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_pwre;
357*74fe6c29SRuslan Bukin 			return 0;
358*74fe6c29SRuslan Bukin 
359*74fe6c29SRuslan Bukin 		case pt_ext_pwrx:
360*74fe6c29SRuslan Bukin 			*dfun = &pt_decode_pwrx;
361*74fe6c29SRuslan Bukin 			return 0;
362*74fe6c29SRuslan Bukin 
363*74fe6c29SRuslan Bukin 		case pt_ext_ext2:
364*74fe6c29SRuslan Bukin 			if (pos == end)
365*74fe6c29SRuslan Bukin 				return -pte_eos;
366*74fe6c29SRuslan Bukin 
367*74fe6c29SRuslan Bukin 			ext2 = *pos++;
368*74fe6c29SRuslan Bukin 			switch (ext2) {
369*74fe6c29SRuslan Bukin 			default:
370*74fe6c29SRuslan Bukin 				*dfun = &pt_decode_unknown;
371*74fe6c29SRuslan Bukin 				return 0;
372*74fe6c29SRuslan Bukin 
373*74fe6c29SRuslan Bukin 			case pt_ext2_mnt:
374*74fe6c29SRuslan Bukin 				*dfun = &pt_decode_mnt;
375*74fe6c29SRuslan Bukin 				return 0;
376*74fe6c29SRuslan Bukin 			}
377*74fe6c29SRuslan Bukin 		}
378*74fe6c29SRuslan Bukin 	}
379*74fe6c29SRuslan Bukin }
380