151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* 251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Authors: Hans-Peter Nilsson (hp@axis.com) 351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#ifndef _CRIS_ARCH_UACCESS_H 651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define _CRIS_ARCH_UACCESS_H 751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* 951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * We don't tell gcc that we are accessing memory, but this is OK 1051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * because we do not write to any memory gcc knows about, so there 1151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * are no aliasing issues. 1251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 1351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Note that PC at a fault is the address *at* the faulting 1451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * instruction for CRISv32. 1551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 1651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __put_user_asm(x, addr, err, op) \ 1751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__( \ 1851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: "op" %1,[%2]\n" \ 1951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4:\n" \ 2051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 2151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: move.d %3,%0\n" \ 2251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 4b\n" \ 2351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " nop\n" \ 2451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 2551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 2651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n" \ 2751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 2851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (err) \ 2951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "r" (x), "r" (addr), "g" (-EFAULT), "0" (err)) 3051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 3151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __put_user_asm_64(x, addr, err) do { \ 3251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik int dummy_for_put_user_asm_64_; \ 3351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__( \ 3451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.d %M2,[%1+]\n" \ 3551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.d %H2,[%1]\n" \ 3651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5:\n" \ 3751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 3851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: move.d %4,%0\n" \ 3951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 5b\n" \ 4051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 4151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 4251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n" \ 4351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,3b\n" \ 4451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 4551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (err), "=b" (dummy_for_put_user_asm_64_) \ 4651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "r" (x), "1" (addr), "g" (-EFAULT), \ 4751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "0" (err)); \ 4851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } while (0) 4951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 5051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* See comment before __put_user_asm. */ 5151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 5251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __get_user_asm(x, addr, err, op) \ 5351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__( \ 5451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: "op" [%2],%1\n" \ 5551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4:\n" \ 5651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 5751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: move.d %3,%0\n" \ 5851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 4b\n" \ 5951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " moveq 0,%1\n" \ 6051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 6151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 6251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n" \ 6351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 6451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (err), "=r" (x) \ 6551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "r" (addr), "g" (-EFAULT), "0" (err)) 6651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 6751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __get_user_asm_64(x, addr, err) do { \ 6851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik int dummy_for_get_user_asm_64_; \ 6951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__( \ 7051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.d [%2+],%M1\n" \ 7151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.d [%2],%H1\n" \ 7251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5:\n" \ 7351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 7451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: move.d %4,%0\n" \ 7551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 5b\n" \ 7651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " moveq 0,%1\n" \ 7751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 7851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 7951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n" \ 8051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,3b\n" \ 8151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 8251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (err), "=r" (x), \ 8351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "=b" (dummy_for_get_user_asm_64_) \ 8451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "2" (addr), "g" (-EFAULT), "0" (err));\ 8551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } while (0) 8651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 8751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* 8851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Copy a null terminated string from userspace. 8951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 9051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Must return: 9151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * -EFAULT for an exception 9251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * count if we hit the buffer limit 9351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * bytes copied if we hit a null byte 9451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * (without the null byte) 9551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 96d9b5444eeb3a663ca4a625878b1421c9e9b18e8bAdrian Bunkstatic inline long 9751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik__do_strncpy_from_user(char *dst, const char *src, long count) 9851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{ 9951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik long res; 10051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 10151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik if (count == 0) 10251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik return 0; 10351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 10451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 10551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Currently, in 2.4.0-test9, most ports use a simple byte-copy loop. 10651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * So do we. 10751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 10851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * This code is deduced from: 10951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 11051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * char tmp2; 11151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * long tmp1, tmp3; 11251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * tmp1 = count; 11351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * while ((*dst++ = (tmp2 = *src++)) != 0 11451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * && --tmp1) 11551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * ; 11651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 11751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * res = count - tmp1; 11851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 11951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * with tweaks. 12051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 12151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 12251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__ ( 12351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d %3,%0\n" 12451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: move.b [%2+],$acr\n" 125da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson "1: beq 6f\n" 12651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%1+]\n" 12751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 12851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " subq 1,%0\n" 12951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: bne 1b\n" 13051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%2+],$acr\n" 13151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 132da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson "6: sub.d %3,%0\n" 13351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " neg.d %0,%0\n" 13451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3:\n" 13551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" 13651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.d %7,%0\n" 13751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 3b\n" 13851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " nop\n" 13951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 14051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* The address for a fault at the first move is trivial. 14151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik The address for a fault at the second move is that of 14251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik the preceding branch insn, since the move insn is in 143da2af0a771caa8f8cff9c7bfc979f0510eb0faeaJesper Nilsson its delay-slot. Just so you don't get confused... */ 14451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" 14551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" 14651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 5b,4b\n" 14751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,4b\n" 14851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous" 14951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (res), "=b" (dst), "=b" (src), "=r" (count) 15051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "3" (count), "1" (dst), "2" (src), "g" (-EFAULT) 15151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "acr"); 15251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 15351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik return res; 15451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik} 15551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 15651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* A few copy asms to build up the more complex ones from. 15751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 15851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik Note again, a post-increment is performed regardless of whether a bus 15951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik fault occurred in that instruction, and PC for a faulted insn is the 16051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik address for the insn, or for the preceding branch when in a delay-slot. */ 16151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 16251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_user_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 16351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__ ( \ 16451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 16551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "1:\n" \ 16651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 16751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 16851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 16951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 17051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 17151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 17251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=b" (to), "=b" (from), "=r" (ret) \ 17351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "0" (to), "1" (from), "2" (ret) \ 17451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "acr", "memory") 17551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 17651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_1(to, from, ret) \ 17751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 17851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.b [%1+],$acr\n" \ 17951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 18051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: addq 1,%2\n" \ 18151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 1b\n" \ 18251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 18351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 18451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 18551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 18651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 18751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 18851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.w [%1+],$acr\n" \ 18951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w $acr,[%0+]\n", \ 19051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 19151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: addq 2,%2\n" \ 19251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 1b\n" \ 19351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.w [%0+]\n", \ 19451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 19551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 19651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 19751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_2(to, from, ret) \ 19851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_2x_cont(to, from, ret, "", "", "") 19951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 20051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_3(to, from, ret) \ 20151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_2x_cont(to, from, ret, \ 20251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.b [%1+],$acr\n" \ 20351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 20451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 1,%2\n" \ 20551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 20651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 20751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 20851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 20951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 21051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 21151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.d [%1+],$acr\n" \ 21251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 21351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 21451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: addq 4,%2\n" \ 21551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " jump 1b\n" \ 21651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 21751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 21851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 21951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 22051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_4(to, from, ret) \ 22151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_4x_cont(to, from, ret, "", "", "") 22251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 22351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_5(to, from, ret) \ 22451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_4x_cont(to, from, ret, \ 22551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.b [%1+],$acr\n" \ 22651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 22751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 1,%2\n" \ 22851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 22951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 23051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 23151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 23251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_4x_cont(to, from, ret, \ 23351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 23451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.w [%1+],$acr\n" \ 23551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w $acr,[%0+]\n", \ 23651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 23751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 2,%2\n" \ 23851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.w [%0+]\n", \ 23951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 24051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 24151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 24251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_6(to, from, ret) \ 24351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_6x_cont(to, from, ret, "", "", "") 24451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 24551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_7(to, from, ret) \ 24651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_6x_cont(to, from, ret, \ 24751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.b [%1+],$acr\n" \ 24851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 24951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 1,%2\n" \ 25051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 25151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 25251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 25351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 25451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_4x_cont(to, from, ret, \ 25551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 25651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.d [%1+],$acr\n" \ 25751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 25851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 25951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 4,%2\n" \ 26051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 26151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 26251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 26351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 26451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_8(to, from, ret) \ 26551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_8x_cont(to, from, ret, "", "", "") 26651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 26751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_9(to, from, ret) \ 26851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_8x_cont(to, from, ret, \ 26951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.b [%1+],$acr\n" \ 27051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 27151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 1,%2\n" \ 27251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 27351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 27451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 27551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 27651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_8x_cont(to, from, ret, \ 27751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 27851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.w [%1+],$acr\n" \ 27951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w $acr,[%0+]\n", \ 28051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 28151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 2,%2\n" \ 28251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.w [%0+]\n", \ 28351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 28451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 28551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 28651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_10(to, from, ret) \ 28751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_10x_cont(to, from, ret, "", "", "") 28851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 28951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_11(to, from, ret) \ 29051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_10x_cont(to, from, ret, \ 29151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.b [%1+],$acr\n" \ 29251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 29351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 1,%2\n" \ 29451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 29551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 29651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 29751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 29851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_8x_cont(to, from, ret, \ 29951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 30051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.d [%1+],$acr\n" \ 30151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 30251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 30351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 4,%2\n" \ 30451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 30551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 30651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 30751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 30851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_12(to, from, ret) \ 30951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_12x_cont(to, from, ret, "", "", "") 31051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 31151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_13(to, from, ret) \ 31251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_12x_cont(to, from, ret, \ 31351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.b [%1+],$acr\n" \ 31451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 31551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 1,%2\n" \ 31651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 31751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 31851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 31951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 32051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_12x_cont(to, from, ret, \ 32151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 32251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.w [%1+],$acr\n" \ 32351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w $acr,[%0+]\n", \ 32451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 32551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 2,%2\n" \ 32651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.w [%0+]\n", \ 32751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 32851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 32951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 33051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_14(to, from, ret) \ 33151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_14x_cont(to, from, ret, "", "", "") 33251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 33351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_15(to, from, ret) \ 33451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_14x_cont(to, from, ret, \ 33551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "10: move.b [%1+],$acr\n" \ 33651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b $acr,[%0+]\n", \ 33751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "11: addq 1,%2\n" \ 33851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.b [%0+]\n", \ 33951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 10b,11b\n") 34051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 34151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 34251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_12x_cont(to, from, ret, \ 34351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 34451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.d [%1+],$acr\n" \ 34551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 34651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 34751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 4,%2\n" \ 34851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 34951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 35051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 35151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 35251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_16(to, from, ret) \ 35351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_16x_cont(to, from, ret, "", "", "") 35451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 35551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_20x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 35651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_16x_cont(to, from, ret, \ 35751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 35851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "10: move.d [%1+],$acr\n" \ 35951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 36051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 36151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "11: addq 4,%2\n" \ 36251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 36351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 36451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 10b,11b\n") 36551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 36651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_20(to, from, ret) \ 36751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_20x_cont(to, from, ret, "", "", "") 36851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 36951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_24x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 37051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_20x_cont(to, from, ret, \ 37151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 37251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "12: move.d [%1+],$acr\n" \ 37351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d $acr,[%0+]\n", \ 37451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 37551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "13: addq 4,%2\n" \ 37651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d [%0+]\n", \ 37751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 37851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 12b,13b\n") 37951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 38051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_from_user_24(to, from, ret) \ 38151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_from_user_24x_cont(to, from, ret, "", "", "") 38251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 38351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* And now, the to-user ones. */ 38451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 38551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_1(to, from, ret) \ 38651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 38751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 38851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.b $acr,[%0+]\n", \ 38951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 39051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 1,%2\n", \ 39151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 39251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 39351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 39451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 39551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 39651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w [%1+],$acr\n" \ 39751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.w $acr,[%0+]\n", \ 39851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 39951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 40051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 2,%2\n", \ 40151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 40251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 40351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 40451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_2(to, from, ret) \ 40551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_2x_cont(to, from, ret, "", "", "") 40651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 40751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_3(to, from, ret) \ 40851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_2x_cont(to, from, ret, \ 40951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 41051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.b $acr,[%0+]\n", \ 41151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 1,%2\n", \ 41251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 41351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 41451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 41551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_user_cont(to, from, ret, \ 41651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 41751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 41851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: move.d $acr,[%0+]\n", \ 41951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 42051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 42151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 4,%2\n", \ 42251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 42351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 42451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 42551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_4(to, from, ret) \ 42651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_4x_cont(to, from, ret, "", "", "") 42751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 42851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_5(to, from, ret) \ 42951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_4x_cont(to, from, ret, \ 43051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 43151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.b $acr,[%0+]\n", \ 43251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 1,%2\n", \ 43351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 43451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 43551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 43651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_4x_cont(to, from, ret, \ 43751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 43851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w [%1+],$acr\n" \ 43951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.w $acr,[%0+]\n", \ 44051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 44151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 2,%2\n", \ 44251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 44351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 44451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 44551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_6(to, from, ret) \ 44651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_6x_cont(to, from, ret, "", "", "") 44751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 44851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_7(to, from, ret) \ 44951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_6x_cont(to, from, ret, \ 45051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 45151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.b $acr,[%0+]\n", \ 45251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 1,%2\n", \ 45351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 45451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 45551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 45651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_4x_cont(to, from, ret, \ 45751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 45851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 45951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: move.d $acr,[%0+]\n", \ 46051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 46151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 4,%2\n", \ 46251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 46351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 46451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 46551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_8(to, from, ret) \ 46651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_8x_cont(to, from, ret, "", "", "") 46751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 46851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_9(to, from, ret) \ 46951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_8x_cont(to, from, ret, \ 47051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 47151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.b $acr,[%0+]\n", \ 47251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 1,%2\n", \ 47351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 47451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 47551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 47651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_8x_cont(to, from, ret, \ 47751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 47851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w [%1+],$acr\n" \ 47951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.w $acr,[%0+]\n", \ 48051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 48151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 2,%2\n", \ 48251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 48351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 48451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 48551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_10(to, from, ret) \ 48651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_10x_cont(to, from, ret, "", "", "") 48751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 48851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_11(to, from, ret) \ 48951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_10x_cont(to, from, ret, \ 49051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 49151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.b $acr,[%0+]\n", \ 49251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 1,%2\n", \ 49351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 49451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 49551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 49651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_8x_cont(to, from, ret, \ 49751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 49851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 49951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: move.d $acr,[%0+]\n", \ 50051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 50151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 4,%2\n", \ 50251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 50351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 50451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 50551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_12(to, from, ret) \ 50651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_12x_cont(to, from, ret, "", "", "") 50751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 50851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_13(to, from, ret) \ 50951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_12x_cont(to, from, ret, \ 51051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 51151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.b $acr,[%0+]\n", \ 51251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 1,%2\n", \ 51351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 51451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 51551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 51651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_12x_cont(to, from, ret, \ 51751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 51851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.w [%1+],$acr\n" \ 51951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.w $acr,[%0+]\n", \ 52051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 52151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 2,%2\n", \ 52251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 52351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 52451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 52551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_14(to, from, ret) \ 52651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_14x_cont(to, from, ret, "", "", "") 52751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 52851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_15(to, from, ret) \ 52951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_14x_cont(to, from, ret, \ 53051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.b [%1+],$acr\n" \ 53151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "10: move.b $acr,[%0+]\n", \ 53251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "11: addq 1,%2\n", \ 53351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 10b,11b\n") 53451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 53551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 53651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_12x_cont(to, from, ret, \ 53751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 53851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 53951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: move.d $acr,[%0+]\n", \ 54051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 54151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 4,%2\n", \ 54251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 54351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 54451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 54551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_16(to, from, ret) \ 54651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_16x_cont(to, from, ret, "", "", "") 54751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 54851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_20x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 54951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_16x_cont(to, from, ret, \ 55051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 55151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 55251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "10: move.d $acr,[%0+]\n", \ 55351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 55451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "11: addq 4,%2\n", \ 55551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 55651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 10b,11b\n") 55751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 55851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_20(to, from, ret) \ 55951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_20x_cont(to, from, ret, "", "", "") 56051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 56151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_24x_cont(to, from, ret, COPY, FIXUP, TENTRY) \ 56251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_20x_cont(to, from, ret, \ 56351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik COPY \ 56451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d [%1+],$acr\n" \ 56551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "12: move.d $acr,[%0+]\n", \ 56651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 56751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "13: addq 4,%2\n", \ 56851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 56951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 12b,13b\n") 57051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 57151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_copy_to_user_24(to, from, ret) \ 57251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_copy_to_user_24x_cont(to, from, ret, "", "", "") 57351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 57451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Define a few clearing asms with exception handlers. */ 57551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 57651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* This frame-asm is like the __asm_copy_user_cont one, but has one less 57751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik input. */ 57851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 57951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear(to, ret, CLEAR, FIXUP, TENTRY) \ 58051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__ ( \ 58151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 58251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "1:\n" \ 58351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" \ 58451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 58551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" \ 58651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" \ 58751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 58851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous" \ 58951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=b" (to), "=r" (ret) \ 59051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "0" (to), "1" (ret) \ 59151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "memory") 59251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 59351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_1(to, ret) \ 59451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear(to, ret, \ 59551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: clear.b [%0+]\n", \ 59651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 59751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 1,%1\n", \ 59851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 59951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 60051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_2(to, ret) \ 60151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear(to, ret, \ 60251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: clear.w [%0+]\n", \ 60351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 60451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 2,%1\n", \ 60551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 60651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 60751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_3(to, ret) \ 60851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear(to, ret, \ 60951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: clear.w [%0+]\n" \ 61051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: clear.b [%0+]\n", \ 61151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: addq 2,%1\n" \ 61251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: jump 1b\n" \ 61351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 1,%1\n", \ 61451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,4b\n" \ 61551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 3b,5b\n") 61651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 61751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_4x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 61851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear(to, ret, \ 61951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 62051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2: clear.d [%0+]\n", \ 62151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 62251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 1b\n" \ 62351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " addq 4,%1\n", \ 62451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 62551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 2b,3b\n") 62651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 62751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_4(to, ret) \ 62851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_4x_cont(to, ret, "", "", "") 62951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 63051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_8x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 63151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_4x_cont(to, ret, \ 63251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 63351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: clear.d [%0+]\n", \ 63451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 63551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "5: addq 4,%1\n", \ 63651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 63751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,5b\n") 63851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 63951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_8(to, ret) \ 64051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_8x_cont(to, ret, "", "", "") 64151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 64251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_12x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 64351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_8x_cont(to, ret, \ 64451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 64551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "6: clear.d [%0+]\n", \ 64651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 64751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "7: addq 4,%1\n", \ 64851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 64951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 6b,7b\n") 65051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 65151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_12(to, ret) \ 65251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_12x_cont(to, ret, "", "", "") 65351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 65451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_16x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 65551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_12x_cont(to, ret, \ 65651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 65751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "8: clear.d [%0+]\n", \ 65851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 65951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "9: addq 4,%1\n", \ 66051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 66151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 8b,9b\n") 66251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 66351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_16(to, ret) \ 66451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_16x_cont(to, ret, "", "", "") 66551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 66651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_20x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 66751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_16x_cont(to, ret, \ 66851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 66951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "10: clear.d [%0+]\n", \ 67051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 67151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "11: addq 4,%1\n", \ 67251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 67351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 10b,11b\n") 67451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 67551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_20(to, ret) \ 67651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_20x_cont(to, ret, "", "", "") 67751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 67851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_24x_cont(to, ret, CLEAR, FIXUP, TENTRY) \ 67951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_20x_cont(to, ret, \ 68051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik CLEAR \ 68151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "12: clear.d [%0+]\n", \ 68251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik FIXUP \ 68351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "13: addq 4,%1\n", \ 68451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik TENTRY \ 68551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 12b,13b\n") 68651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 68751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define __asm_clear_24(to, ret) \ 68851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm_clear_24x_cont(to, ret, "", "", "") 68951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 69051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* 69151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Return the size of a string (including the ending 0) 69251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 69351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Return length of string in userspace including terminating 0 69451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * or 0 for error. Return a value greater than N if too long. 69551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 69651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 697d9b5444eeb3a663ca4a625878b1421c9e9b18e8bAdrian Bunkstatic inline long 69851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstrnlen_user(const char *s, long n) 69951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{ 70051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik long res, tmp1; 70151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 70251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik if (!access_ok(VERIFY_READ, s, 0)) 70351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik return 0; 70451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 70551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 70651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * This code is deduced from: 70751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 70851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * tmp1 = n; 70951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * while (tmp1-- > 0 && *s++) 71051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * ; 71151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 71251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * res = n - tmp1; 71351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * 71451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * (with tweaks). 71551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */ 71651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 71751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik __asm__ __volatile__ ( 71851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d %1,$acr\n" 71951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " cmpq 0,$acr\n" 72051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "0:\n" 72151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " ble 1f\n" 72251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " subq 1,$acr\n" 72351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 72451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "4: test.b [%0+]\n" 72551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " bne 0b\n" 72651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " cmpq 0,$acr\n" 72751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "1:\n" 72851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " move.d %1,%0\n" 72951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " sub.d $acr,%0\n" 73051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "2:\n" 73151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section .fixup,\"ax\"\n" 73251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 73351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik "3: jump 2b\n" 73451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " clear.d %0\n" 73551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 73651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" 73751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .section __ex_table,\"a\"\n" 73851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .dword 4b,3b\n" 73951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik " .previous\n" 74051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "=r" (res), "=r" (tmp1) 74151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "0" (s), "1" (n) 74251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik : "acr"); 74351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 74451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik return res; 74551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik} 74651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 74751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif 748