18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * User address space access functions. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * For licencing details see kernel-base/COPYING 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 88c2ecf20Sopenharmony_ci#include <linux/export.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <asm/tlbflush.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* 138c2ecf20Sopenharmony_ci * We rely on the nested NMI work to allow atomic faults from the NMI path; the 148c2ecf20Sopenharmony_ci * nested NMI paths are careful to preserve CR2. 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ciunsigned long 178c2ecf20Sopenharmony_cicopy_from_user_nmi(void *to, const void __user *from, unsigned long n) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci unsigned long ret; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci if (__range_not_ok(from, n, TASK_SIZE)) 228c2ecf20Sopenharmony_ci return n; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci if (!nmi_uaccess_okay()) 258c2ecf20Sopenharmony_ci return n; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci /* 288c2ecf20Sopenharmony_ci * Even though this function is typically called from NMI/IRQ context 298c2ecf20Sopenharmony_ci * disable pagefaults so that its behaviour is consistent even when 308c2ecf20Sopenharmony_ci * called form other contexts. 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci pagefault_disable(); 338c2ecf20Sopenharmony_ci ret = __copy_from_user_inatomic(to, from, n); 348c2ecf20Sopenharmony_ci pagefault_enable(); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci return ret; 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(copy_from_user_nmi); 39