- Timestamp:
- 2006-09-03T23:37:14Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fd85ae5
- Parents:
- 002e613
- Location:
- kernel
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/include/asm.h
r002e613 rcfa70add 331 331 extern void write_to_ig_g6(uint64_t val); 332 332 333 extern void switch_to_userspace(uint64_t pc, uint64_t sp );333 extern void switch_to_userspace(uint64_t pc, uint64_t sp, uint64_t uarg); 334 334 335 335 #endif -
kernel/arch/sparc64/include/mm/as.h
r002e613 rcfa70add 43 43 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff 44 44 45 #define USTACK_ADDRESS_ARCH (0x 7fffffffffffffff-(PAGE_SIZE-1))45 #define USTACK_ADDRESS_ARCH (0xffffffffffffffffULL-(PAGE_SIZE-1)) 46 46 47 47 extern void as_arch_init(void); -
kernel/arch/sparc64/include/mm/tlb.h
r002e613 rcfa70add 180 180 static inline void mmu_secondary_context_write(uint64_t v) 181 181 { 182 asi_u64_write(ASI_DMMU, VA_ PRIMARY_CONTEXT_REG, v);182 asi_u64_write(ASI_DMMU, VA_SECONDARY_CONTEXT_REG, v); 183 183 flush(); 184 184 } -
kernel/arch/sparc64/include/trap/mmu.h
r002e613 rcfa70add 128 128 .macro HANDLE_MMU_TRAPS_FROM_SPILL_OR_FILL 129 129 rdpr %tl, %g1 130 dec %g1131 brz %g 1, 0f ! if TL was 1, skip130 sub %g1, 1, %g2 131 brz %g2, 0f ! if TL was 1, skip 132 132 nop 133 wrpr %g1, 0, %tl ! TL-- 134 rdpr %tt, %g2 135 cmp %g2, TT_SPILL_1_NORMAL 136 be 0f ! trap from spill_1_normal 137 cmp %g2, TT_FILL_1_NORMAL 138 be 0f ! trap from fill_1_normal 139 inc %g1 140 wrpr %g1, 0, %tl ! another trap, TL++ 133 wrpr %g2, 0, %tl ! TL-- 134 rdpr %tt, %g3 135 cmp %g3, TT_SPILL_1_NORMAL 136 be 0f ! trap from spill_1_normal? 137 cmp %g3, TT_FILL_1_NORMAL 138 bne,a 0f ! trap from fill_1_normal? (negated condition) 139 wrpr %g1, 0, %tl ! TL++ 141 140 0: 142 141 .endm -
kernel/arch/sparc64/src/asm.S
r002e613 rcfa70add 151 151 * %o0 Userspace entry address. 152 152 * %o1 Userspace stack pointer address. 153 * %o2 Userspace address of uarg structure. 153 154 */ 154 155 .global switch_to_userspace … … 157 158 wrpr %g0, 0, %cleanwin ! avoid information leak 158 159 save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp 160 161 mov %i3, %o0 ! uarg 159 162 160 163 clr %i2 … … 179 182 stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi 180 183 flush %i7 184 185 /* 186 * Spills and fills will be handled by the userspace handlers. 187 */ 188 wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate 181 189 182 190 done ! jump to userspace -
kernel/arch/sparc64/src/context.S
r002e613 rcfa70add 28 28 29 29 #include <arch/context_offset.h> 30 #include <arch/stack.h>31 30 32 31 /** -
kernel/arch/sparc64/src/mm/tlb.c
r002e613 rcfa70add 137 137 data.cp = t->c; 138 138 data.cv = t->c; 139 data.p = t-> p;139 data.p = t->k; /* p like privileged */ 140 140 data.w = ro ? false : t->w; 141 141 data.g = t->g; … … 167 167 data.cp = t->c; 168 168 data.cv = t->c; 169 data.p = t-> p;169 data.p = t->k; /* p like privileged */ 170 170 data.w = false; 171 171 data.g = t->g; -
kernel/arch/sparc64/src/proc/scheduler.c
r002e613 rcfa70add 127 127 ASSERT(THREAD->arch.uspace_window_buffer); 128 128 129 flushw(); /* force all userspace windows into memory */130 131 129 uintptr_t uw_buf = ALIGN_DOWN((uintptr_t) THREAD->arch.uspace_window_buffer, PAGE_SIZE); 132 130 if (!overlaps(uw_buf, PAGE_SIZE, base, 1<<KERNEL_PAGE_WIDTH)) { -
kernel/arch/sparc64/src/sparc64.c
r002e613 rcfa70add 48 48 49 49 bootinfo_t bootinfo; 50 51 void arch_pre_main(void) 52 { 53 /* Setup usermode */ 54 init.cnt = bootinfo.taskmap.count; 55 56 uint32_t i; 57 58 for (i = 0; i < bootinfo.taskmap.count; i++) { 59 init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr); 60 init.tasks[i].size = bootinfo.taskmap.tasks[i].size; 61 } 62 } 50 63 51 64 void arch_pre_mm_init(void) … … 99 112 switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry, 100 113 ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE 101 - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS)); 114 - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS), 115 (uintptr_t) kernel_uarg->uspace_uarg); 102 116 103 117 for (;;) -
kernel/arch/sparc64/src/start.S
r002e613 rcfa70add 209 209 ! set TL back to 0 210 210 wrpr %g0, 0, %tl 211 212 call arch_pre_main 213 nop 211 214 212 215 call main_bsp -
kernel/arch/sparc64/src/trap/trap_table.S
r002e613 rcfa70add 219 219 SPILL_TO_USPACE_WINDOW_BUFFER 220 220 221 /* TT = 0xa0, TL = 0, spill_0_other handler */ 222 .org trap_table + TT_SPILL_0_OTHER*ENTRY_SIZE 223 .global spill_0_other 224 spill_0_other: 225 SPILL_TO_USPACE_WINDOW_BUFFER 226 221 227 /* TT = 0xc0, TL = 0, fill_0_normal handler */ 222 228 .org trap_table + TT_FILL_0_NORMAL*ENTRY_SIZE … … 548 554 549 555 /* 550 * Mark the CAN SAVE windows as OTHER windows.556 * Mark the CANRESTORE windows as OTHER windows. 551 557 * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur. 552 558 */ 553 rdpr %can save, %l0559 rdpr %canrestore, %l0 554 560 wrpr %l0, %otherwin 555 wrpr %g0, %can save561 wrpr %g0, %canrestore 556 562 wrpr %g0, NWINDOW - 1, %cleanwin 557 563 … … 642 648 /* 643 649 * If OTHERWIN is zero, then all the userspace windows have been 644 * spilled to kernel memory (i.e. register window buffer). If 645 * OTHERWIN is non-zero, then some userspace windows are still 650 * spilled to kernel memory (i.e. register window buffer). Moreover, 651 * if the scheduler was called in the meantime, all valid windows 652 * belonging to other threads were spilled by context_restore(). 653 * If OTHERWIN is non-zero, then some userspace windows are still 646 654 * valid. Others might have been spilled. However, the CWP pointer 647 655 * needs no fixing because the scheduler had not been called. … … 660 668 and %g1, TSTATE_CWP_MASK, %l0 661 669 inc %l0 662 and %l0, TSTATE_CWP_MASK, %l0 ! %l0 mod NWINDOW670 and %l0, NWINDOW - 1, %l0 ! %l0 mod NWINDOW 663 671 rdpr %cwp, %l1 664 672 cmp %l0, %l1 … … 668 676 /* 669 677 * Fix CWP. 670 * Just for reminder, the input registers in the current window671 * are the output registers of the window to which we want to672 * restore. Because the fill trap fills only input and local678 * In order to recapitulate, the input registers in the current 679 * window are the output registers of the window to which we want 680 * to restore. Because the fill trap fills only input and local 673 681 * registers of a window, we need to preserve those output 674 682 * registers manually. 675 683 */ 676 flushw677 684 mov %sp, %g2 678 685 stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] … … 739 746 */ 740 747 clr %g4 741 0: andcc %g7, PAGE_WIDTH - 1, %g0 ! PAGE_SIZE alignment check 748 set PAGE_SIZE - 1, %g5 749 0: andcc %g7, %g5, %g0 ! PAGE_SIZE alignment check 742 750 bz 0f ! %g7 is page-aligned, no more windows to refill 743 751 nop -
kernel/generic/src/proc/task.c
r002e613 rcfa70add 221 221 * Create the main thread. 222 222 */ 223 t1 = thread_create(uinit, kernel_uarg, task, 0, "uinit");223 t1 = thread_create(uinit, kernel_uarg, task, THREAD_FLAG_USPACE, "uinit"); 224 224 ASSERT(t1); 225 225
Note:
See TracChangeset
for help on using the changeset viewer.