2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-19 18:53:52 +08:00
linux-next/drivers/misc
Jason Wessel 486c5987a0 kgdbts: (1 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 4 processor x86 system:

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

Very soon after starting the test the kernel will oops with a message like:

kgdbts: BP mismatch 3b7da66480 expected ffffffff8106a590
WARNING: at drivers/misc/kgdbts.c:303 check_and_rewind_pc+0xe0/0x100()
Call Trace:
 [<ffffffff812994a0>] check_and_rewind_pc+0xe0/0x100
 [<ffffffff81298945>] validate_simple_test+0x25/0xc0
 [<ffffffff81298f77>] run_simple_test+0x107/0x2c0
 [<ffffffff81298a18>] kgdbts_put_char+0x18/0x20

The warn will turn to a hard kernel crash shortly after that because
the pc will not get properly rewound to the right value after hitting
a breakpoint leading to a hard lockup.

This change is broken up into 2 pieces because archs that have hw
single stepping (2.6.26 and up) need different changes than archs that
do not have hw single stepping (3.0 and up).  This change implements
the correct behavior for an arch that supports hw single stepping.

A minor defect was fixed where sys_open should be do_sys_open
for the sys_open break point test.  This solves the problem of running
a 64 bit with a 32 bit user space.  The sys_open() never gets called
when using the 32 bit file system for the kgdb testsuite because the
32 bit binaries invoke the compat_sys_open() call leading to the test
never completing.

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) if (cont_instead_of_sstep) { continue } else { single step }
7)   Check where we stopped
       if current thread != cont_thread_id {
           cont_instead_of_sstep = 1;
           goto step 5
       } else {
           cont_instead_of_sstep = 0;
       }
8) clean up and run test again if needed

Cc: stable@vger.kernel.org # >= 2.6.26
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 isl29003: fix resume functionality 2009-05-06 16:36:10 -07:00
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: (1 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