aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/atmlec.h
diff options
context:
space:
mode:
authorWang Chen <wangchen@cn.fujitsu.com>2008-05-22 06:09:06 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-05-22 14:01:03 -0400
commit56cfe5d028687468f76e8b613c63ca41f209982d (patch)
treeee8b487d71659791e6d95fc90d67335e7cfb7ee3 /include/linux/atmlec.h
parent288369cc2580178ef6ed7c5c63cc1ef08c803250 (diff)
NETFRONT: Use __skb_queue_purge()
Use standard routine for queue purging. Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'include/linux/atmlec.h')
0 files changed, 0 insertions, 0 deletions
span class="hl ppc">#define __do_strncpy_from_user(dst, src, count, res) \ do { \ int w; \ asm volatile( \ " mov %1,%0\n" \ " cmp 0,%1\n" \ " beq 2f\n" \ "0:\n" \ " movbu (%5),%2\n" \ "1:\n" \ " movbu %2,(%6)\n" \ " inc %5\n" \ " inc %6\n" \ " cmp 0,%2\n" \ " beq 2f\n" \ " add -1,%1\n" \ " bne 0b\n" \ "2:\n" \ " sub %1,%0\n" \ "3:\n" \ " .section .fixup,\"ax\"\n" \ "4:\n" \ " mov %3,%0\n" \ " jmp 3b\n" \ " .previous\n" \ " .section __ex_table,\"a\"\n" \ " .balign 4\n" \ " .long 0b,4b\n" \ " .long 1b,4b\n" \ " .previous" \ :"=&r"(res), "=r"(count), "=&r"(w) \ :"i"(-EFAULT), "1"(count), "a"(src), "a"(dst) \ :"memory"); \ } while (0) long __strncpy_from_user(char *dst, const char *src, long count) { long res; __do_strncpy_from_user(dst, src, count, res); return res; } long strncpy_from_user(char *dst, const char *src, long count) { long res = -EFAULT; if (access_ok(VERIFY_READ, src, 1)) __do_strncpy_from_user(dst, src, count, res); return res; } /* * Clear a userspace memory */ #define __do_clear_user(addr, size) \ do { \ int w; \ asm volatile( \ " cmp 0,%0\n" \ " beq 1f\n" \ " clr %1\n" \ "0: movbu %1,(%3,%2)\n" \ " inc %3\n" \ " cmp %0,%3\n" \ " bne 0b\n" \ "1:\n" \ " sub %3,%0\n" \ "2:\n" \ ".section .fixup,\"ax\"\n" \ "3: jmp 2b\n" \ ".previous\n" \ ".section __ex_table,\"a\"\n" \ " .balign 4\n" \ " .long 0b,3b\n" \ ".previous\n" \ : "+r"(size), "=&r"(w) \ : "a"(addr), "d"(0) \ : "memory"); \ } while (0) unsigned long __clear_user(void *to, unsigned long n) { __do_clear_user(to, n); return n; } unsigned long clear_user(void *to, unsigned long n) { if (access_ok(VERIFY_WRITE, to, n)) __do_clear_user(to, n); return n; } /* * Return the size of a string (including the ending 0) * * Return 0 on exception, a value greater than N if too long */ long strnlen_user(const char *s, long n) { unsigned long res, w; if (!__addr_ok(s)) return 0; if (n < 0 || n + (u_long) s > current_thread_info()->addr_limit.seg) n = current_thread_info()->addr_limit.seg - (u_long)s; asm volatile( "0: cmp %4,%0\n" " beq 2f\n" "1: movbu (%0,%3),%1\n" " inc %0\n" " cmp 0,%1\n" " beq 3f\n" " bra 0b\n" "2: clr %0\n" "3:\n" ".section .fixup,\"ax\"\n" "4: jmp 2b\n" ".previous\n" ".section __ex_table,\"a\"\n" " .balign 4\n" " .long 1b,4b\n" ".previous\n" :"=d"(res), "=&r"(w) :"0"(0), "a"(s), "r"(n) :"memory"); return res; }