|
@@ -0,0 +1,47 @@
|
|
|
+#ifndef _ASM_IA64_UACCESS_H
|
|
|
+#define _ASM_IA64_UACCESS_H
|
|
|
+
|
|
|
+/*
|
|
|
+ * This file defines various macros to transfer memory areas across
|
|
|
+ * the user/kernel boundary. This needs to be done carefully because
|
|
|
+ * this code is executed in kernel mode and uses user-specified
|
|
|
+ * addresses. Thus, we need to be careful not to let the user to
|
|
|
+ * trick us into accessing kernel memory that would normally be
|
|
|
+ * inaccessible. This code is also fairly performance sensitive,
|
|
|
+ * so we want to spend as little time doing safety checks as
|
|
|
+ * possible.
|
|
|
+ *
|
|
|
+ * To make matters a bit more interesting, these macros sometimes also
|
|
|
+ * called from within the kernel itself, in which case the address
|
|
|
+ * validity check must be skipped. The get_fs() macro tells us what
|
|
|
+ * to do: if get_fs()==USER_DS, checking is performed, if
|
|
|
+ * get_fs()==KERNEL_DS, checking is bypassed.
|
|
|
+ *
|
|
|
+ * Note that even if the memory area specified by the user is in a
|
|
|
+ * valid address range, it is still possible that we'll get a page
|
|
|
+ * fault while accessing it. This is handled by filling out an
|
|
|
+ * exception handler fixup entry for each instruction that has the
|
|
|
+ * potential to fault. When such a fault occurs, the page fault
|
|
|
+ * handler checks to see whether the faulting instruction has a fixup
|
|
|
+ * associated and, if so, sets r8 to -EFAULT and clears r9 to 0 and
|
|
|
+ * then resumes execution at the continuation point.
|
|
|
+ *
|
|
|
+ * Based on <asm-alpha/uaccess.h>.
|
|
|
+ *
|
|
|
+ * Copyright (C) 1998, 1999, 2001-2004 Hewlett-Packard Co
|
|
|
+ * David Mosberger-Tang <davidm@hpl.hp.com>
|
|
|
+ */
|
|
|
+
|
|
|
+#include <linux/compiler.h>
|
|
|
+#include <linux/errno.h>
|
|
|
+#include <linux/sched.h>
|
|
|
+#include <linux/page-flags.h>
|
|
|
+#include <linux/mm.h>
|
|
|
+
|
|
|
+#include <asm/intrinsics.h>
|
|
|
+#include <asm/pgtable.h>
|
|
|
+#include <asm/io.h>
|
|
|
+
|
|
|
+/*
|
|
|
+ * For historical reasons, the following macros are grossly misnamed:
|
|
|
+ */
|