Changeset 7e7c8747 in mainline for kernel/arch/sparc64/src/proc/scheduler.c
- Timestamp:
- 2006-12-17T12:11:00Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 95155b0c
- Parents:
- 771cd22
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/proc/scheduler.c
r771cd22 r7e7c8747 52 52 /** Perform sparc64 specific steps before scheduling a thread. 53 53 * 54 * Ensure that thread's kernel stack, as well as userspace window 55 * buffer for userspace threads, are locked in DTLB. 56 * For userspace threads, initialize reserved global registers 57 * in the alternate and interrupt sets. 54 * Ensure that thread's kernel stack, as well as userspace window buffer for 55 * userspace threads, are locked in DTLB. For userspace threads, initialize 56 * reserved global registers in the alternate and interrupt sets. 58 57 */ 59 58 void before_thread_runs_arch(void) … … 63 62 base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH); 64 63 65 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1<<KERNEL_PAGE_WIDTH))) { 64 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1 << 65 KERNEL_PAGE_WIDTH))) { 66 66 /* 67 67 * Kernel stack of this thread is not locked in DTLB. … … 69 69 * If not, create a locked mapping for it. 70 70 */ 71 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) THREAD->kstack); 72 dtlb_insert_mapping((uintptr_t) THREAD->kstack, KA2PA(THREAD->kstack), PAGESIZE_8K, true, true); 71 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) 72 THREAD->kstack); 73 dtlb_insert_mapping((uintptr_t) THREAD->kstack, 74 KA2PA(THREAD->kstack), PAGESIZE_8K, true, true); 73 75 } 74 76 … … 79 81 */ 80 82 ASSERT(THREAD->arch.uspace_window_buffer); 81 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) THREAD->arch.uspace_window_buffer, PAGE_SIZE); 82 if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { 83 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) 84 THREAD->arch.uspace_window_buffer, PAGE_SIZE); 85 if (!overlaps(uw_buf, PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) 86 { 83 87 /* 84 * The buffer is not covered by the 4M locked kernel DTLB entry. 88 * The buffer is not covered by the 4M locked kernel 89 * DTLB entry. 85 90 */ 86 91 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, uw_buf); 87 dtlb_insert_mapping(uw_buf, KA2PA(uw_buf), PAGESIZE_8K, true, true); 92 dtlb_insert_mapping(uw_buf, KA2PA(uw_buf), PAGESIZE_8K, 93 true, true); 88 94 } 89 95 90 96 /* 91 * Write kernel stack address to %g6 and a pointer to the last item 92 * in the userspace window buffer to %g7 in the alternate and interrupt sets. 97 * Write kernel stack address to %g6 and a pointer to the last 98 * item in the userspace window buffer to %g7 in the alternate 99 * and interrupt sets. 93 100 */ 94 101 uint64_t sp = (uintptr_t) THREAD->kstack + STACK_SIZE 95 - (STACK_BIAS + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)); 102 - (STACK_BIAS + ALIGN_UP(STACK_ITEM_SIZE, 103 STACK_ALIGNMENT)); 96 104 write_to_ig_g6(sp); 97 105 write_to_ag_g6(sp); … … 109 117 uintptr_t base; 110 118 111 base = ALIGN_DOWN(config.base, 1 <<KERNEL_PAGE_WIDTH);119 base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); 112 120 113 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1<<KERNEL_PAGE_WIDTH))) { 121 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1 << 122 KERNEL_PAGE_WIDTH))) { 114 123 /* 115 124 * Kernel stack of this thread is locked in DTLB. 116 125 * Destroy the mapping. 117 126 */ 118 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) THREAD->kstack); 127 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) 128 THREAD->kstack); 119 129 } 120 130 … … 126 136 ASSERT(THREAD->arch.uspace_window_buffer); 127 137 128 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) THREAD->arch.uspace_window_buffer, PAGE_SIZE); 129 if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { 138 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) 139 THREAD->arch.uspace_window_buffer, PAGE_SIZE); 140 if (!overlaps(uw_buf, PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 130 141 /* 131 142 * The buffer is not covered by the 4M locked kernel DTLB entry
Note:
See TracChangeset
for help on using the changeset viewer.