Changeset f2ea5d8 in mainline
- Timestamp:
- 2006-11-17T20:21:25Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f18cc64
- Parents:
- 282f2c9c
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/sparc64/loader/asm.S
r282f2c9c rf2ea5d8 1 1 # 2 2 # Copyright (C) 2006 Martin Decky 3 # Copyright (C) 2006 Jakub Jermar 3 4 # All rights reserved. 4 5 # -
boot/arch/sparc64/loader/asm.h
r282f2c9c rf2ea5d8 1 1 /* 2 2 * Copyright (C) 2006 Martin Decky 3 * Copyright (C) 2006 Jakub Jermar 3 4 * All rights reserved. 4 5 * … … 30 31 #define BOOT_sparc64_ASM_H_ 31 32 32 #define PAGE_SIZE 8192 33 #define PAGE_WIDTH 13 33 #include "types.h" 34 #include "main.h" 35 36 #define PAGE_SIZE 8192 37 #define PAGE_WIDTH 13 34 38 35 39 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 36 40 37 41 extern void halt(void); 38 extern void jump_to_kernel(void *entry, int bsp, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn)); 42 extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo, 43 unsigned int bootinfo_size) __attribute__((noreturn)); 39 44 40 45 #endif -
boot/arch/sparc64/loader/main.c
r282f2c9c rf2ea5d8 47 47 init_components(components); 48 48 49 if (!ofw_get_physmem_start(&bootinfo.physmem_start)) { 50 printf("Error: unable to get start of physical memory.\n"); 51 halt(); 52 } 53 49 54 if (!ofw_memmap(&bootinfo.memmap)) { 50 55 printf("Error: unable to get memory map, halting.\n"); … … 58 63 59 64 printf("\nSystem info\n"); 60 printf(" memory: %dM\n", bootinfo.memmap.total>>20); 65 printf(" memory: %dM starting at %P\n", 66 bootinfo.memmap.total >> 20, bootinfo.physmem_start); 61 67 62 68 printf("\nMemory statistics\n"); … … 66 72 unsigned int i; 67 73 for (i = 0; i < COMPONENTS; i++) 68 printf(" %P: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); 74 printf(" %P: %s image (size %d bytes)\n", components[i].start, 75 components[i].name, components[i].size); 69 76 70 77 void * base = (void *) KERNEL_VIRTUAL_ADDRESS; … … 94 101 printf("\nChecking for secondary processors..."); 95 102 if (!ofw_cpu()) 96 printf("Error: unable to get cpuproperties\n");103 printf("Error: unable to get CPU properties\n"); 97 104 printf("done.\n"); 98 105 99 106 printf("\nBooting the kernel...\n"); 100 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, 1, &bootinfo, sizeof(bootinfo)); 107 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, 108 bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, sizeof(bootinfo)); 101 109 } -
boot/arch/sparc64/loader/main.h
r282f2c9c rf2ea5d8 39 39 #define TASKMAP_MAX_RECORDS 32 40 40 41 #define BSP_PROCESSOR 1 42 #define AP_PROCESSOR 0 43 41 44 typedef struct { 42 45 void *addr; … … 50 53 51 54 typedef struct { 55 uintptr_t physmem_start; 52 56 taskmap_t taskmap; 53 57 memmap_t memmap; … … 56 60 } bootinfo_t; 57 61 62 extern bootinfo_t bootinfo; 63 58 64 extern void start(void); 59 65 extern void bootstrap(void); -
boot/arch/sparc64/loader/ofwarch.c
r282f2c9c rf2ea5d8 1 1 /* 2 2 * Copyright (C) 2005 Martin Decky 3 * Copyright (C) 2006 Jakub Jermar 3 4 * All rights reserved. 4 5 * … … 38 39 #include <register.h> 39 40 #include "main.h" 41 #include "asm.h" 40 42 41 43 void write(const char *str, const int len) … … 86 88 * Start secondary processor. 87 89 */ 88 (void) ofw_call("SUNW,start-cpu", 3, 1, NULL, node, KERNEL_VIRTUAL_ADDRESS, 0); 90 (void) ofw_call("SUNW,start-cpu", 3, 1, NULL, node, 91 KERNEL_VIRTUAL_ADDRESS, 92 bootinfo.physmem_start | AP_PROCESSOR); 89 93 } 90 94 } … … 94 98 return cpus; 95 99 } 100 101 /** Get physical memory starting address. 102 * 103 * @param start Pointer to variable where the physical memory starting 104 * address will be stored. 105 * 106 * @return Non-zero on succes, zero on failure. 107 */ 108 int ofw_get_physmem_start(uintptr_t *start) 109 { 110 uint32_t memreg[4]; 111 112 if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0) 113 return 0; 114 115 *start = (((uint64_t) memreg[0]) << 32) | memreg[1]; 116 return 1; 117 } 118 -
boot/arch/sparc64/loader/ofwarch.h
r282f2c9c rf2ea5d8 31 31 32 32 #include "main.h" 33 #include "types.h" 33 34 34 35 #define OFW_ADDRESS_CELLS 2 … … 36 37 37 38 extern int ofw_cpu(void); 39 extern int ofw_get_physmem_start(uintptr_t *start); 38 40 39 41 #endif -
kernel/arch/sparc64/include/boot/boot.h
r282f2c9c rf2ea5d8 76 76 */ 77 77 typedef struct { 78 uintptr_t physmem_start; 78 79 taskmap_t taskmap; 79 80 memmap_t memmap; -
kernel/arch/sparc64/include/mm/page.h
r282f2c9c rf2ea5d8 49 49 #include <genarch/mm/page_ht.h> 50 50 51 #define KA2PA(x) ((uintptr_t) (x)) 52 #define PA2KA(x) ((uintptr_t) (x)) 51 extern uintptr_t physmem_base; 52 53 #define KA2PA(x) (((uintptr_t) (x)) + physmem_base) 54 #define PA2KA(x) (((uintptr_t) (x)) - physmem_base) 53 55 54 56 union page_address { -
kernel/arch/sparc64/include/trap/mmu.h
r282f2c9c rf2ea5d8 112 112 bz 0f ! page address is zero 113 113 114 or %g3, (TTE_CV|TTE_CP|TTE_P|TTE_W), %g2 ! 8K pages are the default (encoded as 0) 115 mov 1, %g3 116 sllx %g3, TTE_V_SHIFT, %g3 117 or %g2, %g3, %g2 114 sethi %hi(kernel_8k_tlb_data_template), %g2 115 ldx [%g2 + %lo(kernel_8k_tlb_data_template)], %g2 116 or %g3, %g2, %g2 118 117 stxa %g2, [%g0] ASI_DTLB_DATA_IN_REG ! identity map the kernel page 119 118 retry -
kernel/arch/sparc64/src/start.S
r282f2c9c rf2ea5d8 45 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 49 * from the boot loader. 50 * Here is where the kernel is passed control from the boot loader. 50 51 * 51 52 * The registers are expected to be in this state: 52 * - %o0 non-zero for the bootstrap processor, zero for application/secondary processors 53 * - %o1 bootinfo structure address 54 * - %o2 bootinfo structure size 53 * - %o0 starting address of physical memory + bootstrap processor flag 54 * bits 63...1: physical memory starting address / 2 55 * bit 0: non-zero on BSP processor, zero on AP processors 56 * - %o1 bootinfo structure address (BSP only) 57 * - %o2 bootinfo structure size (BSP only) 55 58 * 56 * Moreover, we depend on boot having established the 57 * following environment: 59 * Moreover, we depend on boot having established the following environment: 58 60 * - TLBs are on 59 61 * - identity mapping for the kernel image … … 62 64 .global kernel_image_start 63 65 kernel_image_start: 64 mov %o0, %l7 65 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)] 81 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 66 90 /* 67 91 * Setup basic runtime environment. … … 116 140 #define SET_TLB_DATA(r1, r2, imm) \ 117 141 set TTE_CV | TTE_CP | TTE_P | LMA | imm, %r1; \ 118 set PAGESIZE_4M, %r2; \ 142 or %r1, %l5, %r1; \ 143 mov PAGESIZE_4M, %r2; \ 119 144 sllx %r2, TTE_SIZE_SHIFT, %r2; \ 120 145 or %r1, %r2, %r1; \ … … 303 328 304 329 .align STACK_ALIGNMENT 305 .space INITIAL_STACK_SIZE330 .space INITIAL_STACK_SIZE 306 331 .align STACK_ALIGNMENT 307 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
Note:
See TracChangeset
for help on using the changeset viewer.