From ed1b52e6643f025d747027dec22ef036f0bd20a0 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Fri, 11 Jan 2008 13:18:16 +0900 Subject: [PATCH] --- yaml --- r: 75385 b: refs/heads/master c: d7587b1445c0087cfcaa03ceae79b52eef4e9e4b h: refs/heads/master i: 75383: 0e9c5a37f7dcac396d14f8fac64219511ff43e3a v: v3 --- [refs] | 2 +- trunk/include/asm-sh/uaccess.h | 42 ++++++++++++---------------------- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/[refs] b/[refs] index b47af9383259..978e049eb3ba 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 844b43adba74d97f15e56b103c97bfcccaa01aa6 +refs/heads/master: d7587b1445c0087cfcaa03ceae79b52eef4e9e4b diff --git a/trunk/include/asm-sh/uaccess.h b/trunk/include/asm-sh/uaccess.h index f18a1a5c95c0..77c391fa93d6 100644 --- a/trunk/include/asm-sh/uaccess.h +++ b/trunk/include/asm-sh/uaccess.h @@ -73,38 +73,26 @@ static inline int __access_ok(unsigned long addr, unsigned long size) /* * __access_ok: Check if address with size is OK or not. * - * We do three checks: - * (1) is it user space? - * (2) addr + size --> carry? - * (3) addr + size >= 0x80000000 (PAGE_OFFSET) + * Uhhuh, this needs 33-bit arithmetic. We have a carry.. * - * (1) (2) (3) | RESULT - * 0 0 0 | ok - * 0 0 1 | ok - * 0 1 0 | bad - * 0 1 1 | bad - * 1 0 0 | ok - * 1 0 1 | bad - * 1 1 0 | bad - * 1 1 1 | bad + * sum := addr + size; carry? --> flag = true; + * if (sum >= addr_limit) flag = true; */ static inline int __access_ok(unsigned long addr, unsigned long size) { - unsigned long flag, tmp; - - __asm__("stc r7_bank, %0\n\t" - "mov.l @(8,%0), %0\n\t" - "clrt\n\t" - "addc %2, %1\n\t" - "and %1, %0\n\t" - "rotcl %0\n\t" - "rotcl %0\n\t" - "and #3, %0" - : "=&z" (flag), "=r" (tmp) - : "r" (addr), "1" (size) - : "t"); - + unsigned long flag, sum; + + __asm__("clrt\n\t" + "addc %3, %1\n\t" + "movt %0\n\t" + "cmp/hi %4, %1\n\t" + "rotcl %0" + :"=&r" (flag), "=r" (sum) + :"1" (addr), "r" (size), + "r" (current_thread_info()->addr_limit.seg) + :"t"); return flag == 0; + } #endif /* CONFIG_MMU */