X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fkernel%2Fskas%2Fuaccess.c;h=ea82f19b2d795b134b8029d4e25e1ea02e48c7fc;hb=902d44426afe46356253fe93d8cef2b4d9f236f3;hp=d7ff0b914a05b62b61d8823758589bd5541ce8fb;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/arch/um/kernel/skas/uaccess.c b/arch/um/kernel/skas/uaccess.c index d7ff0b914..ea82f19b2 100644 --- a/arch/um/kernel/skas/uaccess.c +++ b/arch/um/kernel/skas/uaccess.c @@ -12,7 +12,6 @@ #include "asm/pgtable.h" #include "asm/uaccess.h" #include "kern_util.h" -#include "user_util.h" extern void *um_virt_to_phys(struct task_struct *task, unsigned long addr, pte_t *pte_out); @@ -26,7 +25,7 @@ static unsigned long maybe_map(unsigned long virt, int is_write) int dummy_code; if(IS_ERR(phys) || (is_write && !pte_write(pte))){ - err = handle_page_fault(virt, 0, is_write, 1, &dummy_code); + err = handle_page_fault(virt, 0, is_write, 0, &dummy_code); if(err) return(0); phys = um_virt_to_phys(current, virt, NULL); @@ -52,67 +51,37 @@ static int do_op(unsigned long addr, int len, int is_write, return(n); } -static void do_buffer_op(void *jmpbuf, void *arg_ptr) +static int buffer_op(unsigned long addr, int len, int is_write, + int (*op)(unsigned long addr, int len, void *arg), + void *arg) { - va_list args = *((va_list *) arg_ptr); - unsigned long addr = va_arg(args, unsigned long); - int len = va_arg(args, int); - int is_write = va_arg(args, int); - int (*op)(unsigned long, int, void *) = va_arg(args, void *); - void *arg = va_arg(args, void *); - int *res = va_arg(args, int *); int size = min(PAGE_ALIGN(addr) - addr, (unsigned long) len); int remain = len, n; - current->thread.fault_catcher = jmpbuf; n = do_op(addr, size, is_write, op, arg); - if(n != 0){ - *res = (n < 0 ? remain : 0); - goto out; - } + if(n != 0) + return(n < 0 ? remain : 0); addr += size; remain -= size; - if(remain == 0){ - *res = 0; - goto out; - } + if(remain == 0) + return(0); while(addr < ((addr + remain) & PAGE_MASK)){ n = do_op(addr, PAGE_SIZE, is_write, op, arg); - if(n != 0){ - *res = (n < 0 ? remain : 0); - goto out; - } + if(n != 0) + return(n < 0 ? remain : 0); addr += PAGE_SIZE; remain -= PAGE_SIZE; } - if(remain == 0){ - *res = 0; - goto out; - } + if(remain == 0) + return(0); n = do_op(addr, remain, is_write, op, arg); if(n != 0) - *res = (n < 0 ? remain : 0); - else *res = 0; - out: - current->thread.fault_catcher = NULL; -} - -static int buffer_op(unsigned long addr, int len, int is_write, - int (*op)(unsigned long addr, int len, void *arg), - void *arg) -{ - int faulted, res; - - faulted = setjmp_wrapper(do_buffer_op, addr, len, is_write, op, arg, - &res); - if(!faulted) - return(res); - - return(addr + len - (unsigned long) current->thread.fault_addr); + return(n < 0 ? remain : 0); + return(0); } static int copy_chunk_from_user(unsigned long from, int len, void *arg)