Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3149

kernel-2.6.18-194.11.1.el5.src.rpm

From: Hendrik Brueckner <brueckner@redhat.com>
Date: Tue, 24 Nov 2009 10:04:31 -0500
Subject: [s390] kernel: fix single stepping on svc0
Message-id: <20091124100431.GA31573@redhat.com>
Patchwork-id: 21473
O-Subject: [RHEL5 U5 PATCH 1/1] s390 - kernel: fix single stepping on svc0
Bugzilla: 540527
RH-Acked-by: Jon Masters <jcm@redhat.com>
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
RH-Acked-by: Pete Zaitcev <zaitcev@redhat.com>

Description
===========
If a system call number > 256 is single stepped or svc 0
is single stepped the system call is not executed.

The per svc handling uses register 1 for the thread pointer
before calling the core system call handler.  The problem is,
that the core system call handler still needs the old content
of register r1 in case of an svc 0 instruction.
Since r1 contains a high value (pointer) the system call
returns ENOSYS.

The solution is to use the unused register r8 instead of r1
for the scvper helper function.

Bugzilla
========
BZ 540527
https://bugzilla.redhat.com/show_bug.cgi?id=540527

Upstream status of the patch
============================
The patch is upstream as of kernel version 2.6.32
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=bcc6525fb23d2cec7ffdf908d98826a66823bcb2

Test status
===========
The patch has been tested and fixes the problem.
The fix has been verified by the IBM test department.

Signed-off-by: Don Zickus <dzickus@redhat.com>

diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 35a1aa1..520a112 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -529,10 +529,10 @@ pgm_no_vtime3:
 #endif
 	lh	%r7,0x8a		# get svc number from lowcore
 	l	%r9,__LC_THREAD_INFO	# load pointer to thread_info struct
-	l	%r1,__TI_task(%r9)
-	mvc	__THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID
-	mvc	__THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS
-	mvc	__THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
+	l	%r8,__TI_task(%r9)
+	mvc	__THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID
+	mvc	__THREAD_per+__PER_address(4,%r8),__LC_PER_ADDRESS
+	mvc	__THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
 	oi	__TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
 	TRACE_IRQS_ON
 	stosm	__SF_EMPTY(%r15),0x03	# reenable interrupts
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S
index 082b6cd..f1438fd 100644
--- a/arch/s390/kernel/entry64.S
+++ b/arch/s390/kernel/entry64.S
@@ -546,10 +546,10 @@ pgm_no_vtime3:
 #endif
 	llgh    %r7,__LC_SVC_INT_CODE	# get svc number from lowcore
 	lg	%r9,__LC_THREAD_INFO	# load pointer to thread_info struct
-	lg	%r1,__TI_task(%r9)
-	mvc	__THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID
-	mvc	__THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS
-	mvc	__THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
+	lg	%r8,__TI_task(%r9)
+	mvc	__THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID
+	mvc	__THREAD_per+__PER_address(8,%r8),__LC_PER_ADDRESS
+	mvc	__THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
 	oi	__TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
 	TRACE_IRQS_ON
 	stosm	__SF_EMPTY(%r15),0x03	# reenable interrupts