revert between 56095 -> 55830 in arch
[AROS.git] / arch / .unmaintained / arm-all / exec / switchtouser.S
blob6b16c24cce13a1519a2769cf11b67bde9d3ab1e2
1 /*   Copyright © 1995-2001, The AROS Development Team. All rights reserved.
2     $Id$
3 */
5         /*
6          * Switch the processor into user mode.
7          * Parameters to this function:
8          *   function to continue with afterwards
9          *   pointer to the user stack to be used
10          */
11         .text
12         .align  2
13         .globl  switch_to_user_mode
14         .type   switch_to_user_mode,function
16 switch_to_user_mode:
17         /*
18          * r0: function where to continue afterwards.
19          * r1: user stack pointer
20          */
21         /*
22          * Load the user stack pointer with its future value!
23          */
24         stmia   sp, {r1}
25         ldmia   sp, {sp}^
26         /*
27          * Make sure we are in SVC mode
28          * Disable all interrupts
29          */
30         mrs     r1, cpsr
31         bic     r1, r1, #0xff
32         orr     r1, r1,#(0x80|0x40|0x13)
33         msr     cpsr, r1
34         /*
35          * Do the actual switch into user mode
36          * Disable all interrupts: 0x80, 0x40
37          * Set User Mode: 0x10
38          */
39         mrs     r1, cpsr
40         bic     r1, r1, #0xff
41         orr     r1, r1, #(0x80|0x40|0x10)
42         msr     spsr, r1
43         /*
44          * Call the follow up function
45          */
46         movs    pc, r0