|
|
e4e640 |
From 7b8a9050aa8666e29d19f2eea9917afa72fe00ae Mon Sep 17 00:00:00 2001
|
|
|
e4e640 |
From: Serhei Makarov <smakarov@redhat.com>
|
|
|
e4e640 |
Date: Mon, 5 Nov 2018 16:58:21 -0500
|
|
|
e4e640 |
Subject: [PATCH 20/32] PR23860 partial fix: fix BPF_NEG opcode generation.
|
|
|
e4e640 |
|
|
|
e4e640 |
Plus some improved diagnostics on malformed code.
|
|
|
e4e640 |
|
|
|
e4e640 |
* bpf-base.cxx (value::print): Don't abort() on unknown operand.
|
|
|
e4e640 |
(opcode_name): Don't abort() on unknown opcode.
|
|
|
e4e640 |
(insn::print): Don't abort() on malformed insn.
|
|
|
e4e640 |
(program::mk_binary): Ensure BPF_NEG src==dest, don't use BPF_X.
|
|
|
e4e640 |
---
|
|
|
e4e640 |
bpf-base.cxx | 15 ++++++++++-----
|
|
|
e4e640 |
1 file changed, 10 insertions(+), 5 deletions(-)
|
|
|
e4e640 |
|
|
|
e4e640 |
diff --git a/bpf-base.cxx b/bpf-base.cxx
|
|
|
e4e640 |
index 210efa9aa..24b610cf3 100644
|
|
|
e4e640 |
--- a/bpf-base.cxx
|
|
|
e4e640 |
+++ b/bpf-base.cxx
|
|
|
e4e640 |
@@ -32,7 +32,7 @@ value::print(std::ostream &o) const
|
|
|
e4e640 |
case TMPREG:
|
|
|
e4e640 |
return o << "t" << reg_val;
|
|
|
e4e640 |
default:
|
|
|
e4e640 |
- abort();
|
|
|
e4e640 |
+ return o << "<BUG:unknown operand>";
|
|
|
e4e640 |
}
|
|
|
e4e640 |
}
|
|
|
e4e640 |
|
|
|
e4e640 |
@@ -359,7 +359,7 @@ opcode_name(opcode op)
|
|
|
e4e640 |
case BPF_JMP | BPF_JSET | BPF_K: opn = "jsetk"; break;
|
|
|
e4e640 |
|
|
|
e4e640 |
default:
|
|
|
e4e640 |
- abort();
|
|
|
e4e640 |
+ opn = "<BUG:unknown opcode>";
|
|
|
e4e640 |
}
|
|
|
e4e640 |
|
|
|
e4e640 |
return opn;
|
|
|
e4e640 |
@@ -457,7 +457,7 @@ insn::print(std::ostream &o) const
|
|
|
e4e640 |
return o << opn << "\t" << *src0 << "," << *src1;
|
|
|
e4e640 |
|
|
|
e4e640 |
default:
|
|
|
e4e640 |
- abort ();
|
|
|
e4e640 |
+ return o << "<BUG:unknown instruction format>";
|
|
|
e4e640 |
}
|
|
|
e4e640 |
}
|
|
|
e4e640 |
|
|
|
e4e640 |
@@ -705,10 +705,15 @@ program::mk_binary(insn_inserter &ins, opcode op, value *dest,
|
|
|
e4e640 |
void
|
|
|
e4e640 |
program::mk_unary(insn_inserter &ins, opcode op, value *dest, value *src)
|
|
|
e4e640 |
{
|
|
|
e4e640 |
+ assert (op == BPF_NEG); // XXX: BPF_NEG is the only unary operator so far.
|
|
|
e4e640 |
+
|
|
|
e4e640 |
+ if (dest != src) // src is not used for BPF_NEG. BPF negates in-place.
|
|
|
e4e640 |
+ mk_mov(ins, dest, src);
|
|
|
e4e640 |
+
|
|
|
e4e640 |
insn *i = ins.new_insn();
|
|
|
e4e640 |
- i->code = BPF_ALU64 | BPF_X | op;
|
|
|
e4e640 |
+ i->code = BPF_ALU64 | op; // BPF_X is not used for BPF_NEG.
|
|
|
e4e640 |
i->dest = dest;
|
|
|
e4e640 |
- i->src0 = src;
|
|
|
e4e640 |
+ i->src0 = dest; // XXX: dest as an ersatz 'source'.
|
|
|
e4e640 |
}
|
|
|
e4e640 |
|
|
|
e4e640 |
void
|
|
|
e4e640 |
--
|
|
|
e4e640 |
2.14.5
|
|
|
e4e640 |
|