Skip to content
  • Aaro Koskinen's avatar
    ARM: OMAP1: fix USB configuration use-after-release · 07fd296d
    Aaro Koskinen authored
    
    
    All boards, except Amstrad E3, mark USB config with __initdata.
    
    As a result, when you compile USB into modules, they will try to refer
    already released platform data and the behaviour is undefined. For example
    on Nokia 770, I get the following kernel panic when modprobing ohci-hcd:
    
    [    3.462158] Unable to handle kernel paging request at virtual address e7fddef0
    [    3.477050] pgd = c3434000
    [    3.487365] [e7fddef0] *pgd=00000000
    [    3.498535] Internal error: Oops: 80000005 [#1] ARM
    [    3.510955] Modules linked in: ohci_hcd(+)
    [    3.522705] CPU: 0    Not tainted  (3.7.0-770_tiny+ #5)
    [    3.535552] PC is at 0xe7fddef0
    [    3.546508] LR is at ohci_omap_init+0x5c/0x144 [ohci_hcd]
    [    3.560272] pc : [<e7fddef0>]    lr : [<bf003140>]    psr: a0000013
    [    3.560272] sp : c344bdb0  ip : c344bce0  fp : c344bdcc
    [    3.589782] r10: 00000001  r9 : 00000000  r8 : 00000000
    [    3.604553] r7 : 00000026  r6 : 000000de  r5 : c0227300  r4 : c342d620
    [    3.621032] r3 : e7fddef0  r2 : c048b880  r1 : 00000000  r0 : 0000000a
    [    3.637786] Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
    [    3.655822] Control: 0005317f  Table: 13434000  DAC: 00000015
    [    3.672790] Process modprobe (pid: 425, stack limit = 0xc344a1b8)
    [    3.690643] Stack: (0xc344bdb0 to 0xc344c000)
    [    3.707031] bda0:                                     bf0030e4 c342d620 00000000 c049e62c
    [    3.727905] bdc0: c344be04 c344bdd0 c0150ff0 bf0030f4 bf001b88 00000000 c048a4ac c345b020
    [    3.748870] bde0: c342d620 00000000 c048a468 bf003968 00000001 bf006000 c344be34 c344be08
    [    3.769836] be00: bf001bf0 c0150e48 00000000 c344be18 c00b9bfc c048a478 c048a4ac bf0037f8
    [    3.790985] be20: c012ca04 c000e024 c344be44 c344be38 c012d968 bf001a84 c344be64 c344be48
    [    3.812164] be40: c012c8ac c012d95c 00000000 c048a478 c048a4ac bf0037f8 c344be84 c344be68
    [    3.833740] be60: c012ca74 c012c80c 20000013 00000000 c344be88 bf0037f8 c344beac c344be88
    [    3.855468] be80: c012b038 c012ca14 c38093cc c383ee10 bf0037f8 c35be5a0 c049d5e8 00000000
    [    3.877166] bea0: c344bebc c344beb0 c012c40c c012aff4 c344beec c344bec0 c012bfc0 c012c3fc
    [    3.898834] bec0: bf00378c 00000000 c344beec bf0037f8 00067f39 00000000 00005c44 c000e024
    [    3.920837] bee0: c344bf14 c344bef0 c012cd54 c012befc c04ce080 00067f39 00000000 00005c44
    [    3.943023] bf00: c000e024 bf006000 c344bf24 c344bf18 c012db14 c012ccc0 c344bf3c c344bf28
    [    3.965423] bf20: bf00604c c012dad8 c344a000 bf003834 c344bf7c c344bf40 c00087ac bf006010
    [    3.987976] bf40: 0000000f bf003834 00067f39 00000000 00005c44 bf003834 00067f39 00000000
    [    4.010711] bf60: 00005c44 c000e024 c344a000 00000000 c344bfa4 c344bf80 c004c35c c0008720
    [    4.033569] bf80: c344bfac c344bf90 01422192 01427ea0 00000000 00000080 00000000 c344bfa8
    [    4.056518] bfa0: c000dec0 c004c2f0 01422192 01427ea0 01427ea0 00005c44 00067f39 00000000
    [    4.079406] bfc0: 01422192 01427ea0 00000000 00000080 b6e11008 014221aa be941fcc b6e1e008
    [    4.102569] bfe0: b6ef6300 be941758 0000e93c b6ef6310 60000010 01427ea0 00000000 00000000
    [    4.125946] Backtrace:
    [    4.143463] [<bf0030e4>] (ohci_omap_init+0x0/0x144 [ohci_hcd]) from [<c0150ff0>] (usb_add_hcd+0x1b8/0x61c)
    [    4.183898]  r6:c049e62c r5:00000000 r4:c342d620 r3:bf0030e4
    [    4.205596] [<c0150e38>] (usb_add_hcd+0x0/0x61c) from [<bf001bf0>] (ohci_hcd_omap_drv_probe+0x17c/0x224 [ohci_hcd])
    [    4.248138] [<bf001a74>] (ohci_hcd_omap_drv_probe+0x0/0x224 [ohci_hcd]) from [<c012d968>] (platform_drv_probe+0x1c/0x20)
    [    4.292144]  r8:c000e024 r7:c012ca04 r6:bf0037f8 r5:c048a4ac r4:c048a478
    [    4.316192] [<c012d94c>] (platform_drv_probe+0x0/0x20) from [<c012c8ac>] (driver_probe_device+0xb0/0x208)
    [    4.360168] [<c012c7fc>] (driver_probe_device+0x0/0x208) from [<c012ca74>] (__driver_attach+0x70/0x94)
    [    4.405548]  r6:bf0037f8 r5:c048a4ac r4:c048a478 r3:00000000
    [    4.429809] [<c012ca04>] (__driver_attach+0x0/0x94) from [<c012b038>] (bus_for_each_dev+0x54/0x90)
    [    4.475708]  r6:bf0037f8 r5:c344be88 r4:00000000 r3:20000013
    [    4.500366] [<c012afe4>] (bus_for_each_dev+0x0/0x90) from [<c012c40c>] (driver_attach+0x20/0x28)
    [    4.528442]  r7:00000000 r6:c049d5e8 r5:c35be5a0 r4:bf0037f8
    [    4.553466] [<c012c3ec>] (driver_attach+0x0/0x28) from [<c012bfc0>] (bus_add_driver+0xd4/0x228)
    [    4.581878] [<c012beec>] (bus_add_driver+0x0/0x228) from [<c012cd54>] (driver_register+0xa4/0x134)
    [    4.629730]  r8:c000e024 r7:00005c44 r6:00000000 r5:00067f39 r4:bf0037f8
    [    4.656738] [<c012ccb0>] (driver_register+0x0/0x134) from [<c012db14>] (platform_driver_register+0x4c/0x60)
    [    4.706542] [<c012dac8>] (platform_driver_register+0x0/0x60) from [<bf00604c>] (ohci_hcd_mod_init+0x4c/0x8c [ohci_hcd])
    [    4.757843] [<bf006000>] (ohci_hcd_mod_init+0x0/0x8c [ohci_hcd]) from [<c00087ac>] (do_one_initcall+0x9c/0x174)
    [    4.808990]  r4:bf003834 r3:c344a000
    [    4.832641] [<c0008710>] (do_one_initcall+0x0/0x174) from [<c004c35c>] (sys_init_module+0x7c/0x194)
    [    4.881530] [<c004c2e0>] (sys_init_module+0x0/0x194) from [<c000dec0>] (ret_fast_syscall+0x0/0x2c)
    [    4.930664]  r7:00000080 r6:00000000 r5:01427ea0 r4:01422192
    [    4.956481] Code: bad PC value
    [    4.978729] ---[ end trace 58280240f08342c4 ]---
    [    5.002258] Kernel panic - not syncing: Fatal exception
    
    Fix this by taking a copy of the data. Also mark Amstrad E3's data with
    __initdata to save some memory with multi-board kernels.
    
    Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    07fd296d