annotate packages/hal/powerpc/arch/current/include/hal_arch.h @ 1611:003a3db955cd

* include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make absolutely safe with respect to strict-aliasing. (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Ditto.
author jlarmour
date Thu, 29 Apr 2004 03:39:58 +0000
parents 5e18a98616fe
children
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 #ifndef CYGONCE_HAL_ARCH_H
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_HAL_ARCH_H
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
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 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 // hal_arch.h
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 // Architecture specific abstractions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 //=============================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
11 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
12 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
13 // 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: 196
diff changeset
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
1609
5e18a98616fe More warning cleanups
gthomas
parents: 1397
diff changeset
15 // Copyright (C) 2004 Gary Thomas
1611
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
16 // Copyright (C) 2004 Jonathan Larmour <jifl@eCosCentric.com>
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
18 // 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: 196
diff changeset
19 // 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: 196
diff changeset
20 // 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: 196
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
22 // 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: 196
diff changeset
23 // 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: 196
diff changeset
24 // 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: 196
diff changeset
25 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
27 // 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: 196
diff changeset
28 // 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: 196
diff changeset
29 // 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: 196
diff changeset
30 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
31 // 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: 196
diff changeset
32 // 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: 196
diff changeset
33 // 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: 196
diff changeset
34 // 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: 196
diff changeset
35 // 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: 196
diff changeset
36 // 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: 196
diff changeset
37 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
38 // 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: 196
diff changeset
39 // 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: 196
diff changeset
40 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
41 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
42 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
43 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
44 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //=============================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // Author(s): nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 // Contributors: nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 // Date: 1997-09-08
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 // Purpose: Define architecture abstractions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 // Usage: #include <cyg/hal/hal_arch.h>
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 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 //=============================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
59 #include <pkgconf/hal.h>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_type.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
62 #include <cyg/hal/ppc_regs.h> // CYGARC_REG_MSR_EE
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
63
0
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 // Processor saved states:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 typedef struct
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 {
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
69 #ifdef CYGDBG_HAL_POWERPC_FRAME_WALLS
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
70 cyg_uint32 wall_head;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
71 #endif
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
72
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 // These are common to all saved states
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 cyg_uint32 d[32]; // Data regs
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
75 #ifdef CYGHWR_HAL_POWERPC_FPU
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
76 double f[32]; // Floating point registers
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
77 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 cyg_uint32 cr; // Condition Reg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 cyg_uint32 xer; // XER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 cyg_uint32 lr; // Link Reg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 cyg_uint32 ctr; // Count Reg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
83 // These are saved for exceptions and interrupts, but may also
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
84 // be saved in a context switch if thread-aware debugging is enabled.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
85 cyg_uint32 msr; // Machine State Reg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
86 cyg_uint32 pc; // Program Counter
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
87
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
88 // This marks the limit of state saved during a context switch and
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
89 // is used to calculate necessary stack allocation for context switches.
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
90 // It would probably be better to have a union instead...
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
91 cyg_uint32 context_size[0];
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
92
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 // These are only saved for exceptions and interrupts
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 cyg_uint32 vector; // Vector number
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
96 #ifdef CYGDBG_HAL_POWERPC_FRAME_WALLS
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
97 cyg_uint32 wall_tail;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
98 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 } HAL_SavedRegisters;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 // Exception handling function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 // This function is defined by the kernel according to this prototype. It is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 // invoked from the HAL to deal with any CPU exceptions that the HAL does
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 // not want to deal with itself. It usually invokes the kernel's exception
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 // delivery mechanism.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
108 externC void cyg_hal_deliver_exception( CYG_WORD code, CYG_ADDRWORD data );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 // Bit manipulation macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 #define HAL_LSBIT_INDEX(index, mask) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 asm ( "neg 11,%1;" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 "and 11,11,%1;" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 "cntlzw %0,11;" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 "subfic %0,%0,31;" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 : "=r" (index) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 : "r" (mask) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 : "r11" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
123 #define HAL_MSBIT_INDEX(index, mask) \
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
124 asm ( "cntlzw %0,%1\n" \
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
125 "subfic %0,%0,31;" \
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
126 : "=r" (index) \
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
127 : "r" (mask) \
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 130
diff changeset
128 );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 //-----------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
131 // eABI
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
132 #define CYGARC_PPC_STACK_FRAME_SIZE 56 // size of a stack frame
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
133
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
134 //-----------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 // Context Initialization
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 // Initialize the context of a thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 // Arguments:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
138 // _sparg_ name of variable containing current sp, will be written with new sp
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 // _thread_ thread object address, passed as argument to entry point
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 // _entry_ entry point address.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 // _id_ bit pattern used in initializing registers, for debugging.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
143 #define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
144 CYG_MACRO_START \
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
145 register CYG_WORD _sp_ = (((CYG_WORD)_sparg_) &~15) \
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
146 - CYGARC_PPC_STACK_FRAME_SIZE; \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
147 register HAL_SavedRegisters *_regs_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
148 int _i_; \
818
c9e9d4163174 * include/hal_arch.h (HAL_THREAD_INIT_CONTEXT): Initialize
jlarmour
parents: 210
diff changeset
149 ((CYG_WORD *)_sp_)[0] = 0; /* Zero old FP and LR for EABI */ \
c9e9d4163174 * include/hal_arch.h (HAL_THREAD_INIT_CONTEXT): Initialize
jlarmour
parents: 210
diff changeset
150 ((CYG_WORD *)_sp_)[1] = 0; /* to make GDB backtraces sane */ \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
151 _regs_ = (HAL_SavedRegisters *)((_sp_) - sizeof(HAL_SavedRegisters)); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
152 for( _i_ = 0; _i_ < 32; _i_++ ) (_regs_)->d[_i_] = (_id_)|_i_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
153 (_regs_)->d[01] = (CYG_WORD)(_sp_); /* SP = top of stack */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
154 (_regs_)->d[03] = (CYG_WORD)(_thread_); /* R3 = arg1 = thread ptr */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
155 (_regs_)->cr = 0; /* CR = 0 */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
156 (_regs_)->xer = 0; /* XER = 0 */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
157 (_regs_)->lr = (CYG_WORD)(_entry_); /* LR = entry point */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
158 (_regs_)->pc = (CYG_WORD)(_entry_); /* set PC for thread dbg */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
159 (_regs_)->ctr = 0; /* CTR = 0 */ \
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
160 (_regs_)->msr = CYGARC_REG_MSR_EE; /* MSR = enable irqs */ \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
161 _sparg_ = (CYG_ADDRESS)_regs_; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 // Context switch macros.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 // The arguments are pointers to locations where the stack pointer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 // of the current thread is to be stored, and from where the sp of the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 // next thread is to be fetched.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 externC void hal_thread_switch_context( CYG_ADDRESS to, CYG_ADDRESS from );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 externC void hal_thread_load_context( CYG_ADDRESS to )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 __attribute__ ((noreturn));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #define HAL_THREAD_SWITCH_CONTEXT(_fspptr_,_tspptr_) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 hal_thread_switch_context((CYG_ADDRESS)_tspptr_,(CYG_ADDRESS)_fspptr_);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 #define HAL_THREAD_LOAD_CONTEXT(_tspptr_) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 hal_thread_load_context( (CYG_ADDRESS)_tspptr_ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 // Execution reorder barrier.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 // When optimizing the compiler can reorder code. In multithreaded systems
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 // where the order of actions is vital, this can sometimes cause problems.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 // This macro may be inserted into places where reordering should not happen.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 #define HAL_REORDER_BARRIER() asm volatile ( "" : : : "memory" )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 // Breakpoint support
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 // HAL_BREAKPOINT() is a code sequence that will cause a breakpoint to happen
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 // if executed.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 // HAL_BREAKINST is the value of the breakpoint instruction and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 // HAL_BREAKINST_SIZE is its size in bytes.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 #define HAL_BREAKPOINT(_label_) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 asm volatile (" .globl " #_label_ ";" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 #_label_":" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 " trap" \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 #define HAL_BREAKINST 0x7d821008
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 #define HAL_BREAKINST_SIZE 4
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 // Thread register state manipulation for GDB support.
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
207 typedef struct {
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
208 cyg_uint32 gpr[32]; // General purpose registers
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
209 double f0[16]; // First sixteen floating point regs
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
210 cyg_uint32 pc;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
211 cyg_uint32 msr;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
212 cyg_uint32 cr;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
213 cyg_uint32 lr;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
214 cyg_uint32 ctr;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
215 cyg_uint32 xer;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
216 cyg_uint32 mq;
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
217 #ifdef CYGHWR_HAL_POWERPC_FPU
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
218 double f16[16]; // Last sixteen floating point regs
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
219 // Could probably also be inserted in the middle
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
220 // Adding them at the end minimises the risk of
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
221 // breaking existing implementations that do not
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
222 // have floating point registers.
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
223 #endif
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
224 } GDB_Registers;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 // Translate a stack pointer as saved by the thread context macros above into
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 // a pointer to a HAL_SavedRegisters structure.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 #define HAL_THREAD_GET_SAVED_REGISTERS( _sp_, _regs_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 (_regs_) = (HAL_SavedRegisters *)(_sp_)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
231 // Copy floating point registers from a HAL_SavedRegisters structure into a
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
232 // GDB_Registers structure
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
233 #ifdef CYGHWR_HAL_POWERPC_FPU
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
234 #define HAL_GET_GDB_FLOATING_POINT_REGISTERS( _gdb_, _regs_ ) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
235 CYG_MACRO_START \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
236 double * _p_ = _gdb_->f0; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
237 double * _q_ = _regs_->f; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
238 for( _i_ = 0; _i_ < 16; _i_++) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
239 *_p_++ = *_q_++; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
240 \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
241 _p_ = _gdb_->f16; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
242 for( _i_ = 0; _i_ < 16; _i_++) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
243 *_p_++ = *_q_++; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
244 CYG_MACRO_END
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
245 #else
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
246 #define HAL_GET_GDB_FLOATING_POINT_REGISTERS( _gdb_, _regs_ ) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
247 CYG_MACRO_START \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
248 CYG_MACRO_END
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
249 #endif
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
250
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
251 // Copy a GDB_Registers structure into a HAL_SavedRegisters structure
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
252 #ifdef CYGHWR_HAL_POWERPC_FPU
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
253 #define HAL_SET_GDB_FLOATING_POINT_REGISTERS( _regs_, _gdb_) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
254 CYG_MACRO_START \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
255 double * _p_ = _regs_->f; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
256 double * _q_ = _gdb_->f0; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
257 for( _i_ = 0; _i_ < 16; _i_++) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
258 *_p_++ = *_q_++; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
259 \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
260 _q_ = _gdb_->f16; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
261 for( _i_ = 0; _i_ < 16; _i_++) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
262 *_p_++ = *_q_++; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
263 CYG_MACRO_END
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
264 #else
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
265 #define HAL_SET_GDB_FLOATING_POINT_REGISTERS( _regs_, _gdb_) \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
266 CYG_MACRO_START \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
267 CYG_MACRO_END
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
268 #endif
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
269
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 // Copy a set of registers from a HAL_SavedRegisters structure into a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 // GDB ordered array.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 #define HAL_GET_GDB_REGISTERS( _aregval_, _regs_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 CYG_MACRO_START \
1611
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
274 union __gdbreguniontype { \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
275 __typeof__(_aregval_) _aregval2_; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
276 GDB_Registers *_gdbr; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
277 } __gdbregunion; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
278 __gdbregunion._aregval2_ = (_aregval_); \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
279 GDB_Registers *_gdb_ = __gdbregunion._gdbr; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 int _i_; \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 for( _i_ = 0; _i_ < 32; _i_++ ) \
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
283 _gdb_->gpr[_i_] = (_regs_)->d[_i_]; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 \
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
285 _gdb_->pc = (_regs_)->pc; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
286 _gdb_->msr = (_regs_)->msr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
287 _gdb_->cr = (_regs_)->cr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
288 _gdb_->lr = (_regs_)->lr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
289 _gdb_->ctr = (_regs_)->ctr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
290 _gdb_->xer = (_regs_)->xer; \
1609
5e18a98616fe More warning cleanups
gthomas
parents: 1397
diff changeset
291 HAL_GET_GDB_FLOATING_POINT_REGISTERS(_gdb_, _regs_); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 // Copy a GDB ordered array into a HAL_SavedRegisters structure.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 #define HAL_SET_GDB_REGISTERS( _regs_ , _aregval_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 CYG_MACRO_START \
1611
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
297 union __gdbreguniontype { \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
298 __typeof__(_aregval_) _aregval2_; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
299 GDB_Registers *_gdbr; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
300 } __gdbregunion; \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
301 __gdbregunion._aregval2_ = (_aregval_); \
003a3db955cd * include/hal_arch.h (HAL_SET_GDB_FLOATING_POINT_REGISTERS): Make
jlarmour
parents: 1609
diff changeset
302 GDB_Registers *_gdb_ = __gdbregunion._gdbr; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 int _i_; \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 for( _i_ = 0; _i_ < 32; _i_++ ) \
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
306 (_regs_)->d[_i_] = _gdb_->gpr[_i_]; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 \
1397
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
308 (_regs_)->pc = _gdb_->pc; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
309 (_regs_)->msr = _gdb_->msr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
310 (_regs_)->cr = _gdb_->cr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
311 (_regs_)->lr = _gdb_->lr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
312 (_regs_)->ctr = _gdb_->ctr; \
9c818dd5d9fa Updates for EC555 targets - from Bob Koninckx
gthomas
parents: 818
diff changeset
313 (_regs_)->xer = _gdb_->xer; \
1609
5e18a98616fe More warning cleanups
gthomas
parents: 1397
diff changeset
314 HAL_SET_GDB_FLOATING_POINT_REGISTERS(_regs_, _gdb_); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 // HAL setjmp
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
320 typedef struct {
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
321 cyg_uint32 sp;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
322 cyg_uint32 r2;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
323 cyg_uint32 r13;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
324 cyg_uint32 r14;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
325 cyg_uint32 r15;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
326 cyg_uint32 r16;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
327 cyg_uint32 r17;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
328 cyg_uint32 r18;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
329 cyg_uint32 r19;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
330 cyg_uint32 r20;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
331 cyg_uint32 r21;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
332 cyg_uint32 r22;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
333 cyg_uint32 r23;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
334 cyg_uint32 r24;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
335 cyg_uint32 r25;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
336 cyg_uint32 r26;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
337 cyg_uint32 r27;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
338 cyg_uint32 r28;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
339 cyg_uint32 r29;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
340 cyg_uint32 r30;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
341 cyg_uint32 r31;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
342 #ifdef CYGHWR_HAL_POWERPC_FPU
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
343 double f14;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
344 double f15;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
345 double f16;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
346 double f17;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
347 double f18;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
348 double f19;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
349 double f20;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
350 double f21;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
351 double f22;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
352 double f23;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
353 double f24;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
354 double f25;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
355 double f26;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
356 double f27;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
357 double f28;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
358 double f29;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
359 double f30;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
360 double f31;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 196
diff changeset
361 #endif
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
362 cyg_uint32 lr;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
363 cyg_uint32 cr;
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
364 } hal_jmp_buf_t;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 101
diff changeset
366 #define CYGARC_JMP_BUF_SIZE (sizeof(hal_jmp_buf_t) / sizeof(cyg_uint32))
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 101
diff changeset
367
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 101
diff changeset
368 typedef cyg_uint32 hal_jmp_buf[ CYGARC_JMP_BUF_SIZE ];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 externC int hal_setjmp(hal_jmp_buf env);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 externC void hal_longjmp(hal_jmp_buf env, int val);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 //-----------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 // Idle thread code.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 // This macro is called in the idle thread loop, and gives the HAL the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 // chance to insert code. Typical idle thread behaviour might be to halt the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 // processor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 externC void hal_idle_thread_action(cyg_uint32 loop_count);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 #define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 //-----------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
384 // Minimal and sensible stack sizes: the intention is that applications
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
385 // will use these to provide a stack size in the first instance prior to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
386 // proper analysis. Idle thread stack should be this big.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
387
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
388 // THESE ARE NOT INTENDED TO BE MICROMETRICALLY ACCURATE FIGURES.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
389 // THEY ARE HOWEVER ENOUGH TO START PROGRAMMING.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
390 // YOU MUST MAKE YOUR STACKS LARGER IF YOU HAVE LARGE "AUTO" VARIABLES!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
391
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
392 // This is not a config option because it should not be adjusted except
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
393 // under "enough rope" sort of disclaimers.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
394
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
395 // Stack frame overhead per call. The PPC ABI defines regs 13..31 as callee
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
396 // saved. callee saved variables are irrelevant for us as they would contain
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
397 // automatic variables, so we only count the caller-saved regs here
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
398 // So that makes r0..r12 + cr, xer, lr, ctr:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
399 #define CYGNUM_HAL_STACK_FRAME_SIZE (4 * 17)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
400
76
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
401 // Stack needed for a context switch
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
402 #define CYGNUM_HAL_STACK_CONTEXT_SIZE \
435cced73e2f eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents: 66
diff changeset
403 (38*4 /* offsetof(HAL_SavedRegisters, context_size) */)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
404
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
405 // Interrupt + call to ISR, interrupt_end() and the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
406 #define CYGNUM_HAL_STACK_INTERRUPT_SIZE \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
407 ((43*4 /* sizeof(HAL_SavedRegisters) */) + 2 * CYGNUM_HAL_STACK_FRAME_SIZE)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
408
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
409 // We have lots of registers so no particular amount is added in for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
410 // typical local variable usage.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
411
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
412 // We define a minimum stack size as the minimum any thread could ever
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
413 // legitimately get away with. We can throw asserts if users ask for less
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
414 // than this. Allow enough for three interrupt sources - clock, serial and
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
415 // one other
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
416
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
417 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
418
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
419 // An interrupt stack which is large enough for all possible interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
420 // conditions (and only used for that purpose) exists. "User" stacks
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
421 // can therefore be much smaller
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
422
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
423 # define CYGNUM_HAL_STACK_SIZE_MINIMUM \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
424 (16*CYGNUM_HAL_STACK_FRAME_SIZE + 2*CYGNUM_HAL_STACK_INTERRUPT_SIZE)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
425
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
426 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
427
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
428 // No separate interrupt stack exists. Make sure all threads contain
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
429 // a stack sufficiently large
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
430 # define CYGNUM_HAL_STACK_SIZE_MINIMUM \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
431 (((2+3)*CYGNUM_HAL_STACK_INTERRUPT_SIZE) + \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
432 (16*CYGNUM_HAL_STACK_FRAME_SIZE))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
434
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
435 // Now make a reasonable choice for a typical thread size. Pluck figures
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
436 // from thin air and say 30 call frames with an average of 16 words of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
437 // automatic variables per call frame
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
438 #define CYGNUM_HAL_STACK_SIZE_TYPICAL \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
439 (CYGNUM_HAL_STACK_SIZE_MINIMUM + \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
440 30 * (CYGNUM_HAL_STACK_FRAME_SIZE+(16*4)))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
441
101
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
442 //--------------------------------------------------------------------------
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
443 // Macros for switching context between two eCos instances (jump from
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
444 // code in ROM to code in RAM or vice versa).
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
445
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
446 // Should be defined like for MIPS, saving/restoring R2 - but is it
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
447 // actually used? I've never seen app code use R2. Something to investigate.
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
448 #define CYGARC_HAL_SAVE_GP()
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
449 #define CYGARC_HAL_RESTORE_GP()
c37d3a9e1b28 Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents: 76
diff changeset
450
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
451 //-----------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 #endif // CYGONCE_HAL_ARCH_H
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453 // End of hal_arch.h