Changeset 32fffef0 in mainline
- Timestamp:
- 2006-08-29T11:06:57Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0fa6044
- Parents:
- c8ea4a8b
- Location:
- kernel
- Files:
-
- 1 added
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/proc/task.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup amd64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __amd64_TASK_H__36 #define __amd64_TASK_H__35 #ifndef KERN_amd64_TASK_H_ 36 #define KERN_amd64_TASK_H_ 37 37 38 38 #include <typedefs.h> … … 47 47 #endif 48 48 49 49 /** @} 50 50 */ 51 -
kernel/arch/amd64/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup amd64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __amd64_THREAD_H__36 #define __amd64_THREAD_H__35 #ifndef KERN_amd64_THREAD_H_ 36 #define KERN_amd64_THREAD_H_ 37 37 38 38 #include <arch/types.h> … … 42 42 } thread_arch_t; 43 43 44 #define thr_constructor_arch(t) 45 #define thr_destructor_arch(t) 46 44 47 #endif 45 48 46 49 /** @} 47 50 */ 48 -
kernel/arch/amd64/src/proc/thread.c
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup amd64proc 30 30 * @{ 31 31 */ … … 44 44 } 45 45 46 46 /** @} 47 47 */ 48 -
kernel/arch/ia32/include/proc/task.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia32proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __ia32_TASK_H__36 #define __ia32_TASK_H__35 #ifndef KERN_ia32_TASK_H_ 36 #define KERN_ia32_TASK_H_ 37 37 38 38 #include <typedefs.h> … … 47 47 #endif 48 48 49 49 /** @} 50 50 */ 51 -
kernel/arch/ia32/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia32proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __ia32_THREAD_H__36 #define __ia32_THREAD_H__35 #ifndef KERN_ia32_THREAD_H_ 36 #define KERN_ia32_THREAD_H_ 37 37 38 38 #include <arch/types.h> … … 42 42 } thread_arch_t; 43 43 44 #define thr_constructor_arch(t) 45 #define thr_destructor_arch(t) 46 44 47 #endif 45 48 46 49 /** @} 47 50 */ 48 -
kernel/arch/ia32/src/proc/scheduler.c
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia32proc 30 30 * @{ 31 31 */ … … 78 78 } 79 79 80 80 /** @} 81 81 */ 82 -
kernel/arch/ia32/src/proc/task.c
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia32proc 30 30 * @{ 31 31 */ … … 58 58 } 59 59 60 60 /** @} 61 61 */ 62 -
kernel/arch/ia32/src/proc/thread.c
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia32proc 30 30 * @{ 31 31 */ … … 44 44 } 45 45 46 46 /** @} 47 47 */ 48 48 -
kernel/arch/ia64/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ia64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __ia64_THREAD_H__36 #define __ia64_THREAD_H__35 #ifndef KERN_ia64_THREAD_H_ 36 #define KERN_ia64_THREAD_H_ 37 37 38 38 typedef struct { 39 39 } thread_arch_t; 40 40 41 #define thr_constructor_arch(t) 42 #define thr_destructor_arch(t) 41 43 #define thread_create_arch(t) 42 44 43 45 #endif 44 46 45 47 /** @} 46 48 */ 47 -
kernel/arch/mips32/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup mips32proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __mips32_THREAD_H__36 #define __mips32_THREAD_H__35 #ifndef KERN_mips32_THREAD_H_ 36 #define KERN_mips32_THREAD_H_ 37 37 38 38 typedef struct { 39 39 } thread_arch_t; 40 40 41 #define thr_constructor_arch(t) 42 #define thr_destructor_arch(t) 41 43 #define thread_create_arch(t) 42 44 43 45 #endif 44 46 45 47 /** @} 46 48 */ 47 49 -
kernel/arch/ppc32/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ppc32proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __ppc32_THREAD_H__36 #define __ppc32_THREAD_H__35 #ifndef KERN_ppc32_THREAD_H_ 36 #define KERN_ppc32_THREAD_H_ 37 37 38 38 typedef struct { 39 39 } thread_arch_t; 40 40 41 #define thr_constructor_arch(t) 42 #define thr_destructor_arch(t) 41 43 #define thread_create_arch(t) 42 44 43 45 #endif 44 46 45 47 /** @} 46 48 */ 47 -
kernel/arch/ppc64/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup ppc64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __ppc64_THREAD_H__36 #define __ppc64_THREAD_H__35 #ifndef KERN_ppc64_THREAD_H_ 36 #define KERN_ppc64_THREAD_H_ 37 37 38 38 typedef struct { 39 39 } thread_arch_t; 40 40 41 #define thr_constructor_arch(t) 42 #define thr_destructor_arch(t) 41 43 #define thread_create_arch(t) 42 44 43 45 #endif 44 46 45 47 /** @} 46 48 */ 47 49 -
kernel/arch/sparc64/Makefile.inc
rc8ea4a8b r32fffef0 95 95 arch/$(ARCH)/src/start.S \ 96 96 arch/$(ARCH)/src/proc/scheduler.c \ 97 arch/$(ARCH)/src/proc/thread.c \ 97 98 arch/$(ARCH)/src/trap/trap_table.S \ 98 99 arch/$(ARCH)/src/trap/trap.c \ -
kernel/arch/sparc64/include/arch.h
rc8ea4a8b r32fffef0 30 30 * @{ 31 31 */ 32 /** @file 32 /** 33 * @file 34 * @brief Various sparc64-specific macros. 33 35 */ 34 36 … … 39 41 #define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ 40 42 43 #define NWINDOW 8 /** Number of register window sets. */ 44 41 45 #endif 42 46 43 47 /** @} 44 48 */ 45 -
kernel/arch/sparc64/include/barrier.h
rc8ea4a8b r32fffef0 52 52 * The FLUSH instruction takes address parameter. 53 53 * As such, it may trap if the address is not found in DTLB. 54 * However, JPS1 implementations are free to ignore the trap. 54 * 55 * The entire kernel text is mapped by a locked ITLB and 56 * DTLB entries. Therefore, when this function is called, 57 * the %o7 register will always be in the range mapped by 58 * DTLB. 55 59 */ 56 60 57 __asm__ volatile ("flush % 0\n" :: "r" (0x400000));61 __asm__ volatile ("flush %o7\n"); 58 62 } 59 63 -
kernel/arch/sparc64/include/proc/thread.h
rc8ea4a8b r32fffef0 27 27 */ 28 28 29 29 /** @addtogroup sparc64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef __sparc64_THREAD_H__ 36 #define __sparc64_THREAD_H__ 35 #ifndef KERN_sparc64_THREAD_H_ 36 #define KERN_sparc64_THREAD_H_ 37 38 #include <arch/types.h> 39 #include <arch/arch.h> 37 40 38 41 typedef struct { 42 /** Buffer for register windows with userspace content. */ 43 uint8_t *uspace_window_buffer; 39 44 } thread_arch_t; 40 41 #define thread_create_arch(t)42 45 43 46 #endif 44 47 45 48 /** @} 46 49 */ 47 -
kernel/arch/sparc64/include/trap/regwin.h
rc8ea4a8b r32fffef0 51 51 #define FILL_HANDLER_SIZE REGWIN_HANDLER_SIZE 52 52 53 #define NWINDOW 854 55 53 /* Window Save Area offsets. */ 56 54 #define L0_OFFSET 0 … … 250 248 /** @} 251 249 */ 252 -
kernel/generic/include/mm/frame.h
rc8ea4a8b r32fffef0 28 28 */ 29 29 30 30 /** @addtogroup genericmm 31 31 * @{ 32 32 */ … … 34 34 */ 35 35 36 #ifndef __FRAME_H__37 #define __FRAME_H__36 #ifndef KERN_FRAME_H_ 37 #define KERN_FRAME_H_ 38 38 39 39 #include <arch/types.h> … … 62 62 #define FRAME_NO_RECLAIM 0x4 /* do not start reclaiming when no free memory */ 63 63 64 #define FRAME_OK 0 /* frame_alloc return status */65 #define FRAME_NO_MEMORY 1 /* frame_alloc return status */66 #define FRAME_ERROR 2 /* frame_alloc return status */67 68 64 static inline uintptr_t PFN2ADDR(pfn_t frame) 69 65 { … … 89 85 #define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1) 90 86 91 #define frame_alloc(order, flags) 87 #define frame_alloc(order, flags) frame_alloc_generic(order, flags, NULL) 92 88 93 89 extern void frame_init(void); … … 112 108 #endif 113 109 114 110 /** @} 115 111 */ 116 -
kernel/generic/include/proc/thread.h
rc8ea4a8b r32fffef0 53 53 #define THREAD_STACK_SIZE STACK_SIZE 54 54 55 /** <Thread states. */55 /** Thread states. */ 56 56 enum state { 57 57 Invalid, /**< It is an error, if thread is found in this state. */ … … 66 66 extern char *thread_states[]; 67 67 68 /** <Join types. */68 /** Join types. */ 69 69 typedef enum { 70 70 None, … … 73 73 } thread_join_type_t; 74 74 75 #define X_WIRED (1<<0) 76 #define X_STOLEN (1<<1) 75 /* Thread flags */ 76 #define THREAD_FLAG_WIRED (1<<0) /**< Thread cannot be migrated to another CPU. */ 77 #define THREAD_FLAG_STOLEN (1<<1) /**< Thread was migrated to another CPU and has not run yet. */ 78 #define THREAD_FLAG_USPACE (1<<2) /**< Thread executes in userspace. */ 77 79 78 80 #define THREAD_NAME_BUFLEN 20 … … 128 130 * Defined only if thread doesn't run. 129 131 * It means that fpu context is in CPU that last time executes this thread. 130 * This disables migration 132 * This disables migration. 131 133 */ 132 134 int fpu_context_engaged; … … 150 152 thread_arch_t arch; /**< Architecture-specific data. */ 151 153 152 uint8_t *kstack; 154 uint8_t *kstack; /**< Thread's kernel stack. */ 153 155 }; 154 156 … … 171 173 extern void thread_create_arch(thread_t *t); 172 174 #endif 175 #ifndef thr_constructor_arch 176 extern void thr_constructor_arch(thread_t *t); 177 #endif 178 #ifndef thr_destructor_arch 179 extern void thr_destructor_arch(thread_t *t); 180 #endif 173 181 174 182 extern void thread_sleep(uint32_t sec); -
kernel/generic/src/main/kinit.c
rc8ea4a8b r32fffef0 101 101 * Just a beautification. 102 102 */ 103 if ((t = thread_create(kmp, NULL, TASK, 0, "kmp"))) {103 if ((t = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, "kmp"))) { 104 104 spinlock_lock(&t->lock); 105 t->flags |= X_WIRED;106 105 t->cpu = &cpus[0]; 107 106 spinlock_unlock(&t->lock); … … 127 126 for (i = 0; i < config.cpu_count; i++) { 128 127 129 if ((t = thread_create(kcpulb, NULL, TASK, 0, "kcpulb"))) {128 if ((t = thread_create(kcpulb, NULL, TASK, THREAD_FLAG_WIRED, "kcpulb"))) { 130 129 spinlock_lock(&t->lock); 131 t->flags |= X_WIRED;132 130 t->cpu = &cpus[i]; 133 131 spinlock_unlock(&t->lock); -
kernel/generic/src/mm/frame.c
rc8ea4a8b r32fffef0 929 929 * @param order Allocate exactly 2^order frames. 930 930 * @param flags Flags for host zone selection and address processing. 931 * @param status Allocation status (FRAME_OK on success), unused if NULL.932 931 * @param pzone Preferred zone 933 932 * … … 988 987 /** Free a frame. 989 988 * 990 * Find respective frame structure for supplied PFN.989 * Find respective frame structure for supplied physical frame address. 991 990 * Decrement frame reference count. 992 991 * If it drops to zero, move the frame structure to free list. -
kernel/generic/src/proc/scheduler.c
rc8ea4a8b r32fffef0 142 142 spinlock_unlock(&THREAD->lock); 143 143 spinlock_unlock(&CPU->lock); 144 THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, 145 0); 144 THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, 0); 146 145 /* We may have switched CPUs during slab_alloc */ 147 146 goto restart; … … 236 235 237 236 /* 238 * Clear the X_STOLEN flag so that t can be migrated when load balancing needs emerge. 237 * Clear the THREAD_FLAG_STOLEN flag so that t can be migrated 238 * when load balancing needs emerge. 239 239 */ 240 t->flags &= ~ X_STOLEN;240 t->flags &= ~THREAD_FLAG_STOLEN; 241 241 spinlock_unlock(&t->lock); 242 242 … … 350 350 */ 351 351 context_save(&CPU->saved_context); 352 context_set(&CPU->saved_context, FADDR(scheduler_separated_stack), (uintptr_t) CPU->stack, CPU_STACK_SIZE); 352 context_set(&CPU->saved_context, FADDR(scheduler_separated_stack), 353 (uintptr_t) CPU->stack, CPU_STACK_SIZE); 353 354 context_restore(&CPU->saved_context); 354 355 /* not reached */ … … 484 485 485 486 #ifdef SCHEDULER_VERBOSE 486 printf("cpu%d: tid %d (priority=%d,ticks=%lld,nrdy=%ld)\n", CPU->id, THREAD->tid, THREAD->priority, THREAD->ticks, atomic_get(&CPU->nrdy)); 487 printf("cpu%d: tid %d (priority=%d,ticks=%lld,nrdy=%ld)\n", 488 CPU->id, THREAD->tid, THREAD->priority, THREAD->ticks, atomic_get(&CPU->nrdy)); 487 489 #endif 488 490 … … 557 559 /* 558 560 * Not interested in ourselves. 559 * Doesn't require interrupt disabling for kcpulb is X_WIRED.561 * Doesn't require interrupt disabling for kcpulb has THREAD_FLAG_WIRED. 560 562 */ 561 563 if (CPU == cpu) … … 578 580 t = list_get_instance(l, thread_t, rq_link); 579 581 /* 580 * We don't want to steal CPU-wired threads neither threads already stolen. 581 * The latter prevents threads from migrating between CPU's without ever being run. 582 * We don't want to steal threads whose FPU context is still in CPU. 582 * We don't want to steal CPU-wired threads neither threads already 583 * stolen. The latter prevents threads from migrating between CPU's 584 * without ever being run. We don't want to steal threads whose FPU 585 * context is still in CPU. 583 586 */ 584 587 spinlock_lock(&t->lock); 585 if ( (!(t->flags & (X_WIRED | X_STOLEN))) && (!(t->fpu_context_engaged)) ) { 588 if ((!(t->flags & (THREAD_FLAG_WIRED | THREAD_FLAG_STOLEN))) && 589 (!(t->fpu_context_engaged)) ) { 586 590 /* 587 591 * Remove t from r. … … 609 613 spinlock_lock(&t->lock); 610 614 #ifdef KCPULB_VERBOSE 611 printf("kcpulb%d: TID %d -> cpu%d, nrdy=%ld, avg=%nd\n", CPU->id, t->tid, CPU->id, atomic_get(&CPU->nrdy), atomic_get(&nrdy) / config.cpu_active); 615 printf("kcpulb%d: TID %d -> cpu%d, nrdy=%ld, avg=%nd\n", 616 CPU->id, t->tid, CPU->id, atomic_get(&CPU->nrdy), 617 atomic_get(&nrdy) / config.cpu_active); 612 618 #endif 613 t->flags |= X_STOLEN;619 t->flags |= THREAD_FLAG_STOLEN; 614 620 t->state = Entering; 615 621 spinlock_unlock(&t->lock); -
kernel/generic/src/proc/thread.c
rc8ea4a8b r32fffef0 130 130 link_initialize(&t->wq_link); 131 131 link_initialize(&t->th_link); 132 133 /* call the architecture-specific part of the constructor */ 134 thr_constructor_arch(t); 132 135 133 136 #ifdef ARCH_HAS_FPU … … 157 160 { 158 161 thread_t *t = (thread_t *) obj; 162 163 /* call the architecture-specific part of the destructor */ 164 thr_destructor_arch(t); 159 165 160 166 frame_free(KA2PA(t->kstack)); … … 211 217 212 218 cpu = CPU; 213 if (t->flags & X_WIRED) {219 if (t->flags & THREAD_FLAG_WIRED) { 214 220 cpu = t->cpu; 215 221 } … … 296 302 if (!t) 297 303 return NULL; 298 299 thread_create_arch(t);300 304 301 305 /* Not needed, but good for debugging */ … … 324 328 t->priority = -1; /* start in rq[0] */ 325 329 t->cpu = NULL; 326 t->flags = 0;330 t->flags = flags; 327 331 t->state = Entering; 328 332 t->call_me = NULL; … … 348 352 t->fpu_context_exists = 0; 349 353 t->fpu_context_engaged = 0; 354 355 thread_create_arch(t); /* might depend on previous initialization */ 350 356 351 357 /* … … 590 596 } 591 597 592 if ((t = thread_create(uinit, kernel_uarg, TASK, 0, namebuf))) {598 if ((t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf))) { 593 599 tid = t->tid; 594 600 thread_ready(t);
Note:
See TracChangeset
for help on using the changeset viewer.