bpf_image.c revision 511eca30a483e912c274e1d8ba3a0f8f081e2227
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#ifndef lint
23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ =
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    "@(#) $Header: /tcpdump/master/libpcap/bpf_image.c,v 1.28 2008-01-02 04:16:46 guy Exp $ (LBL)";
25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H
28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h"
29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap-stdinc.h>
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /* WIN32 */
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if HAVE_INTTYPES_H
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <inttypes.h>
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif HAVE_STDINT_H
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdint.h>
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_SYS_BITYPES_H
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/bitypes.h>
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* WIN32 */
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h>
47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h"
49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H
51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h"
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectchar *
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_image(p, n)
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	const struct bpf_insn *p;
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int n;
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int v;
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	const char *fmt, *op;
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static char image[256];
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	char operand[64];
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	v = p->k;
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	switch (p->code) {
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	default:
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "unimp";
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "0x%x";
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = p->code;
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_K:
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_A:
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_ABS:
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
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_H|BPF_ABS:
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
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_B|BPF_ABS:
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_LEN:
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#pktlen";
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_IND:
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
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_H|BPF_IND:
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
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_B|BPF_IND:
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_IMM:
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
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_IMM:
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_MSH|BPF_B:
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldxb";
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "4*([%d]&0xf)";
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_MEM:
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
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_LDX|BPF_MEM:
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
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_ST:
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "st";
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_STX:
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "stx";
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JA:
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ja";
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "%d";
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = n + 1 + p->k;
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_K:
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
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_JGE|BPF_K:
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
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_JEQ|BPF_K:
170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
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_JSET|BPF_K:
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_X:
180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
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_JGE|BPF_X:
185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
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_JEQ|BPF_X:
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
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_JMP|BPF_JSET|BPF_X:
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
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_ADD|BPF_X:
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
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_SUB|BPF_X:
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
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_MUL|BPF_X:
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_DIV|BPF_X:
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
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
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_X:
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_X:
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
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_ADD|BPF_K:
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_SUB|BPF_K:
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
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_MUL|BPF_K:
250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
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_DIV|BPF_K:
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
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_AND|BPF_K:
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "and";
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_OR|BPF_K:
265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "or";
266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_K:
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_K:
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_NEG:
280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "neg";
281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TAX:
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "tax";
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TXA:
290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "txa";
291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	(void)snprintf(operand, sizeof operand, fmt, v);
295511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (BPF_CLASS(p->code) == BPF_JMP && BPF_OP(p->code) != BPF_JA) {
296511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		(void)snprintf(image, sizeof image,
297511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      "(%03d) %-8s %-16s jt %d\tjf %d",
298511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
299511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	} else {
300511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		(void)snprintf(image, sizeof image,
301511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      "(%03d) %-8s %s",
302511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			      n, op, operand);
303511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return image;
305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
306