annotate packages/hal/sparclite/arch/current/src/icontext.c @ 6:d376b777e2ce ecos-sw-1999-05-14

Merge from eCos master repository on 1999-05-14-19:27:43-BST
author jlarmour
date Fri, 14 May 1999 12:20:00 +0000
parents 443894e2e912
children ece80412419a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 /*=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // icontext.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // SPARClite HAL context init function
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 // Author(s): hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Contributors: hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1998-12-14
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Purpose: HAL context initialization function
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Description: Initialize a HAL context for SPARClite; this is in C and out
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // of line because there is too much of it for a simple macro.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //===========================================================================*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <cyg/hal/hal_arch.h> // HAL header
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/hal/vectors.h> // SAVE_REGS_SIZE, __WINSIZE, ...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 /*---------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 /* We lay out the stack in the manner that the PCS demands:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 * frame pointer -----> [top of stack]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 * Argument spill area (6 words)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 * Return Arg pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 * Initial saved register window (i[8], l[8])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 * for use by program when it starts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 * [rest of] saved register object (various)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 * stack pointer -----> saved register window (i[8], l[8])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 * to allow us to be interrupted.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 * ie. frame pointer ->
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 * struct HAL_FrameStructure
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 * stack pointer -> struct HAL_SavedRegisters
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 * and when the context "resumes" sp is incremented by 40 * 4, the size of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 * a _struct HAL_SavedRegisters_ which points it at the extant but unused
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 * _struct HAL_FrameStructure_ as the PCS requires. The frame pointer is
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 * left pointing off the top of stack.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 * Thus the stack is the same if created from an already executing context:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 * frame pointer ----->
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 * [temporaries and locals]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 * [more arguments]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 * Argument spill area (6 words)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 * Return Arg pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 * [sp at entry]------> Previous saved register window (i[8], l[8])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 * for use by program when it starts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 * [rest of] saved register object (various)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 * stack pointer -----> saved register window (i[8], l[8])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 * to allow us to be interrupted.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 CYG_ADDRESS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 hal_thread_init_context( CYG_WORD sparg,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 CYG_WORD thread,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 CYG_WORD entry,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 CYG_WORD id )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 register CYG_WORD fp = sparg;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 register CYG_WORD sp = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 register HAL_SavedRegisters *regs;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 register HAL_FrameStructure *frame;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 if ( 0 == (id & 0xffff0000) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 id <<= 16;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
102 fp &= ~15; // round down to double alignment
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 frame = (HAL_FrameStructure *)(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 fp - sizeof( HAL_FrameStructure ) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 regs = (HAL_SavedRegisters *)(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 ((CYG_WORD)frame) - sizeof(HAL_SavedRegisters) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 sp = (CYG_WORD)regs;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 for ( i = 0; i < 6; i++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 frame->spill_args[i] = id | 0xa0 | i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 frame->composite_return_ptr = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 for ( i = 0; i < 8; i++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 frame->li.i[i] = id | ( 56 + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 frame->li.l[i] = id | ( 48 + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 regs ->li.i[i] = id | ( 24 + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 regs ->li.l[i] = id | ( 16 + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 regs ->o[i] = id | ( 8 + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 regs ->g[i] = id | ( i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 // first terminate the linked list on the stack in the initial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 // (already saved) register window:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 frame->li.i[6] = regs->li.i[6] = (cyg_uint32)fp; // frame pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 frame->li.i[7] = regs->li.i[7] = (cyg_uint32)0; // no ret addr here
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 // and set up other saved regs as if called from just before
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 // the entry point:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 regs->o[7] = (entry - 8);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 regs->o[6] = sp;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 // this is the argument that the entry point is called with
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 regs->o[0] = thread;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 // this is the initial CWP; quite arbitrary really, the WIM is set up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 // accordingly in hal_thread_load_context().
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 regs->g[0] = 7;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 return (CYG_ADDRESS)sp;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 // ---------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 //#define THREAD_DEBUG_SERIAL_VERBOSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 #ifdef THREAD_DEBUG_SERIAL_VERBOSE // NOT INCLUDED
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 // This is unpleasant to try to debug, because these routines are called
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 // WHEN THE PROGRAM IS NOT RUNNING from the CygMon's GDB stubs - so you
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 // can't use any normal output: these little routines use the serial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 // line directly, so are best used when debugging via Ethernet, so you
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 // just have a separate output stream to read. Nasty...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 #include <cyg/hal/hal_diag.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 #undef HAL_DIAG_WRITE_CHAR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 #define HAL_DIAG_WRITE_CHAR(_c_) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 SLEB_LED = (_c_); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 HAL_DIAG_WRITE_CHAR_DIRECT( _c_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 static void swritec( char c )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 HAL_DIAG_WRITE_CHAR( c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 static void swrites( char *s )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 while ( 0 != (c = *s++) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 HAL_DIAG_WRITE_CHAR( c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 static void swritex( cyg_uint32 x )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 swrites( "0x" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 for ( i = 28; i >= 0; i-= 4 ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 char c = "0123456789abcdef"[ 0xf & (x >> i) ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 HAL_DIAG_WRITE_CHAR( c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 #define newline() swrites( "\n\r" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 static void x8( char *s, unsigned long *xp )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 for ( i = 0; i < 8; i++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 swrites( s );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 swritec( '0' + i );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 swrites( " = " );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 swritex( xp[i] );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 if ( 3 == (i & 3) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 swrites( " " );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 #endif // THREAD_DEBUG_SERIAL_VERBOSE ... NOT INCLUDED
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 // ---------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 // Routines in icontext.c used here because they're quite large for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 // the SPARClite (note param order); these are used in talking to GDB.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 enum regnames {G0 = 0, G1, G2, G3, G4, G5, G6, G7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 O0, O1, O2, O3, O4, O5, SP, O7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 L0, L1, L2, L3, L4, L5, L6, L7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 I0, I1, I2, I3, I4, I5, FP, I7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 F0, F1, F2, F3, F4, F5, F6, F7,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 F8, F9, F10, F11, F12, F13, F14, F15,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 F16, F17, F18, F19, F20, F21, F22, F23,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 F24, F25, F26, F27, F28, F29, F30, F31,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR};
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 typedef unsigned long target_register_t;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 cyg_hal_sparc_get_gdb_regs( void *gdb_regset,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 HAL_SavedRegisters *eCos_regset )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 target_register_t *gdb = (target_register_t *)gdb_regset;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 int reg;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 cyg_uint32 scratch = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 cyg_uint32 *sptrap;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 HAL_SavedWindow *trapli, *ctxli;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 if ( 0 == eCos_regset->g[0] ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 0xc0 == (0xe0 & eCos_regset->g[0]) ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 // Then it's an interrupt stack saved state:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 // (either minimal, or a saved PSR with traps disabled)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 // The saved register set is pretty minimal, so we have to grub
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 // around in the stack to find out some truth...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 sptrap = (cyg_uint32 *)eCos_regset; // point to the IL save area for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 sptrap -= 24; // the trap handler, for PC, NPC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 trapli = (HAL_SavedWindow *)sptrap; // Get at those regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 ctxli = (HAL_SavedWindow *)(trapli->i[6]); // (the frame pointer)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 // and get at the interruptee's regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 // Pick up interruptee's registers from all over the stack:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 for ( reg = 0; reg < 8 ; reg++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 gdb[ G0 + reg ] = eCos_regset->g[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 gdb[ O0 + reg ] = trapli->i[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 gdb[ L0 + reg ] = ctxli->l[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 gdb[ I0 + reg ] = ctxli->i[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 // Clear out G0 which is always 0 (but abused in eCos_regset)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 // and the FP regs which we do not have:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 gdb[ G0 ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 for ( reg = F0; reg <= F31; reg++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 gdb[ reg ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 // In the save context _of the trap handler_ registers are as follows:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 // %l0 = psr (with this CWP/window-level in it)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 // %l1 = pc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 // %l2 = npc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 // %l3 = vector number (1-15 for interrupts)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 // %l4 = Y register preserved
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 gdb[ Y ] = trapli->l[4];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 scratch = trapli->l[0]; // the PSR in the trap handler
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 scratch++; // back to interupted thread's window
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 scratch &=~ 0x38; // clear ET and any CWP overflow
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 gdb[ PSR ] = scratch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 gdb[ WIM ] = 1 << ((__WINBITS & (1 + scratch)));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 // Read _a_ TBR value and ignore the current trap details:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 asm volatile ( "rd %%tbr, %0" : "=r"(scratch) : );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 gdb[ TBR ] = (scratch &~ 0xfff);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 gdb[ PC ] = trapli->l[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 gdb[ NPC ] = trapli->l[2];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 gdb[ FPSR ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 gdb[ CPSR ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 #ifdef THREAD_DEBUG_SERIAL_VERBOSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 swrites( "-----------------------------------------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 swrites( "-------------- INTERRUPT STACK GET ------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 swrites( "eCos regset at " ); swritex( eCos_regset ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 swrites( " trapli " ); swritex( trapli ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 swrites( " ctxli " ); swritex( ctxli ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 x8( "global ", &(gdb[G0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 x8( " in ", &(gdb[I0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 x8( " local ", &(gdb[L0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 x8( " out ", &(gdb[O0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 swrites( "gdb PC = " ); swritex( gdb[ PC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 swrites( "gdb NPC = " ); swritex( gdb[ NPC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 swrites( "gdb PSR = " ); swritex( gdb[ PSR ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 // It's a synchronous context switch that led to this object.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 // Pick up interruptee's registers from the saved context:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 for ( reg = 0; reg < 8 ; reg++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 gdb[ G0 + reg ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 gdb[ O0 + reg ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 gdb[ G0 + reg ] = eCos_regset->g[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 gdb[ O0 + reg ] = eCos_regset->o[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 gdb[ L0 + reg ] = eCos_regset->li.l[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 gdb[ I0 + reg ] = eCos_regset->li.i[reg];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 // Set up the stack pointer by arithmetic and the return address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 gdb[ SP ] = ((cyg_uint32)(eCos_regset));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 gdb[ O7 ] = eCos_regset->o[ 7 ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 // Clear out G0 which is always 0 (but abused in eCos_regset)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 gdb[ G0 ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 // and clear the FP regs which we do not have:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 for ( reg = F0; reg <= F31; reg++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328 gdb[ reg ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330 gdb[ Y ] = 0; // it's not preserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 scratch = eCos_regset->g[ 0 ]; // the PSR in the saved context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 gdb[ PSR ] = scratch; // return it verbatim.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 gdb[ WIM ] = 1 << ((__WINBITS & (1 + scratch)));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 // Read _a_ TBR value and ignore the current trap details:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 asm volatile ( "rd %%tbr, %0" : "=r"(scratch) : );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 gdb[ TBR ] = (scratch &~ 0xfff);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340 gdb[ PC ] = eCos_regset->o[ 7 ]; // the return address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341 gdb[ NPC ] = 4 + gdb[ PC ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 gdb[ FPSR ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 gdb[ CPSR ] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 #ifdef THREAD_DEBUG_SERIAL_VERBOSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347 newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 swrites( "-----------------------------------------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349 swrites( "-------------- SYNCHRONOUS SWITCH GET----------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 swrites( "eCos regset at " ); swritex( eCos_regset ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 x8( "global ", &(gdb[G0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 x8( " in ", &(gdb[I0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 x8( " local ", &(gdb[L0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 x8( " out ", &(gdb[O0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 swrites( "gdb PC = " ); swritex( gdb[ PC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 swrites( "gdb NPC = " ); swritex( gdb[ NPC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 swrites( "gdb PSR = " ); swritex( gdb[ PSR ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 // ---------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366 cyg_hal_sparc_set_gdb_regs( HAL_SavedRegisters *eCos_regset,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367 void *gdb_regset )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 target_register_t *gdb = (target_register_t *)gdb_regset;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370 int reg;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371 cyg_uint32 scratch = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372 cyg_uint32 *sptrap;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
373 HAL_SavedWindow *trapli, *ctxli;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
374
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
375 // Guess where the eCos register set really is:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
376 if ( 0 == eCos_regset->g[0] ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377 0xc0 == (0xe0 & eCos_regset->g[0]) ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378 // Then it's an interrupt stack saved state:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379 // (either minimal, or a saved PSR with traps disabled)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380 // The saved register set is pretty minimal, so we have to grub
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 // around in the stack to find out some truth...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382 sptrap = (cyg_uint32 *)eCos_regset; // point to the IL save area for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 sptrap -= 24; // the trap handler, for PC, NPC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
384 trapli = (HAL_SavedWindow *)sptrap; // Get at those regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
385
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
386 ctxli = (HAL_SavedWindow *)(trapli->i[6]); // (the frame pointer)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
387 // and get at the interruptee's regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
388
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389 scratch = eCos_regset->g[0];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 // Put back interruptee's registers all over the stack:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392 for ( reg = 0; reg < 8 ; reg++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 eCos_regset->g[reg] = gdb[ G0 + reg ] ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 trapli->i[reg] = gdb[ O0 + reg ] ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395 ctxli->l[reg] = gdb[ L0 + reg ] ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 ctxli->i[reg] = gdb[ I0 + reg ] ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399 // Put back the eCos G0 which is always 0 (but abused in eCos_regset)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 eCos_regset->g[0] = scratch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
402 // In the save context _of the trap handler_ registers are as follows:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403 // %l0 = psr (with this CWP/window-level in it)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404 // %l1 = pc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
405 // %l2 = npc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406 // %l3 = vector number (1-15 for interrupts)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
407 // %l4 = Y register preserved
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
408 trapli->l[4] = gdb[ Y ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
410 // I am *not* interfering with the saved PSR, nor the TBR nor WIM.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
411
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412 // put back return PC and NPC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
413 trapli->l[1] = gdb[ PC ] ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414 trapli->l[2] = gdb[ NPC ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
415
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
416 #ifdef THREAD_DEBUG_SERIAL_VERBOSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
417 newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418 swrites( "-----------------------------------------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419 swrites( "-------------- INTERRUPT STACK SET ------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 swrites( "eCos regset at " ); swritex( eCos_regset ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421 swrites( " trapli " ); swritex( trapli ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
422 swrites( " ctxli " ); swritex( ctxli ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
423 x8( "global ", &(gdb[G0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 x8( " in ", &(gdb[I0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425 x8( " local ", &(gdb[L0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426 x8( " out ", &(gdb[O0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 swrites( "gdb PC = " ); swritex( gdb[ PC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428 swrites( "gdb NPC = " ); swritex( gdb[ NPC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429 swrites( "gdb PSR = " ); swritex( gdb[ PSR ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433 else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 // It's a synchronous context switch that led to this object.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
435 // Pick up interruptee's registers from the saved context:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
437 scratch = eCos_regset->g[0];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
438
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439 for ( reg = 0; reg < 8 ; reg++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440 eCos_regset->g[reg] = gdb[ G0 + reg ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 eCos_regset->o[reg] = gdb[ O0 + reg ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 eCos_regset->li.l[reg] = gdb[ L0 + reg ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443 eCos_regset->li.i[reg] = gdb[ I0 + reg ];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446 // Put back the eCos G0 which is always 0 (but abused in eCos_regset)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447 eCos_regset->g[0] = scratch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449 // I am *not* interfering with the saved PSR, nor the TBR nor WIM.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
450
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
451 // The PC is in o7, altering it via GDB's PC is not on.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452 // Setting the NPC in a voluntary context is meaningless.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
454 #ifdef THREAD_DEBUG_SERIAL_VERBOSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455 newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 swrites( "-----------------------------------------------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457 swrites( "-------------- SYNCHRONOUS SWITCH SET ---------------" ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 swrites( "eCos regset at " ); swritex( eCos_regset ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 x8( "global ", &(gdb[G0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 x8( " in ", &(gdb[I0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 x8( " local ", &(gdb[L0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
462 x8( " out ", &(gdb[O0]) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
463 swrites( "gdb PC = " ); swritex( gdb[ PC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464 swrites( "gdb NPC = " ); swritex( gdb[ NPC ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
465 swrites( "gdb PSR = " ); swritex( gdb[ PSR ] ); newline();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 /*---------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 // EOF icontext.c