|
@@ -0,0 +1,141 @@
|
|
|
|
+#ifndef _ASM_M32R_UACCESS_H
|
|
|
|
+#define _ASM_M32R_UACCESS_H
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * linux/include/asm-m32r/uaccess.h
|
|
|
|
+ *
|
|
|
|
+ * M32R version.
|
|
|
|
+ * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * User space memory access functions
|
|
|
|
+ */
|
|
|
|
+#include <linux/errno.h>
|
|
|
|
+#include <linux/thread_info.h>
|
|
|
|
+#include <asm/page.h>
|
|
|
|
+#include <asm/setup.h>
|
|
|
|
+
|
|
|
|
+#define VERIFY_READ 0
|
|
|
|
+#define VERIFY_WRITE 1
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * The fs value determines whether argument validity checking should be
|
|
|
|
+ * performed or not. If get_fs() == USER_DS, checking is performed, with
|
|
|
|
+ * get_fs() == KERNEL_DS, checking is bypassed.
|
|
|
|
+ *
|
|
|
|
+ * For historical reasons, these macros are grossly misnamed.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_MMU
|
|
|
|
+
|
|
|
|
+#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
|
|
|
+#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
|
|
|
|
+#define get_ds() (KERNEL_DS)
|
|
|
|
+#define get_fs() (current_thread_info()->addr_limit)
|
|
|
|
+#define set_fs(x) (current_thread_info()->addr_limit = (x))
|
|
|
|
+
|
|
|
|
+#else /* not CONFIG_MMU */
|
|
|
|
+
|
|
|
|
+#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
|
|
|
+#define USER_DS MAKE_MM_SEG(0xFFFFFFFF)
|
|
|
|
+#define get_ds() (KERNEL_DS)
|
|
|
|
+
|
|
|
|
+static inline mm_segment_t get_fs(void)
|
|
|
|
+{
|
|
|
|
+ return USER_DS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void set_fs(mm_segment_t s)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif /* not CONFIG_MMU */
|
|
|
|
+
|
|
|
|
+#define segment_eq(a,b) ((a).seg == (b).seg)
|
|
|
|
+
|
|
|
|
+#define __addr_ok(addr) \
|
|
|
|
+ ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg))
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Test whether a block of memory is a valid user space address.
|
|
|
|
+ * Returns 0 if the range is valid, nonzero otherwise.
|
|
|
|
+ *
|
|
|
|
+ * This is equivalent to the following test:
|
|
|
|
+ * (u33)addr + (u33)size >= (u33)current->addr_limit.seg
|
|
|
|
+ *
|
|
|
|
+ * This needs 33-bit arithmetic. We have a carry...
|
|
|
|
+ */
|
|
|
|
+#define __range_ok(addr,size) ({ \
|
|
|
|
+ unsigned long flag, roksum; \
|
|
|
|
+ __chk_user_ptr(addr); \
|
|
|
|
+ asm ( \
|
|
|
|
+ " cmpu %1, %1 ; clear cbit\n" \
|
|
|
|
+ " addx %1, %3 ; set cbit if overflow\n" \
|
|
|
|
+ " subx %0, %0\n" \
|
|
|
|
+ " cmpu %4, %1\n" \
|
|
|
|
+ " subx %0, %5\n" \
|
|
|
|
+ : "=&r" (flag), "=r" (roksum) \
|
|
|
|
+ : "1" (addr), "r" ((int)(size)), \
|
|
|
|
+ "r" (current_thread_info()->addr_limit.seg), "r" (0) \
|
|
|
|
+ : "cbit" ); \
|
|
|
|
+ flag; })
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * access_ok: - Checks if a user space pointer is valid
|
|
|
|
+ * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that
|
|
|
|
+ * %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe
|
|
|
|
+ * to write to a block, it is always safe to read from it.
|
|
|
|
+ * @addr: User space pointer to start of block to check
|
|
|
|
+ * @size: Size of block to check
|
|
|
|
+ *
|
|
|
|
+ * Context: User context only. This function may sleep.
|
|
|
|
+ *
|
|
|
|
+ * Checks if a pointer to a block of memory in user space is valid.
|
|
|
|
+ *
|
|
|
|
+ * Returns true (nonzero) if the memory block may be valid, false (zero)
|
|
|
|
+ * if it is definitely invalid.
|
|
|
|
+ *
|
|
|
|
+ * Note that, depending on architecture, this function probably just
|
|
|
|
+ * checks that the pointer is in the user space range - after calling
|
|
|
|
+ * this function, memory access functions may still return -EFAULT.
|
|
|
|
+ */
|
|
|
|
+#ifdef CONFIG_MMU
|
|
|
|
+#define access_ok(type,addr,size) (likely(__range_ok(addr,size) == 0))
|
|
|
|
+#else
|
|
|
|
+static inline int access_ok(int type, const void *addr, unsigned long size)
|
|
|
|
+{
|
|
|
|
+ unsigned long val = (unsigned long)addr;
|
|
|
|
+
|
|
|
|
+ return ((val >= memory_start) && ((val + size) < memory_end));
|
|
|
|
+}
|
|
|
|
+#endif /* CONFIG_MMU */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * The exception table consists of pairs of addresses: the first is the
|
|
|
|
+ * address of an instruction that is allowed to fault, and the second is
|
|
|
|
+ * the address at which the program should continue. No registers are
|
|
|
|
+ * modified, so it is entirely up to the continuation code to figure out
|
|
|
|
+ * what to do.
|
|
|
|
+ *
|
|
|
|
+ * All the routines below use bits of fixup code that are out of line
|
|
|
|
+ * with the main instruction path. This means when everything is well,
|
|
|
|
+ * we don't even have to jump over them. Further, they do not intrude
|
|
|
|
+ * on our cache or tlb entries.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+struct exception_table_entry
|
|
|
|
+{
|
|
|
|
+ unsigned long insn, fixup;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+extern int fixup_exception(struct pt_regs *regs);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * These are the main single-value transfer routines. They automatically
|
|
|
|
+ * use the right size if we just have the right pointer type.
|
|
|
|
+ *
|
|
|
|
+ * This gets kind of ugly. We want to return _two_ values in "get_user()"
|
|
|
|
+ * and yet we don't want to do any pointers, because that is too much
|