static int do_op_one_page(unsigned long addr, int len, int is_write, int (*op)(unsigned long addr, int len, void *arg), void *arg) { jmp_buf buf; struct page *page; pte_t *pte; int n, faulted; pte = maybe_map(addr, is_write); if (pte == NULL) return -1; page = pte_page(*pte); addr = (unsigned long) kmap_atomic(page, KM_UML_USERCOPY) + (addr & ~PAGE_MASK); current->thread.fault_catcher = &buf; faulted = UML_SETJMP(&buf); if (faulted == 0) n = (*op)(addr, len, arg); else n = -1; current->thread.fault_catcher = NULL; kunmap_atomic(page, KM_UML_USERCOPY); return n; }
static int do_op_one_page(unsigned long addr, int len, int is_write, int (*op)(unsigned long addr, int len, void *arg), void *arg) { jmp_buf buf; struct page *page; pte_t *pte; int n; pte = maybe_map(addr, is_write); if (pte == NULL) return -1; page = pte_page(*pte); #ifdef CONFIG_64BIT pagefault_disable(); addr = (unsigned long) page_address(page) + (addr & ~PAGE_MASK); #else addr = (unsigned long) kmap_atomic(page) + (addr & ~PAGE_MASK); #endif n = (*op)(addr, len, arg); #ifdef CONFIG_64BIT pagefault_enable(); #else kunmap_atomic((void *)addr); #endif return n; }
static int do_op(unsigned long addr, int len, int is_write, int (*op)(unsigned long addr, int len, void *arg), void *arg) { struct page *page; int n; addr = maybe_map(addr, is_write); if(addr == -1UL) return(-1); page = phys_to_page(addr); addr = (unsigned long) kmap(page) + (addr & ~PAGE_MASK); n = (*op)(addr, len, arg); kunmap(page); return(n); }