From b6f7ffb699c08a8ecd0ff97bf828cf55831e2be0 Mon Sep 17 00:00:00 2001 From: Stan Cox Date: Fri, 8 Oct 2021 09:42:47 -0400 Subject: [PATCH] Add support for s390 floating point registers Add float registers. Add move from float register to general register. Allow an sdt argument to be a float register. --- includes/sys/sdt.h | 2 ++ runtime/loc2c-runtime.h | 7 +++++-- tapsets.cxx | 18 +++++++++++++++++- testsuite/systemtap.base/sdt_notes.exp | 5 ++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h index f757a46a1..9ecb1cb6f 100644 --- a/includes/sys/sdt.h +++ b/includes/sys/sdt.h @@ -104,6 +104,8 @@ # define STAP_SDT_ARG_CONSTRAINT norfxy # elif defined __aarch64__ # define STAP_SDT_ARG_CONSTRAINT norw +# elif defined __s390__ || defined __s390x__ +# define STAP_SDT_ARG_CONSTRAINT norf # else # define STAP_SDT_ARG_CONSTRAINT nor # endif diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index 163954e01..e6c624d37 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -306,13 +306,16 @@ #elif defined (__s390__) || defined (__s390x__) +#define _fetch_float_register(regno) \ + ({unsigned long v; __asm__ __volatile__("lgdr %[_DEST],%%f%n[_REGNO]" : [_DEST] "=r" (v): [_REGNO] "n" (-(regno-16))) ; v;}) + #undef pt_regs_fetch_register #undef pt_regs_store_register #define pt_regs_fetch_register(pt_regs,regno) \ - ((intptr_t) pt_regs->gprs[regno]) + (regno < 16 ? ((intptr_t) pt_regs->gprs[regno]) : (_fetch_float_register(regno))) #define pt_regs_store_register(pt_regs,regno,value) \ (pt_regs->gprs[regno] = (value)) -#define pt_regs_maxno 16 /* NUM_GPRS */ +#define pt_regs_maxno 32 /* NUM_GPRS */ #endif diff --git a/tapsets.cxx b/tapsets.cxx index 30352a7e9..1c82aaf69 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -6707,7 +6707,23 @@ sdt_uprobe_var_expanding_visitor::build_dwarf_registers () DRI ("%r13", 13, DI); DRI ("%r14", 14, DI); DRI ("%r15", 15, DI); - } else if (elf_machine == EM_ARM) { + DRI ("%f0", 16, DI); + DRI ("%f1", 17, DI); + DRI ("%f2", 18, DI); + DRI ("%f3", 19, DI); + DRI ("%f4", 20, DI); + DRI ("%f5", 21, DI); + DRI ("%f6", 22, DI); + DRI ("%f7", 23, DI); + DRI ("%f8", 24, DI); + DRI ("%f9", 25, DI); + DRI ("%f10", 26, DI); + DRI ("%f11", 27, DI); + DRI ("%f12", 28, DI); + DRI ("%f13", 29, DI); + DRI ("%f14", 30, DI); + DRI ("%f15", 31, DI); +} else if (elf_machine == EM_ARM) { DRI ("r0", 0, SI); DRI ("r1", 1, SI); DRI ("r2", 2, SI); diff --git a/testsuite/systemtap.base/sdt_notes.exp b/testsuite/systemtap.base/sdt_notes.exp index 5fbb2abe0..bbb9175f0 100644 --- a/testsuite/systemtap.base/sdt_notes.exp +++ b/testsuite/systemtap.base/sdt_notes.exp @@ -2,8 +2,11 @@ set test "sdt_notes" # Test layout of .note.stapsdt section and interaction with eu-readelf and gdb +set exeflags [sdt_includes] +set exeflags "$exeflags additional_flags=-O2" + set res [target_compile $srcdir/$subdir/sdt_types.c \ - sdt_types.x executable additional_flags=-O2] + sdt_types.x executable $exeflags] if { $res != "" } { verbose "target_compile failed: $res" 2 untested "$test compiling types" -- 2.43.5