1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  *    conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  *    of conditions and the following disclaimer in the documentation and/or other materials
13  *    provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  *    to endorse or promote products derived from this software without specific prior written
17  *    permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include "asm.h"
33 
34 .syntax unified
35 .arm
36 
37 // errno_t _arm_put_user(void *dst, const void *src, size_t dstTypeLen, size_t srcTypeLen)
38 FUNCTION(_arm_put_user)
39     stmdb   sp!, {r0, r1, r2, r3, lr}
40     cmp     r2, #0
41     beq     .Lget_user_return
42     cmp     r2, r3
43     bne     .Lget_user_err
44     cmp     r2, #1
45     bhi     .Lget_user_half
46 .Lget_user_byte:
47 0:  ldrb    r3, [r1], #0
48 1:  strbt   r3, [r0], #0
49     b       .Lget_user_return
50 .Lget_user_half:
51     cmp     r2, #2
52     bhi     .Lget_user_word
53 2:  ldrh    r3, [r1], #0
54 3:  strht   r3, [r0], #0
55     b       .Lget_user_return
56 .Lget_user_word:
57     cmp     r2, #4
58     bhi     .Lget_user_err
59 4:  ldr    r3, [r1], #0
60 5:  strt   r3, [r0], #0
61 .Lget_user_return:
62     ldmia   sp!, {r0, r1, r2, r3, lr}
63     mov     r0, 0
64     bx      lr
65 .Lget_user_err:
66     ldmia   sp!, {r0, r1, r2, r3, lr}
67     mov     r0, #-14
68     bx      lr
69 
70 .pushsection __exc_table, "a"
71     .long   0b,  .Lget_user_err
72     .long   1b,  .Lget_user_err
73     .long   2b,  .Lget_user_err
74     .long   3b,  .Lget_user_err
75     .long   4b,  .Lget_user_err
76     .long   5b,  .Lget_user_err
77 .popsection
78