AMD IDE oops in current 2.4-ac
PATCH 1/1 AMD IDE oops in current 2.4-ac
Current 2.4.21-pre4-ac kernels oops in amd74xx.c with certain chipsets due to a table order problem. The problem is correctly detected by a BUG() in the pci probe routine, which should trigger for all non-nforce chipsets.
Regards
Andy
The fix, tested on a 7409 Viper board, is simple:
drivers/ide/pci/amd74xx.c +4 -4
@@ -54,11 +54,11 @@unsigned long base;unsigned char flags; } amd_ide_chips[] = { - { PCI_DEVICE_ID_AMD_8111_IDE, 0x00, 0x40, AMD_UDMA_100 }, /* AMD-8111 */ - { PCI_DEVICE_ID_AMD_OPUS_7441, 0x00, 0x40, AMD_UDMA_100 }, /* AMD-768 Opus */ - { PCI_DEVICE_ID_AMD_VIPER_7411, 0x00, 0x40, AMD_UDMA_100 | AMD_BAD_FIFO }, /* AMD-766 Viper */ - { PCI_DEVICE_ID_AMD_VIPER_7409, 0x00, 0x40, AMD_UDMA_66 | AMD_CHECK_SWDMA }, /* AMD-756 Viper */ { PCI_DEVICE_ID_AMD_COBRA_7401, 0x00, 0x40, AMD_UDMA_33 | AMD_BAD_SWDMA }, /* AMD-755 Cobra */ + { PCI_DEVICE_ID_AMD_VIPER_7409, 0x00, 0x40, AMD_UDMA_66 | AMD_CHECK_SWDMA }, /* AMD-756 Viper */ + { PCI_DEVICE_ID_AMD_VIPER_7411, 0x00, 0x40, AMD_UDMA_100 | AMD_BAD_FIFO }, /* AMD-766 Viper */ + { PCI_DEVICE_ID_AMD_OPUS_7441, 0x00, 0x40, AMD_UDMA_100 }, /* AMD-768 Opus */ + { PCI_DEVICE_ID_AMD_8111_IDE, 0x00, 0x40, AMD_UDMA_100 }, /* AMD-8111 */ { PCI_DEVICE_ID_NVIDIA_NFORCE_IDE, 0x00, 0x50, AMD_UDMA_100 }, /* nVidia nForce */ { PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE, 0x00, 0x50, AMD_UDMA_100 }, /* nVidia nForce */
Quoted 4 lines · Andreas Arens
Current 2.4.21-pre4-ac kernels oops in
amd74xx.cwith certain chipsets due to a table order problem. The problem is correctly detected by aBUG()in the pci probe routine, which should trigger for all non-nforce chipsets.
If moving entries in the table caused a bug, adding new entries could do the same too perhaps ? This sounds quite fragile based on your description & diff.
Dave
Signature · 2 lines
| Dave Jones. http://www.codemonkey.org.uk | SuSE Labs
PATCH 1/1 AMD IDE oops in current 2.4-ac
Quoted 9 lines · Dave Jones
Quoted 4 lines
Current 2.4.21-pre4-ac kernels oops in
amd74xx.cwith certain chipsets due to a table order problem. The problem is correctly detected by aBUG()in the pci probe routine, which should trigger for all non-nforce chipsets.If moving entries in the table caused a bug, adding new entries could do the same too perhaps ? This sounds quite fragile based on your description & diff.
amd74xx_probe() compares the pci device ids of both the probe table and the settings table, so should be save from misprogramming.
To protect against using random memory after the end of the table, a bug check on the table size could help:
if (dev->device != d->device) BUG();
+ if (sizeof(amd_ide_chips) >= id->driver_data) BUG();
if (dev->device != amd_config->id) BUG();Even with this it still looks error prone, especially since the probe table and the config table are several lines spread across the file.
Regards
Andy
Quoted 11 lines · Dave Jones
Quoted 4 lines · Andreas Arens
Current 2.4.21-pre4-ac kernels oops in
amd74xx.cwith certain chipsets due to a table order problem. The problem is correctly detected by aBUG()in the pci probe routine, which should trigger for all non-nforce chipsets.If moving entries in the table caused a bug, adding new entries could do the same too perhaps ? This sounds quite fragile based on your description & diff.
Dave
Hello, Dave and other.
Same behavior was in 2.5.5x and I've send similar patch to Linus and it was apllied. Changeset 1.879.1.84. There is two tables and missorder of devices cause a BUG() during init.
Thanks, Ruslan.