[parisc-linux] Pb with fcntl.c

Matthieu Delahaye delahaym@esiee.fr
Tue, 10 Apr 2001 20:11:12 +0200


Hi all!

while my kernel was booting, I got this dump:

Kernel Fault: Code=26 regs=10038580 (Addr=00000008)

     YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI
PSW: 00000000000001001111111100001111
r0-3     00000000 00000002 101496ec 00000000
r4-7     00000000 00000000 faf00e08 00000000
r8-11    ffffffff faf006c8 00008250 00000002
r12-15   00009b2c 00009b2c 1029860c 102e4000
r16-19   00000000 102e4580 00000000 4014907a
r20-23   00000014 00000000 00000000 ffffffff
r24-27   00000000 faf00e28 00000000 1027e010
r28-31   00000000 00000000 100387c0 10119250
sr0-3    00000000 00000002 00000000 00000002
sr4-7    00000000 00000000 00000000 00000000

IASQ: 00000000 00000000 IAOQ: 101394cc 101394d0
 IIR: 0c701085    ISR: 00000000  IOR: 00000008
ORIG_R28: 0000000f


The incriminated instruction is in the code of fput():

00000000101394b0 <fput>:
    101394b0:   6b c2 3f d9     stw rp,-14(sp)
    101394b4:   6f c6 00 80     stw,ma r6,<(sp)
    101394b8:   6b c3 3f 99     stw r3,-34(sp)
    101394bc:   08 1a 02 43     copy r26,r3
    101394c0:   6b c5 3f 89     stw r5,-3c(sp)
    101394c4:   34 74 00 28     ldo 14(r3),r20
    101394c8:   6b c4 3f 91     stw r4,-38(sp)
    101394cc:   0c 70 10 85     ldw  8(sr0,r3),r5
    101394d0:   0c 78 10 86     ldw  c(sr0,r3),r6
    101394d4:   0c b0 10 84     ldw  8(sr0,r5),r4
    101394d8:   00 01 0e 76     rsm 1,r22
    101394dc:   0e 80 10 93     ldw  0(sr0,r20),r19
    [...]

Since r3 value is 0 and since r3 is a copy of r26, which 
is arg0 according to Documentation/parisc/register, I assume
that fput as been called with a null argument.

the address 101496ec is part of sys_fcntl():

00000000101496a0 <sys_fcntl>:
    101496a0:   6b c2 3f d9     stw rp,-14(sp)
    101496a4:   6f c6 00 80     stw,ma r6,<(sp)
    101496a8:   08 18 02 46     copy r24,r6
    101496ac:   6b c5 3f 89     stw r5,-3c(sp)
    101496b0:   08 1a 02 45     copy r26,r5
    101496b4:   6b c4 3f 91     stw r4,-38(sp)
    101496b8:   08 19 02 44     copy r25,r4
    101496bc:   e8 57 1e e5     b,l 10139634 <fget>,rp
    101496c0:   6b c3 3f 99     stw r3,-34(sp)
    101496c4:   34 03 3f ef     ldi -9,r3
    101496c8:   08 05 02 5a     copy r5,r26
    101496cc:   08 04 02 59     copy r4,r25
    101496d0:   c8 9c 20 28     movb,= ret0,r4,101496ec <sys_fcntl+0x4c>
    101496d4:   08 06 02 58     copy r6,r24
    101496d8:   e8 5f 1a e5     b,l 10149450 <do_fcntl>,rp
    101496dc:   08 04 02 57     copy r4,r23
    101496e0:   08 04 02 5a     copy r4,r26
    101496e4:   e8 57 1b 8d     b,l 101394b0 <fput>,rp
    101496e8:   08 1c 02 43     copy ret0,r3
    101496ec:   08 03 02 5c     copy r3,ret0
    101496f0:   4b c2 3f 59     ldw -54(sp),rp
    101496f4:   4b c5 3f 89     ldw -3c(sp),r5
    101496f8:   4b c4 3f 91     ldw -38(sp),r4
    101496fc:   4b c3 3f 99     ldw -34(sp),r3
    10149700:   e8 40 c0 00     bv r0(rp)
    10149704:   4f c6 3f 81     ldw,mb <(sp),r6

Here, before the call of fput, r4 is copied into r26.
But at the address 101496d0, if r4 is null, there is a branch
over the call of fput()... So fput() would never have been called with
a null argument.

Does anyone have a clue of what happened? Btw, is the file "register" up
to date?    


Regards,
-- 
Matthieu Delahaye
ESIEE Team
http://mkhppa1.esiee.fr/en