2 * Access kernel memory without faulting -- s390 specific implementation.
4 * Copyright IBM Corp. 2009
6 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
10 #include <linux/uaccess.h>
11 #include <linux/kernel.h>
12 #include <linux/types.h>
13 #include <linux/errno.h>
14 #include <asm/system.h>
17 * This function writes to kernel memory bypassing DAT and possible
18 * write protection. It copies one to four bytes from src to dst
19 * using the stura instruction.
20 * Returns the number of bytes copied or -EFAULT.
22 static long probe_kernel_write_odd(void *dst
, void *src
, size_t size
)
24 unsigned long count
, aligned
;
28 aligned
= (unsigned long) dst
& ~3UL;
29 offset
= (unsigned long) dst
& 3;
30 count
= min_t(unsigned long, 4 - offset
, size
);
31 mask
= (0xf << (4 - count
)) & 0xf;
42 EX_TABLE(0b
,3b
) EX_TABLE(1b
,3b
) EX_TABLE(2b
,3b
)
43 : "+d" (rc
), "+a" (aligned
)
44 : "a" (mask
), "a" (src
) : "cc", "memory", "0", "1");
45 return rc
? rc
: count
;
48 long probe_kernel_write(void *dst
, void *src
, size_t size
)
53 copied
= probe_kernel_write_odd(dst
, src
, size
);
60 return copied
< 0 ? -EFAULT
: 0;