annotate packages/hal/mn10300/arch/current/src/context.S @ 208:e0c0827131d1 ecos

Merge from eCos master repository on 2002-05-20-20:11:54-BST
author jlarmour
date Mon, 20 May 2002 22:19:26 +0000
parents bf00f99aec69
children d2c90368aeef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 ##=============================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 ## context.S
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 ## MN10300 context switch code
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 ##=============================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
8 #####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
9 # -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
10 # This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
11 # Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
12 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
13 # eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
14 # the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
15 # Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
16 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
17 # eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
18 # WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
19 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
20 # for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
21 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
22 # You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
23 # with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
24 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
25 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
26 # As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
27 # or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
28 # with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
29 # by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
30 # License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
31 # in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
32 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
33 # This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
34 # this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
35 #
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
36 # Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
37 # at http://sources.redhat.com/ecos/ecos-license
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
38 # -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
39 #####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 ##=============================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 #######DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 ## Author(s): nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 ## Contributors: nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 ## Date: 1998-04-27
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 ## Purpose: MN10300 context switch code
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 ## Description: This file contains implementations of the thread context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 ## switch routines. It also contains the longjmp() and setjmp()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 ## routines.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 ######DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 ##
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 ##=============================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <pkgconf/hal.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56
30
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
57 #include <cyg/hal/arch.inc>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #------------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 # hal_thread_switch_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 # Switch thread contexts
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 # D0 = address of sp of next thread to execute
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 # D1 = address of sp save location of current thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 .global _hal_thread_switch_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 _hal_thread_switch_context:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 add -8,sp # space for SP and PSW
30
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
68 mov d2,a0 # move d2->a0 since PSW can only be
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
69 # saved to a data register
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
70 hal_cpu_get_psw d2 # save PSW to d2
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
71 mov d2,(4,sp) # store in stack loc
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
72 mov a0,d2 # retrieve old d2 value
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
73 hal_cpu_save_all # save entire register set
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 mov d1,a2 # move save loc addr to A2
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 mov sp,(0,a2) # store SP in save location
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 # Now load the destination thread by dropping through
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 # to hal_thread_load_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 #------------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 # hal_thread_load_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 # Load thread context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 # D0 = address of sp of next thread to execute
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 # Note that this function is also the second half of hal_thread_switch_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 # and is simply dropped into from it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 .global _hal_thread_load_context
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 _hal_thread_load_context:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 mov d0,a2 # move next sp loc to a2
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 mov (0,a2),sp # load SP with new value
30
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
92 hal_cpu_load_all # load whole register set
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
93 mov (4,sp),d1 # retrieve saved PSW
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
94 hal_cpu_set_psw d1 # and restore it
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
95 add 8,sp # skip saved SP and PSW
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 2
diff changeset
96 ret [],0 # and return
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 ##-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 ## HAL longjmp(), setjmp() implementations
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 ## These implementations omit the usual movm [d2,d3,a2,a3],(sp)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 ## Which is the first instruction of all C compiled functions.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
102 ## Note: These definitions are repeated in hal_arch.h. If changes are required
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
103 ## remember to update both sets.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
105 #define CYGARC_JMP_BUF_SP 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
106 #define CYGARC_JMP_BUF_D2 1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
107 #define CYGARC_JMP_BUF_D3 2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
108 #define CYGARC_JMP_BUF_A2 3
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
109 #define CYGARC_JMP_BUF_A3 4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
110 #define CYGARC_JMP_BUF_LR 5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
112 #define CYGARC_JMP_BUF_SIZE 6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
113
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
114
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 # This just preserves the callee save registers
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 # namely a2,a3,d2,d3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 # setjmp cannot use movm to do this as we need to keep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 # the sp underneath all live data at all times.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 .globl _hal_setjmp
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 _hal_setjmp: # d0=env
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 mov d0,a0 # env
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
122 mov d2,(CYGARC_JMP_BUF_D2*4,a0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
123 mov d3,(CYGARC_JMP_BUF_D3*4,a0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
124 mov a2,(CYGARC_JMP_BUF_A2*4,a0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
125 mov a3,(CYGARC_JMP_BUF_A3*4,a0)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 mov mdr,d1 # link saved by call (also in (0,sp))
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
127 mov d1,(CYGARC_JMP_BUF_LR*4,a0)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 mov sp,a1
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
129 mov a1,(CYGARC_JMP_BUF_SP*4,a0) # a1==(caller''s sp)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 clr d0 # return 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 ret [],0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 # longjmp returns to caller of setjmp
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 # after restoring callee save registers
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 .globl _hal_longjmp
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 _hal_longjmp:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 mov d0,a0
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
138 mov (CYGARC_JMP_BUF_D2*4,a0),d2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
139 mov (CYGARC_JMP_BUF_D3*4,a0),d3
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
140 mov (CYGARC_JMP_BUF_A2*4,a0),a2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
141 mov (CYGARC_JMP_BUF_A3*4,a0),a3
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
142 mov (CYGARC_JMP_BUF_LR*4,a0),d0
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 ## mov d0,mdr
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
144 mov (CYGARC_JMP_BUF_SP*4,a0),a1 # stashed (caller''s sp)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 mov a1,sp
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 mov d0,(0,sp) # put link on stack
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 mov d1,d0 # return arg1
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 ret [],0 # this ignores (0,sp) and does pc=mdr
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 #------------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 # end of context.S
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 30
diff changeset
154