Rev 3623 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3623 | Rev 4377 | ||
|---|---|---|---|
| Line 100... | Line 100... | ||
| 100 | 100 | ||
| 101 | SPINLOCK_INITIALIZE(tidlock); |
101 | SPINLOCK_INITIALIZE(tidlock); |
| 102 | thread_id_t last_tid = 0; |
102 | thread_id_t last_tid = 0; |
| 103 | 103 | ||
| 104 | static slab_cache_t *thread_slab; |
104 | static slab_cache_t *thread_slab; |
| 105 | #ifdef ARCH_HAS_FPU |
105 | #ifdef CONFIG_FPU |
| 106 | slab_cache_t *fpu_context_slab; |
106 | slab_cache_t *fpu_context_slab; |
| 107 | #endif |
107 | #endif |
| 108 | 108 | ||
| 109 | /** Thread wrapper. |
109 | /** Thread wrapper. |
| 110 | * |
110 | * |
| Line 159... | Line 159... | ||
| 159 | link_initialize(&t->th_link); |
159 | link_initialize(&t->th_link); |
| 160 | 160 | ||
| 161 | /* call the architecture-specific part of the constructor */ |
161 | /* call the architecture-specific part of the constructor */ |
| 162 | thr_constructor_arch(t); |
162 | thr_constructor_arch(t); |
| 163 | 163 | ||
| 164 | #ifdef ARCH_HAS_FPU |
164 | #ifdef CONFIG_FPU |
| 165 | #ifdef CONFIG_FPU_LAZY |
165 | #ifdef CONFIG_FPU_LAZY |
| 166 | t->saved_fpu_context = NULL; |
166 | t->saved_fpu_context = NULL; |
| 167 | #else |
167 | #else |
| 168 | t->saved_fpu_context = slab_alloc(fpu_context_slab, kmflags); |
168 | t->saved_fpu_context = slab_alloc(fpu_context_slab, kmflags); |
| 169 | if (!t->saved_fpu_context) |
169 | if (!t->saved_fpu_context) |
| 170 | return -1; |
170 | return -1; |
| 171 | #endif |
171 | #endif |
| 172 | #endif |
172 | #endif |
| 173 | 173 | ||
| 174 | t->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); |
174 | t->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); |
| 175 | if (!t->kstack) { |
175 | if (!t->kstack) { |
| 176 | #ifdef ARCH_HAS_FPU |
176 | #ifdef CONFIG_FPU |
| 177 | if (t->saved_fpu_context) |
177 | if (t->saved_fpu_context) |
| 178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
| 179 | #endif |
179 | #endif |
| 180 | return -1; |
180 | return -1; |
| 181 | } |
181 | } |
| Line 194... | Line 194... | ||
| 194 | 194 | ||
| 195 | /* call the architecture-specific part of the destructor */ |
195 | /* call the architecture-specific part of the destructor */ |
| 196 | thr_destructor_arch(t); |
196 | thr_destructor_arch(t); |
| 197 | 197 | ||
| 198 | frame_free(KA2PA(t->kstack)); |
198 | frame_free(KA2PA(t->kstack)); |
| 199 | #ifdef ARCH_HAS_FPU |
199 | #ifdef CONFIG_FPU |
| 200 | if (t->saved_fpu_context) |
200 | if (t->saved_fpu_context) |
| 201 | slab_free(fpu_context_slab, t->saved_fpu_context); |
201 | slab_free(fpu_context_slab, t->saved_fpu_context); |
| 202 | #endif |
202 | #endif |
| 203 | return 1; /* One page freed */ |
203 | return 1; /* One page freed */ |
| 204 | } |
204 | } |
| Line 209... | Line 209... | ||
| 209 | * |
209 | * |
| 210 | */ |
210 | */ |
| 211 | void thread_init(void) |
211 | void thread_init(void) |
| 212 | { |
212 | { |
| 213 | THREAD = NULL; |
213 | THREAD = NULL; |
| 214 | atomic_set(&nrdy,0); |
214 | atomic_set(&nrdy, 0); |
| 215 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
215 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
| 216 | thr_constructor, thr_destructor, 0); |
216 | thr_constructor, thr_destructor, 0); |
| 217 | 217 | ||
| 218 | #ifdef ARCH_HAS_FPU |
218 | #ifdef CONFIG_FPU |
| 219 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
219 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
| 220 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
220 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
| 221 | #endif |
221 | #endif |
| 222 | 222 | ||
| 223 | avltree_create(&threads_tree); |
223 | avltree_create(&threads_tree); |
| Line 314... | Line 314... | ||
| 314 | ipl = interrupts_disable(); |
314 | ipl = interrupts_disable(); |
| 315 | t->saved_context.ipl = interrupts_read(); |
315 | t->saved_context.ipl = interrupts_read(); |
| 316 | interrupts_restore(ipl); |
316 | interrupts_restore(ipl); |
| 317 | 317 | ||
| 318 | memcpy(t->name, name, THREAD_NAME_BUFLEN); |
318 | memcpy(t->name, name, THREAD_NAME_BUFLEN); |
| 319 | t->name[THREAD_NAME_BUFLEN - 1] = '\0'; |
319 | t->name[THREAD_NAME_BUFLEN - 1] = 0; |
| 320 | 320 | ||
| 321 | t->thread_code = func; |
321 | t->thread_code = func; |
| 322 | t->thread_arg = arg; |
322 | t->thread_arg = arg; |
| 323 | t->ticks = -1; |
323 | t->ticks = -1; |
| 324 | t->cycles = 0; |
324 | t->cycles = 0; |
| Line 721... | Line 721... | ||
| 721 | 721 | ||
| 722 | rc = copy_from_uspace(namebuf, uspace_name, name_len); |
722 | rc = copy_from_uspace(namebuf, uspace_name, name_len); |
| 723 | if (rc != 0) |
723 | if (rc != 0) |
| 724 | return (unative_t) rc; |
724 | return (unative_t) rc; |
| 725 | 725 | ||
| 726 | namebuf[name_len] = '\0'; |
726 | namebuf[name_len] = 0; |
| 727 | 727 | ||
| 728 | /* |
728 | /* |
| 729 | * In case of failure, kernel_uarg will be deallocated in this function. |
729 | * In case of failure, kernel_uarg will be deallocated in this function. |
| 730 | * In case of success, kernel_uarg will be freed in uinit(). |
730 | * In case of success, kernel_uarg will be freed in uinit(). |
| 731 | */ |
731 | */ |