On Mon, 3 Mar 2003, Steven J. Hill wrote:
> I am having some issues using 'copy_from_user' in a driver. The issue
> is that instead of returning a EFAULT for a bad address, it throws a
> kernel panic and then proceeds to segfault the application. I am doing
> a test on the module where I pass in an invalid user source address:
>
> copy_from_user(&dst, src, sizeof(dst));
>
> where 'src' is equal to '0xa'. Now for the interesting part. When it
> goes to do the copy, in 'arch/mips/lib/memcpy.S' it correctly jumps
> to 'src_unaligned_dst_aligned' and then to 'cleanup_src_unaligned'
> and we have the following code:
>
> 8025f004 <cleanup_src_unaligned>:
> 8025f004: 10c00017 beqz a2,8025f064 <done>
> 8025f008: 30d80003 andi t8,a2,0x3
> 8025f00c: 13060009 beq t8,a2,8025f034 <copy_bytes>
> 8025f010: 88a80000 lwl t0,0(a1)
>
> The instruction at 8025f00c is the offending instruction, however, the
^^^^^^^^
Don't you mean 8025f010?
> kernel oops that kills the process shows:
>
> Unable to handle kernel paging request at virtual address 0000000a,
> epc == 8025f00c, ra == 8011c3c8
> Oops in fault.c:do_page_fault, line 199:
> $0 : 00000000 00000012 0000001a 0000001a 87887f10 0000000a 00000008
> 00000001
> $8 : 00000000 00000000 00000000 00001116 802ec2f0 fffffffe ffffffff
> 00000010
> $16: 0000000a 7fff7d68 87887f10 00000000 004009b4 00000000 00000000
> 00000000
> $24: 00000000 87887e18 87886000 87887f00 7fff7d30
> 8011c3c8
> Hi : 00000000
> Lo : 00000000
> epc : 8025f00c Not tainted
> Status: 3000fc03
> Cause : 90000008
>
> I am using the last version of the 2.4.18 Linux/MIPS kernel. It looks
> like there was a possible fix for this in 'arch/mips/kernel/unaligned.c'
> by Ralf, but it did not seem to work. Any thoughts on this?
This looks like the unaligned access in a branch delay slot problem I
experienced a while ago, where the CPU doesn't set the BD flag if the branch is
not taken. Can you please try the patch I posted?
BTW, what kind of CPU is this? A VR41xx?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
|