]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm/arm/setstack.s
Merge compiler-rt trunk r321414 to contrib/compiler-rt.
[FreeBSD/FreeBSD.git] / sys / 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/asm.h>
52 __FBSDID("$FreeBSD$");
53
54 #include <machine/armreg.h>
55
56 /* To set the stack pointer for a particular mode we must switch
57  * to that mode update the banked r13 and then switch back.
58  * This routine provides an easy way of doing this for any mode
59  *
60  * r0 = CPU mode
61  * r1 = stackptr
62  */
63
64 ENTRY(set_stackptr)
65         mrs     r3, cpsr                /* Switch to the appropriate mode */
66         bic     r2, r3, #(PSR_MODE)
67         orr     r2, r2, r0
68         msr     cpsr_fsxc, r2
69
70         mov     sp, r1                  /* Set the stack pointer */
71
72         msr     cpsr_fsxc, r3           /* Restore the old mode */
73
74         mov     pc, lr                  /* Exit */
75 END(set_stackptr)
76 /* To get the stack pointer for a particular mode we must switch
77  * to that mode copy the banked r13 and then switch back.
78  * This routine provides an easy way of doing this for any mode
79  *
80  * r0 = CPU mode
81  */
82
83 ENTRY(get_stackptr)
84         mrs     r3, cpsr                /* Switch to the appropriate mode */
85         bic     r2, r3, #(PSR_MODE)
86         orr     r2, r2, r0
87         msr     cpsr_fsxc, r2
88
89         mov     r0, sp                  /* Set the stack pointer */
90
91         msr     cpsr_fsxc, r3           /* Restore the old mode */
92
93         mov     pc, lr                  /* Exit */
94 END(get_stackptr)
95 /* End of setstack.S */