1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1994, 1995, 1996
3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * distributions including binary code include the above copyright notice and
9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * features or use of this software display the following acknowledgement:
12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ``This product includes software developed by the University of California,
13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the University nor the names of its contributors may be used to endorse
15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * or promote products derived from this software without specific prior
16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * written permission.
17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H
23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h"
24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap-stdinc.h>
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /* WIN32 */
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if HAVE_INTTYPES_H
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <inttypes.h>
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif HAVE_STDINT_H
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdint.h>
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_SYS_BITYPES_H
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/bitypes.h>
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* WIN32 */
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h>
42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h"
44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H
46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h"
47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectchar *
50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_image(p, n)
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	const struct bpf_insn *p;
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int n;
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int v;
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	const char *fmt, *op;
56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static char image[256];
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	char operand[64];
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	v = p->k;
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	switch (p->code) {
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	default:
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "unimp";
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "0x%x";
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = p->code;
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_K:
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_A:
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_ABS:
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_H|BPF_ABS:
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_B|BPF_ABS:
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_LEN:
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#pktlen";
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_IND:
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_H|BPF_IND:
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_B|BPF_IND:
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_IMM:
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_IMM:
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_MSH|BPF_B:
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldxb";
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "4*([%d]&0xf)";
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_MEM:
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_MEM:
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ST:
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "st";
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_STX:
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "stx";
145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JA:
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ja";
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "%d";
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = n + 1 + p->k;
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_K:
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGE|BPF_K:
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JEQ|BPF_K:
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JSET|BPF_K:
170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_X:
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGE|BPF_X:
180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JEQ|BPF_X:
185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JSET|BPF_X:
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_ADD|BPF_X:
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_SUB|BPF_X:
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_MUL|BPF_X:
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_DIV|BPF_X:
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
214d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes	case BPF_ALU|BPF_MOD|BPF_X:
215d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		op = "mod";
216d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		fmt = "x";
217d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		break;
218d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_AND|BPF_X:
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "and";
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_OR|BPF_X:
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "or";
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
229d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes	case BPF_ALU|BPF_XOR|BPF_X:
230d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		op = "xor";
231d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		fmt = "x";
232d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		break;
233d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_X:
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_X:
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_ADD|BPF_K:
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_SUB|BPF_K:
250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_MUL|BPF_K:
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_DIV|BPF_K:
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
264d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes	case BPF_ALU|BPF_MOD|BPF_K:
265d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		op = "mod";
266d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		fmt = "#%d";
267d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		break;
268d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_AND|BPF_K:
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "and";
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_OR|BPF_K:
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "or";
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
279d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes	case BPF_ALU|BPF_XOR|BPF_K:
280d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		op = "xor";
281d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		fmt = "#0x%x";
282d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes		break;
283d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_K:
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_K:
290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_NEG:
295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "neg";
296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TAX:
300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "tax";
301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TXA:
305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "txa";
306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	(void)snprintf(operand, sizeof operand, fmt, v);
310511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (BPF_CLASS(p->code) == BPF_JMP && BPF_OP(p->code) != BPF_JA) {
311511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		(void)snprintf(image, sizeof image,
312511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      "(%03d) %-8s %-16s jt %d\tjf %d",
313511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
314511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	} else {
315511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		(void)snprintf(image, sizeof image,
316511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      "(%03d) %-8s %s",
317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      n, op, operand);
318511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return image;
320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
321