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