From 98121a3e21700230694c772b1cc479bcb918263e Mon Sep 17 00:00:00 2001 From: Zvonko Kosic Date: Tue, 7 Mar 2017 07:30:25 +0100 Subject: [PATCH] Added s390x support. Needs 4.10 Kernel --- src/cc/export/helpers.h | 11 +++++++++++ src/cc/frontends/clang/b_frontend_action.cc | 6 ++++++ src/cc/frontends/clang/loader.cc | 2 ++ src/cc/libbpf.c | 2 ++ 4 files changed, 21 insertions(+) diff --git a/src/cc/export/helpers.h b/src/cc/export/helpers.h index 1fa20a5..ea8c92d 100644 --- a/src/cc/export/helpers.h +++ b/src/cc/export/helpers.h @@ -468,6 +468,17 @@ int bpf_usdt_readarg_p(int argc, struct pt_regs *ctx, void *buf, u64 len) asm("l #define PT_REGS_RC(ctx) ((ctx)->gpr[3]) #define PT_REGS_IP(ctx) ((ctx)->nip) #define PT_REGS_SP(ctx) ((ctx)->sp) +#elif defined(__s390x__) +#define PT_REGS_PARM1(x) ((x)->gprs[2]) +#define PT_REGS_PARM2(x) ((x)->gprs[3]) +#define PT_REGS_PARM3(x) ((x)->gprs[4]) +#define PT_REGS_PARM4(x) ((x)->gprs[5]) +#define PT_REGS_PARM5(x) ((x)->gprs[6]) +#define PT_REGS_RET(x) ((x)->gprs[14]) +#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */ +#define PT_REGS_RC(x) ((x)->gprs[2]) +#define PT_REGS_SP(x) ((x)->gprs[15]) +#define PT_REGS_IP(x) ((x)->psw.addr) #elif defined(__x86_64__) #define PT_REGS_PARM1(ctx) ((ctx)->di) #define PT_REGS_PARM2(ctx) ((ctx)->si) diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc index 206ec00..0afa87f 100644 --- a/src/cc/frontends/clang/b_frontend_action.cc +++ b/src/cc/frontends/clang/b_frontend_action.cc @@ -39,11 +39,17 @@ const char *calling_conv_regs_x86[] = { }; const char *calling_conv_regs_ppc[] = {"gpr[3]", "gpr[4]", "gpr[5]", "gpr[6]", "gpr[7]", "gpr[8]"}; + +const char *calling_conv_regs_s390x[] = {"gprs[2]", "gprs[3]", "gprs[4]", + "gprs[5]", "gprs[6]" }; + const char *calling_conv_regs_arm64[] = {"regs[0]", "regs[1]", "regs[2]", "regs[3]", "regs[4]", "regs[5]"}; // todo: support more archs #if defined(__powerpc__) const char **calling_conv_regs = calling_conv_regs_ppc; +#elif defined(__s390x__) +const char **calling_conv_regs = calling_conv_regs_s390x; #elif defined(__aarch64__) const char **calling_conv_regs = calling_conv_regs_arm64; #else diff --git a/src/cc/frontends/clang/loader.cc b/src/cc/frontends/clang/loader.cc index 7bc7d8f..99cd4e2 100644 --- a/src/cc/frontends/clang/loader.cc +++ b/src/cc/frontends/clang/loader.cc @@ -172,6 +172,8 @@ int ClangLoader::parse(unique_ptr *mod, unique_ptr