I'm using alsa-0.9.0_rc5 with 2.4.20-pre10-mjc2 and I get a kernel oops
in cs4281_suspend when suspeding the machine. Result of ksymoops is
attached.
Matching the disassembly with the assembly output of gcc with the same
options (also attached), it shows that the problem is in the line:
chip->suspend_regs[i] = snd_cs4281_peekBA0(chip, saved_regs[i]);
more specifically, in the inlined snd_cs4281_peekBA0() function:
return readl(chip->ba0 + offset);
I tried to add some more debugging output in cs4281_suspend to see why
this happens, but I can't get anything out of it. One thing is sure -
removing the snd-cs4281 module before suspending avoids the problem
completely.
I hope this enables you to fix the problem. Please tell me if there is
anything more I can do.
Jos� Fonseca
ksymoops 2.4.5 on i686 2.4.20-pre10-mjc2. Options used
-V (default)
-k /proc/ksyms (default)
-l /proc/modules (default)
-o /lib/modules/2.4.20-pre10-mjc2/ (default)
-m /boot/System.map (specified)
cs: cb_alloc(bus 2): vendor 0x10ec, device 0x8139
8139too Fast Ethernet driver 0.9.26
Unable to handle kernel paging request at virtual address 991b6920
cc8cc437
*pde = 00000000
Oops: 0000
CPU: 0
EIP: 0010:[<cc8cc437>] Not tainted
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010282
eax: cc8e7920 ebx: cc8ccf40 ecx: cc8cf000 edx: 00000018
esi: cbabc800 edi: 00000003 ebp: c1487ed4 esp: c1487eac
ds: 0018 es: 0018 ss: 0018
Process apmd (pid: 4914, stackpage=c1487000)
Stack: cbabcc00 cba88008 cba850c0 cc8cc512 cbabc800 cbaae460 c1487ed4 c01b4002
cba88000 00000003 c1487ef0 c01b40e1 cba88000 00000003 cba850c0 00000003
00000003 c1487f08 c01b41ce cba850c0 00000003 cba7a2e0 00000000 c1487f14
Call Trace: [<cc8cc512>] [<c01b4002>] [<c01b40e1>] [<c01b41ce>] [<c01b425f>]
[<c012404d>] [<c012410b>] [<c0110f6f>] [<c0111612>] [<c0144d76>] [<c0106fab>]
Code: 8b 04 08 89 84 96 64 01 00 00 42 eb ec ff 80 78 01 00 00 0f
>>EIP; cc8cc437 <[snd-cs4281]cs4281_suspend+67/90> <=====
>>eax; cc8e7920 <[8139too]rtl8139_pci_driver+0/27>
>>ebx; cc8ccf40 <[snd-cs4281]saved_regs+0/60>
>>ecx; cc8cf000 <[snd-cs4281].bss.end+1fe1/15041>
>>esi; cbabc800 <_end+b7fd648/c583ea8>
>>ebp; c1487ed4 <_end+11c8d1c/c583ea8>
>>esp; c1487eac <_end+11c8cf4/c583ea8>
Trace; cc8cc512 <[snd-cs4281]snd_cs4281_suspend+12/20>
Trace; c01b4002 <pci_pm_suspend_device+22/26>
Trace; c01b40e1 <pci_pm_suspend_bus+4b/66>
Trace; c01b41ce <pci_pm_suspend+22/46>
Trace; c01b425f <pci_pm_callback+2f/38>
Trace; c012404d <pm_send+61/80>
Trace; c012410b <pm_send_all+5f/8c>
Trace; c0110f6f <suspend+d/ec>
Trace; c0111612 <do_ioctl+f2/140>
Trace; c0144d76 <sys_ioctl+e4/264>
Trace; c0106fab <system_call+33/38>
Code; cc8cc437 <[snd-cs4281]cs4281_suspend+67/90>
00000000 <_EIP>:
Code; cc8cc437 <[snd-cs4281]cs4281_suspend+67/90> <=====
0: 8b 04 08 mov (%eax,%ecx,1),%eax <=====
Code; cc8cc43a <[snd-cs4281]cs4281_suspend+6a/90>
3: 89 84 96 64 01 00 00 mov %eax,0x164(%esi,%edx,4)
Code; cc8cc441 <[snd-cs4281]cs4281_suspend+71/90>
a: 42 inc %edx
Code; cc8cc442 <[snd-cs4281]cs4281_suspend+72/90>
b: eb ec jmp fffffff9 <_EIP+0xfffffff9>
Code; cc8cc444 <[snd-cs4281]cs4281_suspend+74/90>
d: ff 80 78 01 00 00 incl 0x178(%eax)
Code; cc8cc44a <[snd-cs4281]cs4281_suspend+7a/90>
13: 0f 00 00 sldtl (%eax)
[...]
.file 159 "../alsa-kernel/pci/cs4281.c"
[...]
.text
.align 2
.p2align 4,,15
.type cs4281_suspend,@function
cs4281_suspend:
.LFB47:
.loc 159 2093 0
pushl %esi
.LCFI129:
pushl %ebx
.LCFI130:
subl $4, %esp
.LCFI131:
movl 16(%esp), %esi
.loc 159 2094 0
.LBB292:
movl 44(%esi), %eax
.loc 30 115 0
.LBB293:
.LBB294:
leal 376(%eax), %ecx
.loc 30 120 0
#APP
# atomic down operation
decl 376(%eax)
js 2f
1:
.subsection 1
.ifndef .text.lock.cs4281
.text.lock.cs4281:
.endif
2: call __down_failed
jmp 1b
.previous
.loc 159 2099 0
#NO_APP
.LBE294:
.LBE293:
cmpl $768, 372(%eax)
je .L985
.loc 159 2102 0
movl 48(%esi), %eax
.loc 159 2112 0
movl $saved_regs, %ebx
.loc 159 2102 0
movl %eax, (%esp)
call snd_pcm_suspend_all_R9cd5838a
.loc 159 2112 0
xorl %edx, %edx
.loc 159 578 0
.LBB295:
movl 4(%esi), %ecx
movl 1024(%ecx), %eax
.loc 159 2105 0
.LBE295:
orl $65536, %eax
.loc 159 573 0
.LBB296:
movl %eax, 1024(%ecx)
.LBE296:
.LBB297:
movl $2, 8(%ecx)
.p2align 4,,15
.L995:
.loc 159 2113 0
.LBE297:
movl (%ebx,%edx,4), %eax
testl %eax, %eax
je .L991
.loc 159 578 0 ; cs4281.c:578
.LBB298:
movl (%eax,%ecx), %eax ; <=====
.loc 159 577 0
.LBE298:
movl %eax, 356(%esi,%edx,4)
.loc 159 2112 0
.L991:
incl %edx
jmp .L995
.L985:
.loc 30 201 0
.LBB299:
.LBB300:
#APP
# atomic up operation
incl 376(%eax)
jle 2f
1:
.subsection 1
.ifndef .text.lock.cs4281
.text.lock.cs4281:
.endif
2: call __up_wakeup
jmp 1b
.previous
.subsection 0
.loc 159 2135 0
#NO_APP
popl %eax
popl %ebx
popl %esi
ret
.LBE300:
.LBE299:
.LBE292:
.LFE47:
.Lfe47:
.size cs4281_suspend,.Lfe47-cs4281_suspend
[...]