Remove building with NOCRYPTO option
[minix.git] / minix / kernel / arch / earm / klib.S
blob60b5046e34334fc6091bde7131948903a888e5e1
1 /* sections */
4 #include <minix/config.h>
5 #include <minix/const.h>
6 #include <machine/asm.h>
7 #include <machine/interrupt.h>
8 #include <machine/vm.h>
9 #include "archconst.h"
10 #include "kernel/const.h"
11 #include "sconst.h"
12 #include <machine/multiboot.h>
15 /*===========================================================================*/
16 /*                              copy_msg_from_user                           */
17 /*===========================================================================*/
19  * int copy_msg_from_user(message * user_mbuf, message * dst);
20  *
21  * Copies a message of 64 bytes from user process space to a kernel buffer. This
22  * function assumes that the process address space is installed (ttbr loaded).
23  *
24  * This function from the callers point of view either succeeds or returns an
25  * error which gives the caller a chance to respond accordingly. In fact it
26  * either succeeds or if it generates a pagefault, general protection or other
27  * exception, the trap handler has to redirect the execution to
28  * __user_copy_msg_pointer_failure where the error is reported to the caller
29  * without resolving the pagefault. It is not kernel's problem to deal with
30  * wrong pointers from userspace and the caller should return an error to
31  * userspace as if wrong values or request were passed to the kernel
32  */
33 ENTRY(copy_msg_from_user)
34         push    {r4-r10, lr}
35         /* load the source pointer */
36         mov     r9, r0
37         /* load the destination pointer */
38         mov     r10, r1
39         /* do the copy, first 32 bytes */
40         ldm     r9,  {r0-r7}
41         stm     r10, {r0-r7}
43         /* next 32 bytes */
44         add     r9,  r9, #32
45         add     r10, r10, #32
46         ldm     r9,  {r0-r7}
47         stm     r10, {r0-r7}
49 LABEL(__copy_msg_from_user_end)
50         pop     {r4-r10, lr}
51         mov     r0, #0
52         bx      lr
54 /*===========================================================================*/
55 /*                              copy_msg_to_user                             */
56 /*===========================================================================*/
58  * void copy_msg_to_user(message * src, message * user_mbuf);
59  *
60  * Copies a message of 64 bytes to user process space from a kernel buffer.
61  *
62  * All the other copy_msg_from_user() comments apply here as well!
63  */
64 ENTRY(copy_msg_to_user)
65         push    {r4-r10, lr}
66         /* load the source pointer */
67         mov     r9, r0
68         /* load the destination pointer */
69         mov     r10, r1
70         /* do the copy, first 32 bytes */
71         ldm     r9,  {r0-r7}
72         stm     r10, {r0-r7}
74         /* next 32 bytes */
75         add     r9,  r9,  #32
76         add     r10, r10, #32
77         ldm     r9,  {r0-r7}
78         stm     r10, {r0-r7}
80 LABEL(__copy_msg_to_user_end)
81         pop     {r4-r10, lr}
82         mov     r0, #0
83         bx      lr
86  * if a function from a selected set of copies from or to userspace fails, it is
87  * because of a wrong pointer supplied by the userspace. We have to clean up and
88  * and return -1 to indicated that something wrong has happend. The place it was
89  * called from has to handle this situation. The exception handler redirect us
90  * here to continue, clean up and report the error
91  */
92 ENTRY(__user_copy_msg_pointer_failure)
93         pop     {r4-r10, lr}
94         mov     r0, #-1
95         bx      lr
97 ENTRY(intr_enable)
98 ENTRY(interrupts_enable)
99         dsb
100         cpsie if
101         bx lr
103 ENTRY(intr_disable)
104 ENTRY(interrupts_disable)
105         dsb
106         cpsid if
107         bx lr