OpenCloudOS-Kernel/arch/arm
Arnd Bergmann 2af68df02f ARM: 6892/1: handle ptrace requests to change PC during interrupted system calls
GDB's interrupt.exp test cases currenly fail on ARM.  The problem is how do_signal
handled restarting interrupted system calls:

The entry.S assembler code determines that we come from a system call; and that
information is passed as "syscall" parameter to do_signal.  That routine then
calls get_signal_to_deliver [*] and if a signal is to be delivered, calls into
handle_signal.  If a system call is to be restarted either after the signal
handler returns, or if no handler is to be called in the first place, the PC
is updated after the get_signal_to_deliver call, either in handle_signal (if
we have a handler) or at the end of do_signal (otherwise).

Now the problem is that during [*], the call to get_signal_to_deliver, a ptrace
intercept may happen.  During this intercept, the debugger may change registers,
including the PC.  This is done by GDB if it wants to execute an "inferior call",
i.e. the execution of some code in the debugged program triggered by GDB.

To this purpose, GDB will save all registers, allocate a stack frame, set up
PC and arguments as appropriate for the call, and point the link register to
a dummy breakpoint instruction.  Once the process is restarted, it will execute
the call and then trap back to the debugger, at which point GDB will restore
all registers and continue original execution.

This generally works fine.  However, now consider what happens when GDB attempts
to do exactly that while the process was interrupted during execution of a to-be-
restarted system call:  do_signal is called with the syscall flag set; it calls
get_signal_to_deliver, at which point the debugger takes over and changes the PC
to point to a completely different place.  Now get_signal_to_deliver returns
without a signal to deliver; but now do_signal decides it should be restarting
a system call, and decrements the PC by 2 or 4 -- so it now points to 2 or 4
bytes before the function GDB wants to call -- which leads to a subsequent crash.

To fix this problem, two things need to be supported:
- do_signal must be able to recognize that get_signal_to_deliver changed the PC
  to a different location, and skip the restart-syscall sequence
- once the debugger has restored all registers at the end of the inferior call
  sequence, do_signal must recognize that *now* it needs to restart the pending
  system call, even though it was now entered from a breakpoint instead of an
  actual svc instruction

This set of issues is solved on other platforms, usually by one of two
mechanisms:

- The status information "do_signal is handling a system call that may need
  restarting" is itself carried in some register that can be accessed via
  ptrace.  This is e.g. on Intel the "orig_eax" register; on Sparc the kernel
  defines a magic extra bit in the flags register for this purpose.
  This allows GDB to manage that state: reset it when doing an inferior call,
  and restore it after the call is finished.

- On s390, do_signal transparently handles this problem without requiring
  GDB interaction, by performing system call restarting in the following
  way: first, adjust the PC as necessary for restarting the call.  Then,
  call get_signal_to_deliver; and finally just continue execution at the
  PC.  This way, if GDB does not change the PC, everything is as before.
  If GDB *does* change the PC, execution will simply continue there --
  and once GDB restores the PC it saved at that point, it will automatically
  point to the *restarted* system call.  (There is the minor twist how to
  handle system calls that do *not* need restarting -- do_signal will undo
  the PC change in this case, after get_signal_to_deliver has returned, and
  only if ptrace did not change the PC during that call.)

Because there does not appear to be any obvious register to carry the
syscall-restart information on ARM, we'd either have to introduce a new
artificial ptrace register just for that purpose, or else handle the issue
transparently like on s390.  The patch below implements the second option;
using this patch makes the interrupt.exp test cases pass on ARM, with no
regression in the GDB test suite otherwise.

Cc: patches@linaro.org
Signed-off-by: Ulrich Weigand <ulrich.weigand@linaro.org>
Signed-off-by: Arnd Bergmann <arnd.bergmann@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-05-12 10:52:00 +01:00
..
boot Merge first four commits of 'zImage_fixes' of git://git.linaro.org/people/nico/linux into fixes 2011-05-07 08:34:40 +01:00
common Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into fixes 2011-04-13 23:32:13 +01:00
configs Merge branch 'for-linus' of git://android.git.kernel.org/kernel/tegra 2011-03-24 09:33:14 -07:00
include/asm Merge branch 'kprobes' of git://git.linaro.org/people/nico/linux into fixes 2011-04-29 11:02:45 +01:00
kernel ARM: 6892/1: handle ptrace requests to change PC during interrupted system calls 2011-05-12 10:52:00 +01:00
lib Merge branches 'fixes', 'pgt-next' and 'versatile' into devel 2011-03-20 09:32:12 +00:00
mach-at91 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-bcmring Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-clps711x arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-cns3xxx ARM: P2V: separate PHYS_OFFSET from platform definitions 2011-02-17 23:26:55 +00:00
mach-davinci Merge branch 'fixes' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-05-02 12:17:05 -07:00
mach-dove arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-ebsa110 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-ep93xx Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-exynos4 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-footbridge arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-gemini arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-h720x arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-imx Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable 2011-03-28 18:52:44 +01:00
mach-integrator Merge branches 'fixes', 'pgt-next' and 'versatile' into devel 2011-03-20 09:32:12 +00:00
mach-iop13xx Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-iop32x arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-iop33x arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-ixp4xx arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-ixp23xx arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-ixp2000 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-kirkwood Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-ks8695 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-l7200/include/mach
mach-loki Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-03-17 19:08:06 -07:00
mach-lpc32xx Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-mmp ARM: mmp: align NR_BUILTIN_GPIO with gpio interrupt number 2011-04-12 23:26:39 +08:00
mach-msm Merge branch 'for-39-rc4' of git://codeaurora.org/quic/kernel/davidb/linux-msm 2011-04-18 15:44:29 -07:00
mach-mv78xx0 arm: Cleanup the irq namespace 2011-03-29 14:47:57 +02:00
mach-mx3 ARM: imx: fix usb related build failure for mach-vpr200 2011-04-12 09:47:55 +02:00
mach-mx5 ARM: mx5/mx53_loco: Fix build warning related to gpio_keys_button structure 2011-04-18 19:51:14 +02:00
mach-mxc91231 ARM: mxc91231/iomux: allow pin_list to be const 2011-03-07 19:29:28 +01:00
mach-mxs ARM: mxs/clock-mx28: fix up name##_set_rate 2011-04-12 09:48:02 +02:00
mach-netx arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-nomadik ARM: P2V: separate PHYS_OFFSET from platform definitions 2011-02-17 23:26:55 +00:00
mach-ns9xxx arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-nuc93x arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-omap1 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-omap2 Merge branch 'for_tony_a_2.6.39rc' of git://git.pwsan.com/linux-2.6 into devel-fixes 2011-04-27 06:15:27 -07:00
mach-orion5x Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-pnx4008 arm: Cleanup the irq namespace 2011-03-29 14:47:57 +02:00
mach-pxa ARM: pxa/magician: bq24022 regulator needs to be enabled 2011-04-25 12:43:47 +08:00
mach-realview ARM: 6807/1: realview: Fix secondary GIC initialisation for EB with MPCore tile 2011-03-26 10:06:08 +00:00
mach-rpc arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-s3c24a0/include/mach ARM: P2V: separate PHYS_OFFSET from platform definitions 2011-02-17 23:26:55 +00:00
mach-s3c64xx Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-s3c2400 ARM: P2V: separate PHYS_OFFSET from platform definitions 2011-02-17 23:26:55 +00:00
mach-s3c2410 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-s3c2412 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-s3c2416 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-s3c2440 Merge commit 'v2.6.39-rc3' into for-2.6.39 2011-04-18 17:12:14 +01:00
mach-s3c2443 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-s5p64x0 ARM: S5P64X0: Fix iodesc array size for S5P6450 2011-03-28 16:17:53 +09:00
mach-s5p6442 Merge branch 'p2v' into devel 2011-03-16 23:35:27 +00:00
mach-s5pc100 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-s5pv210 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-sa1100 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-shark arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-shmobile ARM: arch-shmobile: only run FSI init on respective boards 2011-04-06 11:21:38 -07:00
mach-spear3xx ARM: 6794/1: SPEAr: Append UL to device address macros. 2011-03-09 09:50:04 +00:00
mach-spear6xx ARM: 6794/1: SPEAr: Append UL to device address macros. 2011-03-09 09:50:04 +00:00
mach-stmp37xx ARM: stmp37xx: irq_data conversion. 2011-01-13 17:19:02 +01:00
mach-stmp378x ARM: stmp378x: irq_data conversion. 2011-01-13 17:19:01 +01:00
mach-tcc8k arm: Cleanup the irq namespace 2011-03-29 14:47:57 +02:00
mach-tegra Merge branch 'for-linus' of git://android.git.kernel.org/kernel/tegra 2011-04-15 20:19:17 -07:00
mach-u300 Fix common misspellings 2011-03-31 11:26:23 -03:00
mach-ux500 mach-ux500: fix i2c0 device setup regression 2011-04-20 18:43:53 +02:00
mach-versatile arm: versatile : Fix typo introduced in irq namespace cleanup 2011-03-30 12:02:15 +02:00
mach-vexpress ARM: 6771/1: vexpress: add support for multiple core tiles 2011-03-20 09:32:21 +00:00
mach-vt8500 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mach-w90x900 arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
mm ARM: 6890/1: memmap: only free allocated memmap entries when using SPARSEMEM 2011-05-12 10:52:00 +01:00
nwfpe
oprofile Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2011-02-15 10:18:48 -08:00
plat-iop Merge branch 'clksrc' into devel 2011-01-05 18:09:03 +00:00
plat-mxc Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into fixes 2011-04-27 08:43:01 +01:00
plat-nomadik arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
plat-omap Fix common misspellings 2011-03-31 11:26:23 -03:00
plat-orion arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
plat-pxa Fix common misspellings 2011-03-31 11:26:23 -03:00
plat-s3c24xx Fix common misspellings 2011-03-31 11:26:23 -03:00
plat-s5p ARM: S5P: Remove unused s3c_pm_check_resume_pin 2011-04-14 13:19:40 +09:00
plat-samsung ARM: SAMSUNG: Fix warning 's3c_pm_show_resume_irqs' defined but not used 2011-04-14 13:20:05 +09:00
plat-spear Fix common misspellings 2011-03-31 11:26:23 -03:00
plat-stmp3xxx arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
plat-tcc ARM: P2V: separate PHYS_OFFSET from platform definitions 2011-02-17 23:26:55 +00:00
plat-versatile arm: Fold irq_set_chip/irq_set_handler 2011-03-29 14:47:58 +02:00
tools ARM: Update (and cut down) mach-types 2011-03-20 18:07:44 +00:00
vfp ARM: 6868/1: Preserve the VFP state during fork 2011-04-10 21:13:37 +01:00
Kconfig Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into fixes 2011-04-13 23:32:13 +01:00
Kconfig-nommu Fix common misspellings 2011-03-31 11:26:23 -03:00
Kconfig.debug ARM: 6876/1: Kconfig.debug: Remove unused CONFIG_DEBUG_ERRORS 2011-04-14 09:15:24 +01:00
Makefile Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-03-17 19:08:06 -07:00