Blame SOURCES/rhbz1972805.patch

3e000e
commit 5409ddea1a007384b9c71a78e8dd2cbca1fc5424
3e000e
Author: Frank Ch. Eigler <fche@redhat.com>
3e000e
Date:   Thu Jul 1 14:41:06 2021 -0400
3e000e
3e000e
    rhbz1972805: add basic syscall-in-ptregs support for s390x
3e000e
    
3e000e
    Akin to commit 7be7af0fda36 for ARM, add basic syscalls via
3e000e
    tracepoints / CONTEXT->sregs support for s390x.  The argno=6 case is
3e000e
    funny because for syscalls they travel in registers, whereas normally
3e000e
    they hop onto the stack.
3e000e
3e000e
diff --git a/tapset/s390/registers.stp b/tapset/s390/registers.stp
3e000e
index b3986cdd9..cbe7e8483 100644
3e000e
--- a/tapset/s390/registers.stp
3e000e
+++ b/tapset/s390/registers.stp
3e000e
@@ -136,7 +136,10 @@ function uarch_bytes:long() {
3e000e
 function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
3e000e
 	long value;
3e000e
 	struct pt_regs *regs;
3e000e
-	regs = (CONTEXT->user_mode_p ? CONTEXT->uregs : CONTEXT->kregs);
3e000e
+	if (CONTEXT->sregs)
3e000e
+	  regs = CONTEXT->sregs;
3e000e
+	else
3e000e
+	  regs = (CONTEXT->user_mode_p ? CONTEXT->uregs : CONTEXT->kregs);
3e000e
 	if (!regs) {
3e000e
 		CONTEXT->last_error = "No registers available in this context";
3e000e
 		return;
3e000e
@@ -169,9 +172,10 @@ function _stp_sign_extend32:long (value:long) {
3e000e
 }
3e000e
 
3e000e
 function _stp_register:long (name:string, sign_extend:long) {
3e000e
-  assert(registers_valid(), "cannot access CPU registers in this context")
3e000e
+	# don't assert this: will get *regs state checked in _stp_get_register_by_offset, and better
3e000e
+	# assert(registers_valid(), "cannot access CPU registers in this context")
3e000e
 	offset = _reg_offsets[name]
3e000e
-  assert(offset != 0 || (name in _reg_offsets), "Unknown register: " . name)
3e000e
+	assert(offset != 0 || (name in _reg_offsets), "Unknown register: " . name)
3e000e
 	value = _stp_get_register_by_offset(offset)
3e000e
 	if (probing_32bit_app()) {
3e000e
 		if (sign_extend)
3e000e
@@ -235,8 +239,10 @@ function _stp_arg2:long (argnum:long, sign_extend:long, truncate:long,
3e000e
 		val = u_register("r5")
3e000e
 	else if (argnum == 5)
3e000e
 		val = u_register("r6")
3e000e
+	else if (argnum == 6 && %{ CONTEXT->sregs != NULL %} ) // linux syscall arg6 goes into r7
3e000e
+		val = u_register("r7")
3e000e
 	else if (argnum >= 6)
3e000e
-		val = _stp_get_kernel_stack_param(argnum - 6)
3e000e
+		val = _stp_get_kernel_stack_param(argnum - 6);
3e000e
 
3e000e
 	if ((truncate || @__compat_task) && !force64) {
3e000e
 		/* High bits may be garbage. */