Rev 1975 | Rev 1982 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1975 | Rev 1978 | ||
|---|---|---|---|
| Line 42... | Line 42... | ||
| 42 | .register %g2, #scratch |
42 | .register %g2, #scratch |
| 43 | .register %g3, #scratch |
43 | .register %g3, #scratch |
| 44 | 44 | ||
| 45 | .section K_TEXT_START, "ax" |
45 | .section K_TEXT_START, "ax" |
| 46 | 46 | ||
| - | 47 | #define BSP_FLAG 1 |
|
| - | 48 | ||
| 47 | /* |
49 | /* |
| 48 | * Here is where the kernel is passed control |
50 | * Here is where the kernel is passed control from the boot loader. |
| 49 | * from the boot loader. |
- | |
| 50 | * |
51 | * |
| 51 | * The registers are expected to be in this state: |
52 | * The registers are expected to be in this state: |
| - | 53 | * - %o0 starting address of physical memory + bootstrap processor flag |
|
| - | 54 | * bits 63...1: physical memory starting address / 2 |
|
| 52 | * - %o0 non-zero for the bootstrap processor, zero for application/secondary processors |
55 | * bit 0: non-zero on BSP processor, zero on AP processors |
| 53 | * - %o1 bootinfo structure address |
56 | * - %o1 bootinfo structure address (BSP only) |
| 54 | * - %o2 bootinfo structure size |
57 | * - %o2 bootinfo structure size (BSP only) |
| 55 | * |
58 | * |
| 56 | * Moreover, we depend on boot having established the |
59 | * Moreover, we depend on boot having established the following environment: |
| 57 | * following environment: |
- | |
| 58 | * - TLBs are on |
60 | * - TLBs are on |
| 59 | * - identity mapping for the kernel image |
61 | * - identity mapping for the kernel image |
| 60 | */ |
62 | */ |
| 61 | 63 | ||
| 62 | .global kernel_image_start |
64 | .global kernel_image_start |
| 63 | kernel_image_start: |
65 | kernel_image_start: |
| 64 | mov %o0, %l7 |
66 | mov BSP_FLAG, %l0 |
| - | 67 | and %o0, %l0, %l7 ! l7 <= bootstrap processor? |
|
| - | 68 | andn %o0, %l0, %l6 ! l6 <= start of physical memory |
|
| - | 69 | ||
| - | 70 | sethi %hi(physmem_base), %l5 |
|
| - | 71 | stx %l6, [%l5 + %lo(physmem_base)] |
|
| - | 72 | ||
| - | 73 | /* |
|
| - | 74 | * Get bits 40:13 of physmem_base. |
|
| - | 75 | */ |
|
| - | 76 | sethi %hi(mask_40_13), %l4 |
|
| - | 77 | sethi %hi(physmem_base_40_13), %l3 |
|
| - | 78 | ldx [%l4 + %lo(mask_40_13)], %l4 |
|
| - | 79 | and %l6, %l4, %l5 ! l5 <= physmem_base[40:13] |
|
| - | 80 | stx %l5, [%l3 + %lo(physmem_base_40_13)] |
|
| 65 | 81 | ||
| 66 | /* |
82 | /* |
| - | 83 | * Prepare kernel 8K TLB data template. |
|
| - | 84 | */ |
|
| - | 85 | sethi %hi(kernel_8k_tlb_data_template), %l4 |
|
| - | 86 | ldx [%l4 + %lo(kernel_8k_tlb_data_template)], %l3 |
|
| - | 87 | or %l3, %l5, %l3 |
|
| - | 88 | stx %l3, [%l4 + %lo(kernel_8k_tlb_data_template)] |
|
| - | 89 | ||
| - | 90 | /* |
|
| 67 | * Setup basic runtime environment. |
91 | * Setup basic runtime environment. |
| 68 | */ |
92 | */ |
| 69 | 93 | ||
| 70 | wrpr %g0, NWINDOWS - 2, %cansave ! set maximum saveable windows |
94 | wrpr %g0, NWINDOWS - 2, %cansave ! set maximum saveable windows |
| 71 | wrpr %g0, 0, %canrestore ! get rid of windows we will never need again |
95 | wrpr %g0, 0, %canrestore ! get rid of windows we will never need again |
| Line 113... | Line 137... | ||
| 113 | stxa %g1, [VA_DMMU_TAG_ACCESS] %asi |
137 | stxa %g1, [VA_DMMU_TAG_ACCESS] %asi |
| 114 | membar #Sync |
138 | membar #Sync |
| 115 | 139 | ||
| 116 | #define SET_TLB_DATA(r1, r2, imm) \ |
140 | #define SET_TLB_DATA(r1, r2, imm) \ |
| 117 | set TTE_CV | TTE_CP | TTE_P | LMA | imm, %r1; \ |
141 | set TTE_CV | TTE_CP | TTE_P | LMA | imm, %r1; \ |
| - | 142 | or %r1, %l5, %r1; \ |
|
| 118 | set PAGESIZE_4M, %r2; \ |
143 | mov PAGESIZE_4M, %r2; \ |
| 119 | sllx %r2, TTE_SIZE_SHIFT, %r2; \ |
144 | sllx %r2, TTE_SIZE_SHIFT, %r2; \ |
| 120 | or %r1, %r2, %r1; \ |
145 | or %r1, %r2, %r1; \ |
| 121 | mov 1, %r2; \ |
146 | mov 1, %r2; \ |
| 122 | sllx %r2, TTE_V_SHIFT, %r2; \ |
147 | sllx %r2, TTE_V_SHIFT, %r2; \ |
| 123 | or %r1, %r2, %r1; |
148 | or %r1, %r2, %r1; |
| Line 300... | Line 325... | ||
| 300 | */ |
325 | */ |
| 301 | 326 | ||
| 302 | #define INITIAL_STACK_SIZE 1024 |
327 | #define INITIAL_STACK_SIZE 1024 |
| 303 | 328 | ||
| 304 | .align STACK_ALIGNMENT |
329 | .align STACK_ALIGNMENT |
| 305 | .space INITIAL_STACK_SIZE |
330 | .space INITIAL_STACK_SIZE |
| 306 | .align STACK_ALIGNMENT |
331 | .align STACK_ALIGNMENT |
| 307 | temporary_boot_stack: |
332 | temporary_boot_stack: |
| 308 | .space STACK_WINDOW_SAVE_AREA_SIZE |
333 | .space STACK_WINDOW_SAVE_AREA_SIZE |
| - | 334 | ||
| - | 335 | ||
| - | 336 | .data |
|
| - | 337 | ||
| - | 338 | .align 8 |
|
| - | 339 | .global physmem_base ! copy of the physical memory base address |
|
| - | 340 | physmem_base: |
|
| - | 341 | .quad 0 |
|
| - | 342 | ||
| - | 343 | .global physmem_base_40_13 |
|
| - | 344 | physmem_base_40_13: ! physmem_base & mask_40_13 |
|
| - | 345 | .quad 0 |
|
| - | 346 | ||
| - | 347 | .global mask_40_13 |
|
| - | 348 | mask_40_13: ! constant with bits 40:13 set |
|
| - | 349 | .quad (((1 << 41) - 1) & ~((1 << 13) - 1)) |
|
| - | 350 | ||
| - | 351 | /* |
|
| - | 352 | * This variable is used by the fast_data_MMU_miss trap handler. |
|
| - | 353 | * It is initialized to reflect the starting address of physical |
|
| - | 354 | * memory. |
|
| - | 355 | */ |
|
| - | 356 | .global kernel_8k_tlb_data_template |
|
| - | 357 | kernel_8k_tlb_data_template: |
|
| - | 358 | .quad ((1 << TTE_V_SHIFT) | TTE_CV | TTE_CP | TTE_P | TTE_W) |
|
| - | 359 | ||