Mercurial > ecos-v2_0-branch
annotate packages/kernel/current/include/thread.inl @ 143:6b5f480c6929 ecos-sw-2000-12-08
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
| author | jlarmour |
|---|---|
| date | Fri, 08 Dec 2000 03:30:06 +0000 |
| parents | 6ed91473a1cd |
| children | d397fc472bcf |
| rev | line source |
|---|---|
| 0 | 1 #ifndef CYGONCE_KERNEL_THREAD_INL |
| 2 #define CYGONCE_KERNEL_THREAD_INL | |
| 3 | |
| 4 //========================================================================== | |
| 5 // | |
| 2 | 6 // thread.inl |
| 0 | 7 // |
| 2 | 8 // Thread class inlines |
| 0 | 9 // |
| 10 //========================================================================== | |
| 11 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
12 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
13 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
14 // The contents of this file are subject to the Red Hat eCos Public License |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
15 // Version 1.1 (the "License"); you may not use this file except in |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
16 // compliance with the License. You may obtain a copy of the License at |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
17 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
18 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
19 // Software distributed under the License is distributed on an "AS IS" |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
21 // License for the specific language governing rights and limitations under |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
22 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
24 // The Original Code is eCos - Embedded Configurable Operating System, |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
25 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
26 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
27 // The Initial Developer of the Original Code is Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
28 // Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
29 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
30 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
31 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
32 // |
| 0 | 33 //####COPYRIGHTEND#### |
| 34 //========================================================================== | |
| 35 //#####DESCRIPTIONBEGIN#### | |
| 36 // | |
| 2 | 37 // Author(s): nickg |
| 38 // Contributors: nickg | |
| 39 // Date: 1997-09-09 | |
| 40 // Purpose: Define inlines for thread classes | |
| 41 // Description: Inline implementations of various member functions defined | |
| 0 | 42 // in various Thread classes. |
| 43 // Usage: | |
| 44 // #include <cyg/kernel/thread.hxx> | |
| 45 // ... | |
| 2 | 46 // #include <cyg/kernel/thread.inl> |
| 47 // ... | |
| 0 | 48 |
| 49 // | |
| 50 //####DESCRIPTIONEND#### | |
| 51 // | |
| 52 //========================================================================== | |
| 53 | |
| 54 #include <cyg/kernel/thread.hxx> | |
| 55 #include <cyg/hal/hal_arch.h> | |
| 56 | |
| 57 #include <cyg/kernel/clock.inl> | |
| 58 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
59 #ifndef CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
60 #define CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE (0) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
61 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
62 |
| 0 | 63 //========================================================================== |
| 64 // Inlines for Cyg_HardwareThread | |
| 65 | |
| 66 // ------------------------------------------------------------------------- | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
67 // get the size/base of this thread's stack |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
68 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
69 inline CYG_ADDRESS |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
70 Cyg_HardwareThread::get_stack_base() |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
71 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
72 return stack_base - CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
73 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
74 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
75 inline cyg_uint32 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
76 Cyg_HardwareThread::get_stack_size() |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
77 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
78 return stack_size + 2 * CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
79 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
80 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
81 // ------------------------------------------------------------------------- |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
82 // Check the stack bounds of this thread: |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
83 #ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
84 inline void Cyg_HardwareThread::check_stack(void) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
85 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
86 cyg_uint32 sig = (cyg_uint32)this; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
87 cyg_uint32 *base = (cyg_uint32 *)get_stack_base(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
88 cyg_uint32 *top = (cyg_uint32 *)(stack_base + stack_size); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
89 unsigned int i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
90 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
91 CYG_ASSERT( 0 == (3 & (cyg_uint32)base), "stack base not word aligned" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
92 CYG_ASSERT( 0 == (3 & (cyg_uint32)top), "stack top not word aligned" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
93 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
94 CYG_ASSERT( (cyg_uint32)stack_ptr > (cyg_uint32)stack_base, |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
95 "Stack_ptr below base" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
96 CYG_ASSERT( (cyg_uint32)stack_ptr <= ((cyg_uint32)stack_base + stack_size), |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
97 "Stack_ptr above top" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
98 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
99 for ( i = 0; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
100 i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
101 i++ ) { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
102 CYG_ASSERT( (sig ^ (i * 0x01010101)) == base[i], "Stack base corrupt" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
103 CYG_ASSERT( (sig ^ (i * 0x10101010)) == top[i], "Stack top corrupt" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
104 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
105 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
106 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
107 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
108 // ------------------------------------------------------------------------- |
| 0 | 109 // Attach a stack to this thread. If there is a HAL defined macro to |
| 110 // do this, then we use that, otherwise assume a falling stack. | |
| 111 inline void Cyg_HardwareThread::attach_stack(CYG_ADDRESS s_base, cyg_uint32 s_size) | |
| 112 { | |
| 2 | 113 #ifdef CYGNUM_HAL_STACK_SIZE_MINIMUM |
| 114 CYG_ASSERT( s_size >= CYGNUM_HAL_STACK_SIZE_MINIMUM, | |
| 115 "Stack size too small"); | |
| 116 #endif | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
117 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
118 #ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
119 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
120 cyg_uint32 sig = (cyg_uint32)this; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
121 cyg_uint32 *base = (cyg_uint32 *)s_base; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
122 cyg_uint32 *top = (cyg_uint32 *)(s_base + s_size - |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
123 CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
124 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
125 unsigned int i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
126 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
127 CYG_ASSERT( 0 == (3 & (cyg_uint32)base), "stack base alignment" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
128 CYG_ASSERT( 0 == (3 & (cyg_uint32)top), "stack top alignment" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
129 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
130 for ( i = 0; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
131 i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
132 i++ ) { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
133 base[i] = (sig ^ (i * 0x01010101)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
134 top[i] = (sig ^ (i * 0x10101010)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
135 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
136 // This check for overlap of the two signature areas also detects |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
137 // wrap round zero of the size in the unsigned subtraction below. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
138 CYG_ASSERT( &base[i] < &top[0], "Stack is so small size wrapped" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
139 // Use this 'i' expression to round correctly to whole words. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
140 s_base += i * sizeof(cyg_uint32); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
141 s_size -= i * sizeof(cyg_uint32) * 2; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
142 // This is a complete guess, the 256; the point is to assert early that |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
143 // this might go badly wrong. It would not detect wrap of unsigned size. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
144 CYG_ASSERT( s_size >= 256, |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
145 "Stack size too small after allocating checking buffer"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
146 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
147 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
148 |
| 0 | 149 stack_base = s_base; |
| 150 stack_size = s_size; | |
| 151 #ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT | |
| 152 stack_limit = s_base; | |
| 153 #endif | |
| 154 | |
| 155 #ifdef HAL_THREAD_ATTACH_STACK | |
| 156 | |
| 157 HAL_THREAD_ATTACH_STACK(stack_ptr, stack_base, stack_size); | |
| 158 | |
| 159 #else | |
| 160 | |
| 161 stack_ptr = stack_base + stack_size; | |
| 162 | |
| 163 #endif | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
164 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
165 #ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
166 check_stack(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
167 #endif |
| 0 | 168 } |
| 169 | |
| 170 // ------------------------------------------------------------------------- | |
| 171 | |
| 172 inline Cyg_HardwareThread::Cyg_HardwareThread( | |
| 173 cyg_thread_entry *e_point, // entry point function | |
| 174 CYG_ADDRWORD e_data, // entry data | |
| 175 cyg_ucount32 s_size, // stack size, 0 = use default | |
| 176 CYG_ADDRESS s_base // stack base, NULL = allocate | |
| 177 ) | |
| 178 { | |
| 179 entry_point = e_point; | |
| 180 entry_data = e_data; | |
| 181 #ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT | |
| 182 saved_context = 0; | |
| 183 #endif | |
| 184 | |
| 185 attach_stack( s_base, s_size ); | |
| 186 }; | |
| 187 | |
| 188 // ------------------------------------------------------------------------- | |
| 189 | |
| 190 #ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT | |
| 191 | |
| 192 // Return the current saved state for this thread. | |
| 193 inline HAL_SavedRegisters *Cyg_HardwareThread::get_saved_context() | |
| 194 { | |
| 195 HAL_SavedRegisters *regs; | |
| 196 if( saved_context != 0 ) regs = saved_context; | |
| 197 else HAL_THREAD_GET_SAVED_REGISTERS( stack_ptr, regs ); | |
| 198 return regs; | |
| 199 } | |
| 200 | |
| 201 inline void Cyg_HardwareThread::set_saved_context(HAL_SavedRegisters *ctx) | |
| 202 { | |
| 203 saved_context = ctx; | |
| 204 } | |
| 205 | |
| 206 #endif | |
| 207 | |
| 208 // ------------------------------------------------------------------------- | |
| 209 // (declare this inline before its first use) | |
| 210 | |
| 211 inline cyg_uint16 Cyg_Thread::get_unique_id() | |
| 212 { | |
| 213 return unique_id; | |
| 214 } | |
| 215 | |
| 216 // ------------------------------------------------------------------------- | |
| 217 // Initialize the context of this thread. | |
| 218 | |
| 219 inline void Cyg_HardwareThread::init_context(Cyg_Thread *thread) | |
| 220 { | |
| 221 #ifdef CYGPKG_INFRA_DEBUG | |
| 222 cyg_uint32 threadid = thread->get_unique_id()*0x01010000; | |
| 223 #else | |
| 224 cyg_uint32 threadid = 0x11110000; | |
| 225 #endif | |
| 226 HAL_THREAD_INIT_CONTEXT( stack_ptr, thread, thread_entry, threadid ); | |
| 227 } | |
| 228 | |
| 229 | |
| 230 | |
| 231 // ------------------------------------------------------------------------- | |
| 232 // Load thread context without saving current context. | |
| 233 // This function is only really here for completeness, the | |
| 234 // kernel generally calls the HAL macros directly. | |
| 235 | |
| 236 inline void Cyg_HardwareThread::load_context() | |
| 237 { | |
| 238 CYG_ADDRESS dummy_stack_ptr; | |
| 239 | |
| 240 HAL_THREAD_SWITCH_CONTEXT( &dummy_stack_ptr, &stack_ptr ); | |
| 241 } | |
| 242 | |
| 243 // ------------------------------------------------------------------------- | |
| 244 // Save current thread's context and load that of the given next thread. | |
| 245 // This function is only really here for completeness, the | |
| 246 // kernel generally calls the HAL macros directly. | |
| 247 | |
| 248 inline void Cyg_HardwareThread::switch_context(Cyg_HardwareThread *next) | |
| 249 { | |
| 250 HAL_THREAD_SWITCH_CONTEXT( &stack_ptr, &next->stack_ptr ); | |
| 251 } | |
| 252 | |
| 253 // ------------------------------------------------------------------------- | |
| 254 // Get and set entry_data. | |
| 255 | |
| 256 inline void Cyg_HardwareThread::set_entry_data( CYG_ADDRWORD data ) | |
| 257 { | |
| 258 entry_data = data; | |
| 259 } | |
| 260 | |
| 261 inline CYG_ADDRWORD Cyg_HardwareThread::get_entry_data() | |
| 262 { | |
| 263 return entry_data; | |
| 264 } | |
| 265 | |
| 266 // ------------------------------------------------------------------------- | |
| 267 // Allocate some memory at the lower end of the stack | |
| 268 // by moving the stack limit pointer. | |
| 269 | |
| 270 #ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT | |
| 271 | |
| 272 inline void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size) | |
| 273 { | |
| 274 stack_limit += size; | |
| 275 return (void *)(stack_limit - size); | |
| 276 } | |
| 277 | |
| 278 | |
| 279 inline CYG_ADDRESS | |
| 280 Cyg_HardwareThread::get_stack_limit() | |
| 281 { | |
| 282 return stack_limit; | |
| 283 } | |
| 284 | |
| 285 #endif | |
| 286 | |
| 287 //========================================================================== | |
| 288 // Inlines for Cyg_Thread class | |
| 289 | |
| 290 inline Cyg_Thread *Cyg_Thread::self() | |
| 291 { | |
| 292 return Cyg_Scheduler::get_current_thread(); | |
| 293 } | |
| 294 | |
| 295 // ------------------------------------------------------------------------- | |
| 296 | |
| 297 inline void Cyg_Thread::yield() | |
| 298 { | |
| 299 self()->Cyg_SchedThread::yield(); | |
| 300 } | |
| 301 | |
| 302 // ------------------------------------------------------------------------- | |
| 303 | |
| 304 inline void | |
| 305 Cyg_Thread::rotate_queue( cyg_priority pri ) | |
| 306 { | |
| 307 self()->Cyg_SchedThread::rotate_queue( pri ); | |
| 308 } | |
| 2 | 309 |
| 310 // ------------------------------------------------------------------------- | |
| 311 | |
| 312 inline void | |
| 313 Cyg_Thread::to_queue_head( void ) | |
| 314 { | |
| 315 this->Cyg_SchedThread::to_queue_head(); | |
| 316 } | |
| 0 | 317 |
| 318 // ------------------------------------------------------------------------- | |
| 319 | |
| 320 #ifdef CYGIMP_THREAD_PRIORITY | |
| 321 | |
| 322 inline cyg_priority Cyg_Thread::get_priority() | |
| 323 { | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
324 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE |
| 0 | 325 |
| 326 // If we have an inherited priority, return our original | |
| 327 // priority rather than the current one. | |
| 328 | |
| 329 if( priority_inherited ) return original_priority; | |
| 330 | |
| 331 #endif | |
| 332 | |
| 333 return priority; | |
| 334 } | |
| 335 | |
| 336 // Return the actual dispatching priority of the thread | |
| 337 // regardless of inheritance or scheduling concerns. | |
| 338 inline cyg_priority Cyg_Thread::get_current_priority() | |
| 339 { | |
| 340 return priority; | |
| 341 } | |
| 342 | |
| 343 #endif | |
| 344 | |
| 345 // ------------------------------------------------------------------------- | |
| 346 | |
| 347 inline void Cyg_Thread::set_sleep_reason( cyg_reason reason) | |
| 348 { | |
| 349 self()->sleep_reason = reason; | |
| 350 self()->wake_reason = NONE; | |
| 351 } | |
| 352 | |
| 353 // ------------------------------------------------------------------------- | |
| 354 | |
| 355 inline Cyg_Thread::cyg_reason Cyg_Thread::get_sleep_reason() | |
| 356 { | |
| 357 return sleep_reason; | |
| 358 } | |
| 359 | |
| 360 // ------------------------------------------------------------------------- | |
| 361 | |
| 362 inline void Cyg_Thread::set_wake_reason( cyg_reason reason ) | |
| 363 { | |
| 364 sleep_reason = NONE; | |
| 365 wake_reason = reason; | |
| 366 } | |
| 367 | |
| 368 // ------------------------------------------------------------------------- | |
| 369 | |
| 370 inline Cyg_Thread::cyg_reason Cyg_Thread::get_wake_reason() | |
| 371 { | |
| 372 return wake_reason; | |
| 373 } | |
| 374 | |
| 375 // ------------------------------------------------------------------------- | |
| 376 | |
| 377 inline void Cyg_Thread::set_timer( | |
| 378 cyg_tick_count trigger, | |
| 379 cyg_reason reason | |
| 380 ) | |
| 381 { | |
| 382 #ifdef CYGFUN_KERNEL_THREADS_TIMER | |
| 383 self()->sleep_reason = reason; | |
| 384 self()->wake_reason = NONE; | |
| 385 self()->timer.initialize( trigger); | |
| 386 #endif | |
| 387 } | |
| 388 | |
| 389 // ------------------------------------------------------------------------- | |
| 390 | |
| 391 inline void Cyg_Thread::clear_timer() | |
| 392 { | |
| 393 #ifdef CYGFUN_KERNEL_THREADS_TIMER | |
| 394 self()->timer.disable(); | |
| 395 #endif | |
| 396 } | |
| 397 | |
| 398 // ------------------------------------------------------------------------- | |
| 399 | |
| 400 #ifdef CYGVAR_KERNEL_THREADS_DATA | |
| 401 | |
| 402 inline CYG_ADDRWORD Cyg_Thread::get_data( cyg_ucount32 index ) | |
| 403 { | |
| 404 CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, | |
| 405 "Per thread data index out of bounds"); | |
| 406 CYG_ASSERT( (thread_data_map & (1<<index)) == 0, | |
| 407 "Unallocated index used"); | |
| 408 | |
| 409 return self()->thread_data[index]; | |
| 410 } | |
| 411 | |
| 412 inline CYG_ADDRWORD *Cyg_Thread::get_data_ptr( cyg_ucount32 index ) | |
| 413 { | |
| 414 CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, | |
| 415 "Per thread data index out of bounds"); | |
| 416 CYG_ASSERT( (thread_data_map & (1<<index)) == 0, | |
| 417 "Unallocated index used"); | |
| 418 | |
| 419 return &(self()->thread_data[index]); | |
| 420 } | |
| 421 | |
| 422 inline void Cyg_Thread::set_data( cyg_ucount32 index, CYG_ADDRWORD data ) | |
| 423 { | |
| 424 CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, | |
| 425 "Per thread data index out of bounds"); | |
| 426 CYG_ASSERT( (thread_data_map & (1<<index)) == 0, | |
| 427 "Unallocated index used"); | |
| 428 | |
| 429 thread_data[index] = data; | |
| 430 } | |
| 431 | |
| 432 #endif | |
| 433 | |
| 434 // ------------------------------------------------------------------------- | |
| 435 | |
| 436 #ifdef CYGVAR_KERNEL_THREADS_NAME | |
| 437 | |
| 438 inline char *Cyg_Thread::get_name() | |
| 439 { | |
| 440 return name; | |
| 441 } | |
| 442 | |
| 443 #endif | |
| 444 | |
| 445 // ------------------------------------------------------------------------- | |
| 446 | |
| 447 #ifdef CYGVAR_KERNEL_THREADS_LIST | |
| 448 | |
| 449 inline Cyg_Thread *Cyg_Thread::get_list_head() | |
| 450 { | |
| 451 return thread_list?thread_list->list_next:0; | |
| 452 } | |
| 453 | |
| 454 inline Cyg_Thread *Cyg_Thread::get_list_next() | |
| 455 { | |
| 456 return (this==thread_list)?0:list_next; | |
| 457 } | |
| 458 | |
| 459 #endif | |
| 460 | |
| 461 | |
| 462 // ------------------------------------------------------------------------- | |
| 463 | |
| 464 #ifdef CYGPKG_KERNEL_EXCEPTIONS | |
| 465 | |
| 466 inline void Cyg_Thread::register_exception( | |
| 467 cyg_code exception_number, // exception number | |
| 468 cyg_exception_handler handler, // handler function | |
| 469 CYG_ADDRWORD data, // data argument | |
| 470 cyg_exception_handler **old_handler, // handler function | |
| 471 CYG_ADDRWORD *old_data // data argument | |
| 472 ) | |
| 473 { | |
| 474 self()->exception_control.register_exception( | |
| 475 exception_number, | |
| 476 handler, | |
| 477 data, | |
| 478 old_handler, | |
| 479 old_data | |
| 480 ); | |
| 481 } | |
| 482 | |
| 483 inline void Cyg_Thread::deregister_exception( | |
| 484 cyg_code exception_number // exception number | |
| 485 ) | |
| 486 { | |
| 487 self()->exception_control.deregister_exception( | |
| 488 exception_number | |
| 489 ); | |
| 490 } | |
| 491 | |
| 492 #endif | |
| 493 | |
| 494 //========================================================================== | |
| 495 // Inlines for Cyg_ThreadTimer class | |
| 496 | |
| 497 // ------------------------------------------------------------------------- | |
| 498 #if defined(CYGFUN_KERNEL_THREADS_TIMER) && defined(CYGVAR_KERNEL_COUNTERS_CLOCK) | |
| 499 | |
| 500 inline Cyg_ThreadTimer::Cyg_ThreadTimer( | |
| 501 Cyg_Thread *th | |
| 502 ) | |
| 503 : Cyg_Alarm(Cyg_Clock::real_time_clock, | |
| 504 &alarm, | |
| 505 CYG_ADDRWORD(this) | |
| 506 ) | |
| 507 { | |
| 508 thread = th; | |
| 509 } | |
| 510 | |
| 511 #endif | |
| 512 | |
| 513 //========================================================================== | |
| 514 // Inlines for Cyg_ThreadQueue class | |
| 515 | |
| 516 | |
| 517 inline void Cyg_ThreadQueue::enqueue(Cyg_Thread *thread) | |
| 518 { | |
| 519 Cyg_ThreadQueue_Implementation::enqueue(thread); | |
| 520 } | |
| 521 | |
| 522 // ------------------------------------------------------------------------- | |
| 523 | |
| 524 inline Cyg_Thread *Cyg_ThreadQueue::highpri() | |
| 525 { | |
| 526 return Cyg_ThreadQueue_Implementation::highpri(); | |
| 527 } | |
| 528 | |
| 529 // ------------------------------------------------------------------------- | |
| 530 | |
| 531 inline Cyg_Thread *Cyg_ThreadQueue::dequeue() | |
| 532 { | |
| 533 return Cyg_ThreadQueue_Implementation::dequeue(); | |
| 534 } | |
| 535 | |
| 536 // ------------------------------------------------------------------------- | |
| 537 | |
| 538 inline void Cyg_ThreadQueue::remove(Cyg_Thread *thread) | |
| 539 { | |
| 540 Cyg_ThreadQueue_Implementation::remove(thread); | |
| 541 } | |
| 542 | |
| 543 // ------------------------------------------------------------------------- | |
| 544 | |
| 545 inline cyg_bool Cyg_ThreadQueue::empty() | |
| 546 { | |
| 547 return Cyg_ThreadQueue_Implementation::empty(); | |
| 548 } | |
| 549 | |
| 550 // ------------------------------------------------------------------------- | |
| 551 #endif // ifndef CYGONCE_KERNEL_THREAD_INL | |
| 552 // EOF thread.inl |
