Changeset 4872160 in mainline for kernel/arch/sparc64/src
- Timestamp:
- 2010-05-04T10:44:55Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 568db0f
- Parents:
- bb252ca
- Location:
- kernel/arch/sparc64/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4u/frame.c
rbb252ca r4872160 43 43 uintptr_t last_frame = NULL; 44 44 45 /** Create memory zones according to information stored in bootinfo.45 /** Create memory zones according to information stored in memmap. 46 46 * 47 * Walk the bootinfomemory map and create frame zones according to it.47 * Walk the memory map and create frame zones according to it. 48 48 */ 49 49 void frame_arch_init(void) … … 53 53 54 54 if (config.cpu_active == 1) { 55 for (i = 0; i < bootinfo.memmap.count; i++) {56 uintptr_t start = bootinfo.memmap.zones[i].start;57 size_t size = bootinfo.memmap.zones[i].size;55 for (i = 0; i < memmap.cnt; i++) { 56 uintptr_t start = (uintptr_t) memmap.zones[i].start; 57 size_t size = memmap.zones[i].size; 58 58 59 59 /* -
kernel/arch/sparc64/src/mm/sun4v/frame.c
rbb252ca r4872160 41 41 #include <macros.h> 42 42 43 /** Create memory zones according to information stored in bootinfo.43 /** Create memory zones according to information stored in memmap. 44 44 * 45 * Walk the bootinfomemory map and create frame zones according to it.45 * Walk the memory map and create frame zones according to it. 46 46 */ 47 47 void frame_arch_init(void) … … 51 51 52 52 if (config.cpu_active == 1) { 53 for (i = 0; i < bootinfo.memmap.count; i++) {54 uintptr_t start = bootinfo.memmap.zones[i].start;55 size_t size = bootinfo.memmap.zones[i].size;53 for (i = 0; i < memmap->count; i++) { 54 uintptr_t start = (uintptr_t) memmap.zones[i].start; 55 size_t size = memmap.zones[i].size; 56 56 57 57 /* -
kernel/arch/sparc64/src/smp/sun4v/smp.c
rbb252ca r4872160 417 417 static bool wake_cpu(uint64_t cpuid) 418 418 { 419 420 419 #ifdef CONFIG_SIMICS_SMP_HACK 421 420 ipi_unicast_to((void (*)(void)) 1234, cpuid); … … 424 423 if (__hypercall_fast1(CPU_STOP, cpuid) != EOK) 425 424 return false; 426 425 427 426 /* wait for the CPU to stop */ 428 427 uint64_t state; 429 __hypercall_fast_ret1(cpuid, 0, 0, 0, 0, 430 CPU_STATE, &state); 431 while (state == CPU_STATE_RUNNING) { 432 __hypercall_fast_ret1(cpuid, 0, 0, 0, 0, 433 CPU_STATE, &state); 434 } 435 428 __hypercall_fast_ret1(cpuid, 0, 0, 0, 0, CPU_STATE, &state); 429 while (state == CPU_STATE_RUNNING) 430 __hypercall_fast_ret1(cpuid, 0, 0, 0, 0, CPU_STATE, &state); 431 436 432 /* make the CPU run again and execute HelenOS code */ 437 if (__hypercall_fast4( 438 CPU_START, cpuid, 439 (uint64_t) KA2PA(kernel_image_start), 440 KA2PA(trap_table), bootinfo.physmem_start 441 ) != EOK) 442 return false; 433 if (__hypercall_fast4(CPU_START, cpuid, 434 (uint64_t) KA2PA(kernel_image_start), KA2PA(trap_table), 435 physmem_start) != EOK) 436 return false; 443 437 #endif 444 438 445 439 if (waitq_sleep_timeout(&ap_completion_wq, 10000000, SYNCH_FLAGS_NONE) == 446 447 printf("%s: waiting for processor (cpuid = %" PRIu32 448 ") timed out\n",__func__, cpuid);449 440 ESYNCH_TIMEOUT) 441 printf("%s: waiting for processor (cpuid = %" PRIu32 ") timed out\n", 442 __func__, cpuid); 443 450 444 return true; 451 445 } -
kernel/arch/sparc64/src/sun4u/sparc64.c
rbb252ca r4872160 36 36 #include <debug.h> 37 37 #include <config.h> 38 #include <macros.h> 38 39 #include <arch/trap/trap.h> 39 40 #include <arch/console.h> … … 50 51 #include <str.h> 51 52 52 bootinfo_t bootinfo;53 memmap_t memmap; 53 54 54 55 /** Perform sparc64-specific initialization before main_bsp() is called. */ 55 void arch_pre_main( void)56 void arch_pre_main(bootinfo_t *bootinfo) 56 57 { 57 58 /* Copy init task info. */ 58 init.cnt = bootinfo.taskmap.count;59 init.cnt = min3(bootinfo->taskmap.cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); 59 60 60 uint32_t i; 61 62 for (i = 0; i < bootinfo.taskmap.count; i++) { 63 init.tasks[i].addr = (uintptr_t) bootinfo.taskmap.tasks[i].addr; 64 init.tasks[i].size = bootinfo.taskmap.tasks[i].size; 61 size_t i; 62 for (i = 0; i < init.cnt; i++) { 63 init.tasks[i].addr = (uintptr_t) bootinfo->taskmap.tasks[i].addr; 64 init.tasks[i].size = bootinfo->taskmap.tasks[i].size; 65 65 str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN, 66 bootinfo.taskmap.tasks[i].name); 66 bootinfo->taskmap.tasks[i].name); 67 } 68 69 /* Copy physical memory map. */ 70 memmap.total = bootinfo->memmap.total; 71 memmap.cnt = min(bootinfo->memmap.cnt, MEMMAP_MAX_RECORDS); 72 for (i = 0; i < memmap.cnt; i++) { 73 memmap.zones[i].start = bootinfo->memmap.zones[i].start; 74 memmap.zones[i].size = bootinfo->memmap.zones[i].size; 67 75 } 68 76 69 77 /* Copy boot allocations info. */ 70 ballocs.base = bootinfo .ballocs.base;71 ballocs.size = bootinfo .ballocs.size;78 ballocs.base = bootinfo->ballocs.base; 79 ballocs.size = bootinfo->ballocs.size; 72 80 73 ofw_tree_init(bootinfo .ofw_root);81 ofw_tree_init(bootinfo->ofw_root); 74 82 } 75 83 -
kernel/arch/sparc64/src/sun4u/start.S
rbb252ca r4872160 60 60 /* 61 61 * Here is where the kernel is passed control from the boot loader. 62 * 62 * 63 63 * The registers are expected to be in this state: 64 * - %o0 starting address of physical memory + bootstrap processor flag65 * bits 63...1: physical memory starting address / 266 * bit 0: non-zero on BSP processor, zero on AP processors67 * - %o1 bootinfo structure address (BSP only)68 * - %o2 bootinfo structure size (BSP only)64 * - %o0 bootinfo structure address (BSP only) 65 * - %o1 starting address of physical memory 66 * + bootstrap processor flag 67 * bits 63...1: physical memory starting address / 2 68 * bit 0: non-zero on BSP processor, zero on AP processors 69 69 * 70 70 * Moreover, we depend on boot having established the following environment: 71 * - TLBs are on 72 * - identity mapping for the kernel image 71 * - TLBs are on 72 * - identity mapping for the kernel image 73 * 73 74 */ 74 75 … … 76 77 kernel_image_start: 77 78 mov BSP_FLAG, %l0 78 and %o 0, %l0, %l7 ! l7 <= bootstrap processor?79 andn %o 0, %l0, %l6 ! l6 <= start of physical memory79 and %o1, %l0, %l7 ! l7 <= bootstrap processor? 80 andn %o1, %l0, %l6 ! l6 <= start of physical memory 80 81 81 82 ! Get bits (PHYSMEM_ADDR_SIZE - 1):13 of physmem_base. … … 282 283 sub %sp, STACK_BIAS, %sp 283 284 284 sethi %hi(bootinfo), %o0285 call memcpy ! copy bootinfo286 or %o0, %lo(bootinfo), %o0287 288 285 call arch_pre_main 289 286 nop -
kernel/arch/sparc64/src/sun4v/sparc64.c
rbb252ca r4872160 36 36 #include <debug.h> 37 37 #include <config.h> 38 #include <macros.h> 38 39 #include <arch/trap/trap.h> 39 40 #include <arch/console.h> … … 52 53 #include <arch/drivers/niagara.h> 53 54 54 bootinfo_t bootinfo;55 memmap_t memmap; 55 56 56 57 /** Perform sparc64-specific initialization before main_bsp() is called. */ 57 void arch_pre_main( void)58 void arch_pre_main(bootinfo_t *bootinfo) 58 59 { 59 60 /* Copy init task info. */ 60 init.cnt = bootinfo.taskmap.count;61 init.cnt = min3(bootinfo->taskmap.cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); 61 62 62 uint32_t i; 63 64 for (i = 0; i < bootinfo.taskmap.count; i++) { 65 init.tasks[i].addr = (uintptr_t) bootinfo.taskmap.tasks[i].addr; 66 init.tasks[i].size = bootinfo.taskmap.tasks[i].size; 63 size_t i; 64 for (i = 0; i < init.cnt; i++) { 65 init.tasks[i].addr = (uintptr_t) bootinfo->taskmap.tasks[i].addr; 66 init.tasks[i].size = bootinfo->taskmap.tasks[i].size; 67 67 str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN, 68 bootinfo .taskmap.tasks[i].name);68 bootinfo->taskmap.tasks[i].name); 69 69 } 70 70 71 /* Copy physical memory map. */ 72 memmap.total = bootinfo->memmap.total; 73 memmap.cnt = min(bootinfo->memmap.cnt, MEMMAP_MAX_RECORDS); 74 for (i = 0; i < memmap.cnt; i++) { 75 memmap.zones[i].start = bootinfo->memmap.zones[i].start; 76 memmap.zones[i].size = bootinfo->memmap.zones[i].size; 77 } 78 71 79 md_init(); 72 80 } -
kernel/arch/sparc64/src/sun4v/start.S
rbb252ca r4872160 75 75 * 76 76 * parameters: 77 * addr: virtual address to be mapped 78 * rphysmem_start: register containing the starting address of the 79 * physical memory 80 * rtmp1: a register to be used as temporary 81 * rtmp2: a register to be used as temporary 82 * rd: register where the result will be saved 77 * addr: virtual address to be mapped 78 * rphysmem_start: register containing the starting address 79 * of the physical memory 80 * rtmp1: a register to be used as temporary 81 * rtmp2: a register to be used as temporary 82 * rd: register where the result will be saved 83 * 83 84 */ 84 85 #define TTE_DATA(addr, rphysmem_start, rtmp1, rtmp2, rd) \ … … 90 91 /* 91 92 * Here is where the kernel is passed control from the boot loader. 92 * 93 * 93 94 * The registers are expected to be in this state: 94 * - %o0 starting address of physical memory + bootstrap processor flag95 * bits 63...1: physical memory starting address / 296 * bit 0: non-zero on BSP processor, zero on AP processors97 * - %o1 bootinfo structure address (BSP only)98 * - %o2 bootinfo structure size (BSP only)95 * - %o0 bootinfo structure address (BSP only) 96 * - %o1 starting address of physical memory 97 * + bootstrap processor flag 98 * bits 63...1: physical memory starting address / 2 99 * bit 0: non-zero on BSP processor, zero on AP processors 99 100 * 100 101 * Moreover, we depend on boot having established the following environment: 101 * - TLBs are on 102 * - identity mapping for the kernel image 102 * - TLBs are on 103 * - identity mapping for the kernel image 104 * 103 105 */ 104 106 .global kernel_image_start 105 107 kernel_image_start: 106 108 mov BSP_FLAG, %l0 107 and %o0, %l0, %l7 ! l7 <= bootstrap processor? 108 andn %o0, %l0, %l6 ! l6 <= start of physical memory 109 or %o1, %g0, %l1 110 or %o2, %g0, %l2 109 and %o1, %l0, %l7 ! l7 <= bootstrap processor? 110 andn %o1, %l0, %l6 ! l6 <= start of physical memory 111 or %o0, %g0, %l0 111 112 112 113 ! Get bits (PHYSMEM_ADDR_SIZE - 1):13 of physmem_base. … … 245 246 sub %sp, STACK_BIAS, %sp 246 247 247 or %l1, %g0, %o1 248 or %l2, %g0, %o2 249 sethi %hi(bootinfo), %o0 250 call memcpy ! copy bootinfo 251 or %o0, %lo(bootinfo), %o0 252 248 or %l0, %g0, %o0 253 249 call arch_pre_main 254 250 nop
Note:
See TracChangeset
for help on using the changeset viewer.