No empty .Rs/.Re
[netbsd-mini2440.git] / sys / arch / arm / arm32 / setstack.S
blob4e52fb3a4a40fc2ff208f0248bfa5538df648786
1 /*      $NetBSD$        */
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  */
50 #include <machine/cpu.h>
51 #include <machine/asm.h>
53         RCSID("$NetBSD$")
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  */
63 ENTRY(set_stackptr)
64         mrs     r3, cpsr                /* Switch to the appropriate mode */
65         bic     r2, r3, #(PSR_MODE)
66         orr     r2, r2, r0
67         msr     cpsr_c, r2
69         mov     sp, r1                  /* Set the stack pointer */
71         msr     cpsr_c, r3              /* Restore the old mode */
73         mov     pc, lr                  /* Exit */
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  */
82 ENTRY(get_stackptr)
83         mrs     r3, cpsr                /* Switch to the appropriate mode */
84         bic     r2, r3, #(PSR_MODE)
85         orr     r2, r2, r0
86         msr     cpsr_c, r2
88         mov     r0, sp                  /* Set the stack pointer */
90         msr     cpsr_c, r3              /* Restore the old mode */
92         mov     pc, lr                  /* Exit */
94 /* End of setstack.S */