Re: [PATCH] i386 uaccess to fixmap pages

From: Andrew Morton (akpm@digeo.com)
Date: Thu May 08 2003 - 23:31:19 EST


Roland McGrath <roland@redhat.com> wrote:
>
> This patch against 2.5.69 makes uaccess (i.e., access_ok and get/put_user)
> to user-accessible fixmap addresses on x86 work.

This doesn't apply against Linus's current tree.

> -#define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
> +#define access_ok(type,addr,size) (__range_ok(addr,size) == 0 || \
> + __fixmap_access_ok((unsigned long)(addr), \
> + (size), (type)))

Your patch increases the kernel text by nearly 1%. That's rather a lot for
what is a fairly esoteric feature.

   text data bss dec hex filename
2805911 592912 732516 4131339 3f0a0b /tmp/vmlinux
2825167 592982 732516 4150665 3f5589 vmlinux

Would it be possible to avoid this by just taking the fault and fixing
things up in the exception handler?

> #else
>
> -#define access_ok(type,addr,size) ( (__range_ok(addr,size) == 0) && \
> +#define access_ok(type,addr,size) ((__range_ok(addr,size) == 0) ? \
> ((type) == VERIFY_READ || boot_cpu_data.wp_works_ok || \
> - __verify_write((void *)(addr),(size))))
> + __verify_write((void *)(addr),(size))) : \
> + __fixmap_access_ok((unsigned long)(addr),size,type))

You'll be wanting to parenthesise `size' and `type' here.

For some reason the patch causes gcc-2.95.3 to choke over the

        __put_user(d_off, &lastdirent->d_off);

statement in sys_getdents64().

fs/readdir.c: In function `sys_getdents64':
fs/readdir.c:285: internal error--unrecognizable insn:
(insn 138 212 147 (set (reg:SI 3 %ebx)
        (asm_operands/v ("1: movl %%eax,0(%2)
2: movl %%edx,4(%2)
3:
.section .fixup,"ax"
4: movl %3,%0
        jmp 3b
.previous
.section __ex_table,"a"
        .align 4
        .long 1b,4b
        .long 2b,4b
.previous") ("=r") 0[
                (reg:DI 1 %edx)
                (reg:SI 0 %eax)
                (const_int -14 [0xfffffff2])
                (reg:SI 3 %ebx)
            ]
            [
                (asm_input:DI ("A"))
                (asm_input:SI ("r"))
                (asm_input:SI ("i"))
                (asm_input:SI ("0"))
            ] ("fs/readdir.c") 277)) -1 (insn_list 112 (insn_list 119 (insn_list 137 (nil))))
    (nil))
make[1]: *** [fs/readdir.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [fs] Error 2
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu May 15 2003 - 22:00:30 EST