Re: [PATCH 20/30] microblaze_mmu_v1: uaccess MMU update

Michal Simek
2009-04-29T10:12:20Z

Andrew Morton wrote:
> On Mon, 27 Apr 2009 10:32:09 +0200 monstr@monstr.eu wrote:
>
>> +#define __clear_user(addr, n) (memset((void *)(addr), 0, (n)), 0)
>
> __clear_user() already takes a void* argument, so the cast is hopefully
> unneeded and undesirable. The same applies to many other
> architectures. If someone is passing a non-pointer type to
> __clear_user() then that's potentially a bad thing which we want to
> know about.
>

Please look at fs/signalfd.c:72. that's the reason why I need __clear_user macro
first parameter is pointer to struct signalfd_siginfo __user.

memset function has the following parameters.
void *memset(void *v_src, int c, __kernel_size_t n)

That's why is cast there. I think that I have to add __force parameter
because without it is there address space mishmash.

Without cast
CHECK fs/signalfd.c
fs/signalfd.c:72:8: warning: incorrect type in argument 1 (different address spaces)
fs/signalfd.c:72:8: expected void *<noident>
fs/signalfd.c:72:8: got struct signalfd_siginfo [noderef] <asn:1>*uinfo

With current cast (void *)
CHECK fs/signalfd.c
fs/signalfd.c:72:8: warning: cast removes address space of expression

Here is that change which remove address space problem.

#define __clear_user(addr, n) (memset((__force void *)(addr), 0, (n)), 0)

Am I right?

The same mishmash is for memset_fromio/memset_toio and maybe some others which I want to fix too.

Thanks,
Michal

> IOW, someone screwed up and everyone copied it :(
>

--
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854