aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Marchevsky <davemarchevsky@fb.com>2022-03-16 20:08:27 -0400
committerGitHub <noreply@github.com>2022-03-16 20:08:27 -0400
commit4eff6ca4607e4c22fec403cc2b1a816f3e872c55 (patch)
tree74f6b40482d7456a52928964039c69b410b0749f
parentc353d172e34f93eb281b679ee6ab3e039db0f420 (diff)
parent6dac27d90f9e11cda0864edaebddf519452a7e4b (diff)
downloadbcc-4eff6ca4607e4c22fec403cc2b1a816f3e872c55.tar.gz
Merge pull request #3880 from davemarchevsky/davemarchevsky_usdt_xmm
usdt: support xmm registers as args for x64
-rw-r--r--src/cc/usdt.h16
-rw-r--r--src/cc/usdt/usdt_args.cc75
2 files changed, 90 insertions, 1 deletions
diff --git a/src/cc/usdt.h b/src/cc/usdt.h
index 5f125882..a3d9bfe5 100644
--- a/src/cc/usdt.h
+++ b/src/cc/usdt.h
@@ -166,6 +166,22 @@ private:
X64_REG_14,
X64_REG_15,
X64_REG_RIP,
+ X64_REG_XMM0,
+ X64_REG_XMM1,
+ X64_REG_XMM2,
+ X64_REG_XMM3,
+ X64_REG_XMM4,
+ X64_REG_XMM5,
+ X64_REG_XMM6,
+ X64_REG_XMM7,
+ X64_REG_XMM8,
+ X64_REG_XMM9,
+ X64_REG_XMM10,
+ X64_REG_XMM11,
+ X64_REG_XMM12,
+ X64_REG_XMM13,
+ X64_REG_XMM14,
+ X64_REG_XMM15,
};
struct RegInfo {
diff --git a/src/cc/usdt/usdt_args.cc b/src/cc/usdt/usdt_args.cc
index c3384e16..88555c3e 100644
--- a/src/cc/usdt/usdt_args.cc
+++ b/src/cc/usdt/usdt_args.cc
@@ -69,7 +69,13 @@ bool Argument::assign_to_local(std::ostream &stream,
}
if (!deref_offset_) {
- tfm::format(stream, "%s = ctx->%s;", local_name, *base_register_name_);
+ if(base_register_name_->substr(0,3) == "xmm") {
+ // TODO: When we can read xmm registers from BPF, update this to read
+ // the actual value
+ tfm::format(stream, "%s = 0;", local_name);
+ } else {
+ tfm::format(stream, "%s = ctx->%s;", local_name, *base_register_name_);
+ }
// Put a compiler barrier to prevent optimization
// like llvm SimplifyCFG SinkThenElseCodeToEnd
// Volatile marking is not sufficient to prevent such optimization.
@@ -532,6 +538,23 @@ const std::unordered_map<std::string, ArgumentParser_x64::RegInfo>
{"r15w", {X64_REG_15, 2}}, {"r15b", {X64_REG_15, 1}},
{"rip", {X64_REG_RIP, 8}},
+
+ {"xmm0", {X64_REG_XMM0, 16}},
+ {"xmm1", {X64_REG_XMM1, 16}},
+ {"xmm2", {X64_REG_XMM2, 16}},
+ {"xmm3", {X64_REG_XMM3, 16}},
+ {"xmm4", {X64_REG_XMM4, 16}},
+ {"xmm5", {X64_REG_XMM5, 16}},
+ {"xmm6", {X64_REG_XMM6, 16}},
+ {"xmm7", {X64_REG_XMM7, 16}},
+ {"xmm8", {X64_REG_XMM8, 16}},
+ {"xmm9", {X64_REG_XMM9, 16}},
+ {"xmm10", {X64_REG_XMM10, 16}},
+ {"xmm11", {X64_REG_XMM11, 16}},
+ {"xmm12", {X64_REG_XMM12, 16}},
+ {"xmm13", {X64_REG_XMM13, 16}},
+ {"xmm14", {X64_REG_XMM14, 16}},
+ {"xmm15", {X64_REG_XMM15, 16}},
};
void ArgumentParser_x64::reg_to_name(std::string *norm, Register reg) {
@@ -590,6 +613,56 @@ void ArgumentParser_x64::reg_to_name(std::string *norm, Register reg) {
case X64_REG_RIP:
*norm = "ip";
break;
+
+ case X64_REG_XMM0:
+ *norm = "xmm0";
+ break;
+ case X64_REG_XMM1:
+ *norm = "xmm1";
+ break;
+ case X64_REG_XMM2:
+ *norm = "xmm2";
+ break;
+ case X64_REG_XMM3:
+ *norm = "xmm3";
+ break;
+ case X64_REG_XMM4:
+ *norm = "xmm4";
+ break;
+ case X64_REG_XMM5:
+ *norm = "xmm5";
+ break;
+ case X64_REG_XMM6:
+ *norm = "xmm6";
+ break;
+ case X64_REG_XMM7:
+ *norm = "xmm7";
+ break;
+ case X64_REG_XMM8:
+ *norm = "xmm8";
+ break;
+ case X64_REG_XMM9:
+ *norm = "xmm9";
+ break;
+ case X64_REG_XMM10:
+ *norm = "xmm10";
+ break;
+ case X64_REG_XMM11:
+ *norm = "xmm11";
+ break;
+ case X64_REG_XMM12:
+ *norm = "xmm12";
+ break;
+ case X64_REG_XMM13:
+ *norm = "xmm13";
+ break;
+ case X64_REG_XMM14:
+ *norm = "xmm14";
+ break;
+ case X64_REG_XMM15:
+ *norm = "xmm15";
+ break;
+
}
}