Changeset 0af7a09 in mainline
- Timestamp:
- 2006-12-21T08:02:01Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b84ce45
- Parents:
- 730376d
- Location:
- kernel/arch/sparc64/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/cpu/cpu.c
r730376d r0af7a09 41 41 #include <arch/types.h> 42 42 #include <arch/drivers/tick.h> 43 #include <arch/mm/page.h>44 #include <arch/mm/tlb.h>45 #include <macros.h>46 43 47 44 /** Perform sparc64 specific initialization of the processor structure for the … … 81 78 CPU->arch.clock_frequency = clock_frequency; 82 79 tick_init(); 83 84 /*85 * Lock CPU stack in DTLB.86 */87 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);88 89 if (!overlaps((uintptr_t) CPU->stack, PAGE_SIZE, base, (1 <<90 KERNEL_PAGE_WIDTH))) {91 /*92 * Kernel stack of this processor is not locked in DTLB.93 * First, demap any already existing mappings.94 * Second, create a locked mapping for it.95 */96 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t)97 CPU->stack);98 dtlb_insert_mapping((uintptr_t) CPU->stack, KA2PA(CPU->stack),99 PAGESIZE_8K, true, true);100 }101 80 } 102 81 -
kernel/arch/sparc64/src/proc/scheduler.c
r730376d r0af7a09 37 37 #include <arch.h> 38 38 #include <arch/asm.h> 39 #include <arch/regdef.h>40 39 #include <arch/stack.h> 41 #include <arch/mm/tlb.h>42 #include <arch/mm/page.h>43 #include <config.h>44 #include <align.h>45 #include <macros.h>46 40 47 41 /** Perform sparc64 specific tasks needed before the new task is run. */ … … 52 46 /** Perform sparc64 specific steps before scheduling a thread. 53 47 * 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. 48 * For userspace threads, initialize reserved global registers in the alternate 49 * and interrupt sets. 57 50 */ 58 51 void before_thread_runs_arch(void) 59 52 { 60 uintptr_t base;61 62 base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH);63 64 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1 <<65 KERNEL_PAGE_WIDTH))) {66 /*67 * Kernel stack of this thread is not locked in DTLB.68 * First, make sure it is not mapped already.69 * If not, create a locked mapping for it.70 */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);75 }76 77 53 if ((THREAD->flags & THREAD_FLAG_USPACE)) { 78 /*79 * If this thread executes also in userspace, we have to lock80 * its userspace window buffer into DTLB.81 */82 ASSERT(THREAD->arch.uspace_window_buffer);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 {87 /*88 * The buffer is not covered by the 4M locked kernel89 * DTLB entry.90 */91 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, uw_buf);92 dtlb_insert_mapping(uw_buf, KA2PA(uw_buf), PAGESIZE_8K,93 true, true);94 }95 96 54 /* 97 55 * Write kernel stack address to %g6 of the alternate and … … 114 72 } 115 73 116 /** Perform sparc64 specific steps before a thread stops running. 117 * 118 * Demap any locked DTLB entries installed by the thread (i.e. kernel stack 119 * and userspace window buffer). 120 */ 74 /** Perform sparc64 specific steps before a thread stops running. */ 121 75 void after_thread_ran_arch(void) 122 76 { 123 uintptr_t base;124 125 base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);126 127 if (!overlaps((uintptr_t) THREAD->kstack, PAGE_SIZE, base, (1 <<128 KERNEL_PAGE_WIDTH))) {129 /*130 * Kernel stack of this thread is locked in DTLB.131 * Destroy the mapping.132 */133 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t)134 THREAD->kstack);135 }136 137 77 if ((THREAD->flags & THREAD_FLAG_USPACE)) { 138 /*139 * If this thread executes also in userspace, we have to140 * demap the userspace window buffer from DTLB.141 */142 ASSERT(THREAD->arch.uspace_window_buffer);143 144 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t)145 THREAD->arch.uspace_window_buffer, PAGE_SIZE);146 if (!overlaps(uw_buf, PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {147 /*148 * The buffer is not covered by the 4M locked kernel DTLB entry149 * and therefore it was given a dedicated locked DTLB entry.150 * Demap it.151 */152 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, uw_buf);153 }154 155 78 /* sample the state of the userspace window buffer */ 156 79 THREAD->arch.uspace_window_buffer = (uint8_t *) read_from_ag_g7(); -
kernel/arch/sparc64/src/trap/trap_table.S
r730376d r0af7a09 743 743 rd %y, %g4 744 744 745 /*746 * The following memory accesses will not fault747 * because special provisions are made to have748 * the kernel stack of THREAD locked in DTLB.749 */750 745 stx %g1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE] 751 746 stx %g2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC]
Note:
See TracChangeset
for help on using the changeset viewer.