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_ =
24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project    "@(#) $Header: /tcpdump/master/libpcap/bpf_image.c,v 1.26.2.1 2007/06/11 09:52:04 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
31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h>
33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h"
35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H
37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h"
38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectchar *
41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_image(p, n)
42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct bpf_insn *p;
43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int n;
44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int v;
46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	const char *fmt, *op;
47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static char image[256];
48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	char operand[64];
49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	v = p->k;
51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	switch (p->code) {
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	default:
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "unimp";
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "0x%x";
56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = p->code;
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_K:
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_RET|BPF_A:
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ret";
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_ABS:
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_H|BPF_ABS:
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_B|BPF_ABS:
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[%d]";
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_LEN:
85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#pktlen";
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_W|BPF_IND:
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_H|BPF_IND:
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldh";
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_B|BPF_IND:
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldb";
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "[x + %d]";
102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_IMM:
105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_IMM:
110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_MSH|BPF_B:
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldxb";
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "4*([%d]&0xf)";
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LD|BPF_MEM:
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ld";
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_LDX|BPF_MEM:
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ldx";
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ST:
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "st";
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_STX:
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "stx";
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "M[%d]";
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JA:
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "ja";
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "%d";
142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		v = n + 1 + p->k;
143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_K:
146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGE|BPF_K:
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JEQ|BPF_K:
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JSET|BPF_K:
161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGT|BPF_X:
166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jgt";
167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JGE|BPF_X:
171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jge";
172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JEQ|BPF_X:
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jeq";
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_JMP|BPF_JSET|BPF_X:
181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "jset";
182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_ADD|BPF_X:
186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_SUB|BPF_X:
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_MUL|BPF_X:
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_DIV|BPF_X:
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_AND|BPF_X:
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "and";
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_OR|BPF_X:
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "or";
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_X:
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_X:
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "x";
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_ADD|BPF_K:
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "add";
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_SUB|BPF_K:
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "sub";
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_MUL|BPF_K:
236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "mul";
237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_DIV|BPF_K:
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "div";
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_AND|BPF_K:
246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "and";
247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_OR|BPF_K:
251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "or";
252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#0x%x";
253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_LSH|BPF_K:
256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "lsh";
257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_RSH|BPF_K:
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "rsh";
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "#%d";
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_ALU|BPF_NEG:
266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "neg";
267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TAX:
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "tax";
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case BPF_MISC|BPF_TXA:
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		op = "txa";
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fmt = "";
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	(void)snprintf(operand, sizeof operand, fmt, v);
281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	(void)snprintf(image, sizeof image,
282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		      (BPF_CLASS(p->code) == BPF_JMP &&
283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		       BPF_OP(p->code) != BPF_JA) ?
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		      "(%03d) %-8s %-16s jt %d\tjf %d"
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		      : "(%03d) %-8s %s",
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		      n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return image;
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
289