Blame SOURCES/rhbz1643997.0020-PR23860-partial-fix-fix-BPF_NEG-opcode-generation.patch

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