tmp_suning_uos_patched/drivers/misc
Jason Wessel 23bbd8e346 kgdbts: (2 of 2) fix single step awareness to work correctly with SMP
The do_fork and sys_open tests have never worked properly on anything
other than a UP configuration with the kgdb test suite.  This is
because the test suite did not fully implement the behavior of a real
debugger.  A real debugger tracks the state of what thread it asked to
single step and can correctly continue other threads of execution or
conditionally stop while waiting for the original thread single step
request to return.

Below is a simple method to cause a fatal kernel oops with the kgdb
test suite on a 2 processor ARM system:

while [ 1 ] ; do ls > /dev/null 2> /dev/null; done&
while [ 1 ] ; do ls > /dev/null 2> /dev/null; done&
echo V1I1F100 > /sys/module/kgdbts/parameters/kgdbts

Very soon after starting the test the kernel will start warning with
messages like:

kgdbts: BP mismatch c002487c expected c0024878
------------[ cut here ]------------
WARNING: at drivers/misc/kgdbts.c:317 check_and_rewind_pc+0x9c/0xc4()
[<c01f6520>] (check_and_rewind_pc+0x9c/0xc4)
[<c01f595c>] (validate_simple_test+0x3c/0xc4)
[<c01f60d4>] (run_simple_test+0x1e8/0x274)

The kernel will eventually recovers, but the test suite has completely
failed to test anything useful.

This patch implements behavior similar to a real debugger that does
not rely on hardware single stepping by using only software planted
breakpoints.

In order to mimic a real debugger, the kgdb test suite now tracks the
most recent thread that was continued (cont_thread_id), with the
intent to single step just this thread.  When the response to the
single step request stops in a different thread that hit the original
break point that thread will now get continued, while the debugger
waits for the thread with the single step pending.  Here is a high
level description of the sequence of events.

   cont_instead_of_sstep = 0;

1) set breakpoint at do_fork
2) continue
3)   Save the thread id where we stop to cont_thread_id
4) Remove breakpoint at do_fork
5) Reset the PC if needed depending on kernel exception type
6) soft single step
7)   Check where we stopped
       if current thread != cont_thread_id {
           if (here for more than 2 times for the same thead) {
              ### must be a really busy system, start test again ###
	      goto step 1
           }
           goto step 5
       } else {
           cont_instead_of_sstep = 0;
       }
8) clean up and run test again if needed
9) Clear out any threads that were waiting on a break point at the
   point in time the test is ended with get_cont_catch().  This
   happens sometimes because breakpoints are used in place of single
   stepping and some threads could have been in the debugger exception
   handling queue because breakpoints were hit concurrently on
   different CPUs.  This also means we wait at least one second before
   unplumbing the debugger connection at the very end, so as respond
   to any debug threads waiting to be serviced.

Cc: stable@vger.kernel.org # >= 3.0
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
2012-03-29 17:41:24 -05:00
..
altera-stapl Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media 2011-10-31 15:42:54 -07:00
c2port c2port: class_create() returns an ERR_PTR 2012-03-05 15:49:43 -08:00
carma Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma 2012-01-17 18:40:24 -08:00
cb710 mmc: cb710 core: Add missing spin_lock_init for irq_lock of struct cb710_chip 2012-02-02 16:28:14 -08:00
eeprom eeprom_93cx6: Add write support 2011-11-26 14:59:39 -05:00
ibmasm misc latin1 to utf8 conversions 2012-01-02 13:04:55 +01:00
iwmc3200top module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
lis3lv02d module_param: check type correctness for module_param_array 2012-01-13 09:32:16 +10:30
sgi-gru switch procfs to umode_t use 2012-01-03 22:54:56 -05:00
sgi-xp net: remove NETIF_F_NO_CSUM feature bit 2011-11-16 17:43:12 -05:00
ti-st drivers:misc: ti-st: DEBUG uart, baud rate mods 2012-01-04 15:21:04 -08:00
ab8500-pwm.c mfd: Unify abx500 headers in mfd/abx500 2012-01-09 00:37:39 +01:00
ad525x_dpot-i2c.c misc: ad525x_dpot: Add support for SPI module device table matching 2011-11-18 11:27:02 -08:00
ad525x_dpot-spi.c misc: ad525x_dpot: Add support for SPI module device table matching 2011-11-18 11:27:02 -08:00
ad525x_dpot.c misc: ad525x_dpot: Add support for SPI module device table matching 2011-11-18 11:27:02 -08:00
ad525x_dpot.h Merge branch 'char-misc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc 2012-01-09 12:08:59 -08:00
apds990x.c drivers/misc/apds990x.c: apds990x_chip_on() should depend on CONFIG_PM || CONFIG_PM_RUNTIME 2011-06-15 20:04:02 -07:00
apds9802als.c drivers/misc/apds9802als.c: put the device into runtime suspend after resume()/probe() is handled 2011-03-22 17:44:10 -07:00
arm-charlcd.c tree-wide: fix comment/printk typos 2010-11-01 15:38:34 -04:00
atmel_pwm.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
atmel_tclib.c drivers/misc: Add export.h for EXPORT_SYMBOL/THIS_MODULE as required. 2011-10-31 19:31:54 -04:00
atmel-ssc.c drivers/misc: Add module.h to files who are really modular. 2011-10-31 19:31:53 -04:00
bh1770glc.c drivers/misc/bh1770glc.c: error handling in bh1770_power_state_store() 2010-11-12 07:55:31 -08:00
bh1780gli.c drivers/misc: Add module.h to files who are really modular. 2011-10-31 19:31:53 -04:00
bmp085.c BMP085: Remove redundant semi-colon from return statement 2012-01-04 15:21:56 -08:00
cs5535-mfgpt.c cs5535-mfgpt: don't call __init function from __devinit 2012-02-02 16:28:13 -08:00
ds1682.c sysfs: add struct file* to bin_attr callbacks 2010-05-21 09:37:31 -07:00
enclosure.c [SCSI] enclosure: fix error path - actually return ERR_PTR() on error 2010-07-27 12:03:48 -05:00
ep93xx_pwm.c drivers/misc/ep93xx_pwm.c: world-writable sysfs files 2011-03-22 17:44:11 -07:00
fsa9480.c driver/misc/fsa9480.c fix potential null-pointer dereference 2011-10-31 17:30:53 -07:00
hmc6352.c drivers/misc/hmc6352.c: fix wrong return value checking for i2c_master_recv() 2011-03-22 17:44:10 -07:00
hpilo.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 2010-10-22 19:36:42 -07:00
hpilo.h hpilo: fix pointer warning in ilo_ccb_setup 2010-08-09 20:45:05 -07:00
ics932s401.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ioc4.c drivers/misc/ioc4.c: fix section mismatch / race condition 2011-06-27 18:00:13 -07:00
isl29003.c
isl29020.c isl29020: Remove a redundant semi-colon from return statement 2012-01-04 15:21:56 -08:00
Kconfig drivers: misc: Remove MISC_DEVICES config option 2012-01-24 16:24:02 -08:00
kgdbts.c kgdbts: (2 of 2) fix single step awareness to work correctly with SMP 2012-03-29 17:41:24 -05:00
lkdtm.c lkdtm: avoid calling lkdtm_do_action() with spinlock held 2012-02-03 16:16:41 -08:00
Makefile misc: Add driver support for MAX8997 MUIC 2012-01-09 00:37:32 +01:00
max8997-muic.c misc: Remove max8997-muic sysfs attributes 2012-01-09 00:37:42 +01:00
pch_phub.c pch_phub: Fix MAC address writing issue for LAPIS ML7831 2011-11-15 11:01:50 -08:00
phantom.c atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
pti.c drivers/misc/pti.c: give 'comm' function scope in pti_control_frame_built_and_sent() 2011-09-14 18:09:38 -07:00
spear13xx_pcie_gadget.c pcie-gadget-spear: Add "platform:" prefix for platform modalias 2011-11-14 16:09:32 -08:00
ti_dac7512.c drivers/misc: add driver for Texas Instruments DAC7512 2009-12-15 08:53:25 -08:00
tifm_7xx1.c drivers/misc: Add module.h to files who are really modular. 2011-10-31 19:31:53 -04:00
tifm_core.c drivers/misc: Add module.h to files who are really modular. 2011-10-31 19:31:53 -04:00
tsl2550.c tsl2550: Move from i2c/chips to misc 2010-03-13 20:56:54 +01:00
vmw_balloon.c vmw_balloon: fix for a -Wuninitialized warning 2012-02-02 16:28:13 -08:00