use USER_CPPFLAGS
[AROS.git] / arch / m68k-all / exec / superstate.S
blobdefc0fae0da1c7cf880918db59fdd99b9100f616
1 /*
2     Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3     $Id$
4 */
6 /*****************************************************************************
7  
8     NAME
9  
10         AROS_LH0(APTR, SuperState,
12     SYNOPSIS
14     LOCATION
15         struct ExecBase *, SysBase, 25, Exec)
17     FUNCTION
18         Enter supervisor mode (like Supervisor()), but return on the normal
19         user stack, so that user stack variables are still there. A call
20         to Userstate() will end this mode.
22     INPUTS
24     RESULT
25         Old supervisor stack. NULL if called from supervisor mode.
27     NOTES
28         The user stack must be big enough to hold all possible nestings
29         of interrupts.
31     EXAMPLE
33     BUGS
35     SEE ALSO
36         UserState(), Supervisor()
38     INTERNALS
40     HISTORY
42 ******************************************************************************/
44         #include "aros/m68k/asm.h"
46         .text
47         .balign 4
48         .globl  AROS_SLIB_ENTRY(SuperState,Exec,25)
49         .type   AROS_SLIB_ENTRY(SuperState,Exec,25),@function
50 AROS_SLIB_ENTRY(SuperState,Exec,25):
51         /* Goto supervisor mode. Preserve a5 in d0 (faster than stack space) */
52         move.l  %a5,%d0
53         lea.l   super,%a5
55         /* Do not change user stack - use jmp */
56         jmp     Supervisor(%a6)
57 super:
58         /* Restore a5 */
59         move.l  %d0,%a5
61         /* Check if called from supervisor mode */
62         btst    #5,(%sp)
63         beq     fromuser
65         /* Called from supervisor mode. Just return NULL. */
66         moveq.l #0,%d0
67         rte
69 fromuser:
70         /* Called from user mode. Restore sp and return supervisor sp. */
71         move.l  %sp,%d0
72         move.l  %usp,%sp
74         /* usp already points to the returnaddress for the SuperState() call. */
75         rts