1130365Smlaier/* { dg-do compile } */ 2130365Smlaier/* { dg-require-effective-target ilp32 } */ 3130365Smlaier/* { dg-options "-O" } */ 4130365Smlaier 5130365Smlaiertypedef unsigned char u8; 6130365Smlaierstruct __large_struct { unsigned long buf[100]; }; 7130365Smlaierstatic inline __attribute__((always_inline)) unsigned long 8130365Smlaier__copy_from_user_inatomic(void *to, const void *from, unsigned long n) 9130365Smlaier{ 10130365Smlaier unsigned long ret = 0; 11130365Smlaier asm volatile("1: mov""b"" %2,%""b""1\n" "2:\n" 12130365Smlaier ".section .fixup,\"ax\"\n" 13130365Smlaier "3: mov %3,%0\n" 14130365Smlaier " xor""b"" %""b""1,%""b""1\n" 15130365Smlaier " jmp 2b\n" 16130365Smlaier ".previous\n" 17130365Smlaier " .section __ex_table,\"a\"\n" 18130365Smlaier " " ".balign 4" " " "\n" 19130365Smlaier " " ".long" " " "1b" "," "3b" "\n" 20130365Smlaier " .previous\n" 21130365Smlaier : "=r" (ret), "=q"(*(u8 *)to) 22130365Smlaier : "m" ((*(struct __large_struct *)(from))), "i" (1), "0" (ret)); 23130365Smlaier return ret; 24130365Smlaier} 25130365Smlaiervoid romchecksum(const unsigned char *rom, unsigned char c) 26130365Smlaier{ 27130365Smlaier unsigned char sum; 28130365Smlaier for (sum = 0; 29130365Smlaier !__copy_from_user_inatomic(&(c), ( typeof(c) *)(rom++), sizeof(c));) 30130365Smlaier sum += c; 31130365Smlaier} 32130365Smlaier