Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/cris/arch-v32/lib/csumcpfruser.S
15125 views
1
/*
2
* Add-on to transform csum_partial_copy_nocheck in checksumcopy.S into
3
* csum_partial_copy_from_user by adding exception records.
4
*
5
* Copyright (C) 2001, 2003 Axis Communications AB.
6
*
7
* Author: Hans-Peter Nilsson.
8
*/
9
10
#include <asm/errno.h>
11
12
/* Same function body, but a different name. If we just added exception
13
records to _csum_partial_copy_nocheck and made it generic, we wouldn't
14
know a user fault from a kernel fault and we would have overhead in
15
each kernel caller for the error-pointer argument.
16
17
unsigned int csum_partial_copy_from_user
18
(const char *src, char *dst, int len, unsigned int sum, int *errptr);
19
20
Note that the errptr argument is only set if we encounter an error.
21
It is conveniently located on the stack, so the normal function body
22
does not have to handle it. */
23
24
#define csum_partial_copy_nocheck csum_partial_copy_from_user
25
26
/* There are local labels numbered 1, 2 and 3 present to mark the
27
different from-user accesses. */
28
#include "checksumcopy.S"
29
30
.section .fixup,"ax"
31
32
;; Here from the movem loop; restore stack.
33
4:
34
movem [$sp+],$r8
35
;; r12 is already decremented. Add back chunk_size-2.
36
addq 40-2,$r12
37
38
;; Here from the word loop; r12 is off by 2; add it back.
39
5:
40
addq 2,$r12
41
42
;; Here from a failing single byte.
43
6:
44
45
;; Signal in *errptr that we had a failing access.
46
move.d [$sp],$acr
47
moveq -EFAULT,$r9
48
subq 4,$sp
49
move.d $r9,[$acr]
50
51
;; Clear the rest of the destination area using memset. Preserve the
52
;; checksum for the readable bytes.
53
move.d $r13,[$sp]
54
subq 4,$sp
55
move.d $r11,$r10
56
move $srp,[$sp]
57
jsr memset
58
clear.d $r11
59
60
move [$sp+],$srp
61
ret
62
move.d [$sp+],$r10
63
64
.previous
65
.section __ex_table,"a"
66
.dword 1b,4b
67
.dword 2b,5b
68
.dword 3b,6b
69
.previous
70
71