initial commit
[freebsd-arm:freebsd-arm.git] / arm / arm / setstack.s
1 /*      $NetBSD: setstack.S,v 1.1 2001/07/28 13:28:03 chris Exp $       */
2
3 /*-
4  * Copyright (c) 1994 Mark Brinicombe.
5  * Copyright (c) 1994 Brini.
6  * All rights reserved.
7  *
8  * This code is derived from software written for Brini by Mark Brinicombe
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *      This product includes software developed by Brini.
21  * 4. The name of the company nor the name of the author may be used to
22  *    endorse or promote products derived from this software without specific
23  *    prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
26  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28  * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  * RiscBSD kernel project
38  *
39  * setstack.S
40  *
41  * Miscellaneous routine to play with the stack pointer in different CPU modes
42  *
43  * Eventually this routine can be inline assembly.
44  *
45  * Created      : 17/09/94
46  *
47  * Based of kate/display/setstack.s
48  *
49  */
50
51 #include <machine/armreg.h>
52 #include <machine/asm.h>
53 __FBSDID("$FreeBSD$");
54
55 /* To set the stack pointer for a particular mode we must switch
56  * to that mode update the banked r13 and then switch back.
57  * This routine provides an easy way of doing this for any mode
58  *
59  * r0 = CPU mode
60  * r1 = stackptr
61  */
62
63 ENTRY(set_stackptr)
64         mrs     r3, cpsr_all            /* Switch to the appropriate mode */
65         bic     r2, r3, #(PSR_MODE)
66         orr     r2, r2, r0
67         msr     cpsr_all, r2
68
69         mov     sp, r1                  /* Set the stack pointer */
70
71         msr     cpsr_all, r3            /* Restore the old mode */
72
73         mov     pc, lr                  /* Exit */
74
75 /* To get the stack pointer for a particular mode we must switch
76  * to that mode copy the banked r13 and then switch back.
77  * This routine provides an easy way of doing this for any mode
78  *
79  * r0 = CPU mode
80  */
81
82 ENTRY(get_stackptr)
83         mrs     r3, cpsr_all            /* Switch to the appropriate mode */
84         bic     r2, r3, #(PSR_MODE)
85         orr     r2, r2, r0
86         msr     cpsr_all, r2
87
88         mov     r0, sp                  /* Set the stack pointer */
89
90         msr     cpsr_all, r3            /* Restore the old mode */
91
92         mov     pc, lr                  /* Exit */
93
94 /* End of setstack.S */