diff options
Diffstat (limited to 'arch/sparc64/kernel/smp.c')
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index cc454731d879..5a1126b363a4 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -284,14 +284,17 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 284 | { | 284 | { |
| 285 | extern unsigned long sparc64_ttable_tl0; | 285 | extern unsigned long sparc64_ttable_tl0; |
| 286 | extern unsigned long kern_locked_tte_data; | 286 | extern unsigned long kern_locked_tte_data; |
| 287 | extern int bigkernel; | ||
| 288 | struct hvtramp_descr *hdesc; | 287 | struct hvtramp_descr *hdesc; |
| 289 | unsigned long trampoline_ra; | 288 | unsigned long trampoline_ra; |
| 290 | struct trap_per_cpu *tb; | 289 | struct trap_per_cpu *tb; |
| 291 | u64 tte_vaddr, tte_data; | 290 | u64 tte_vaddr, tte_data; |
| 292 | unsigned long hv_err; | 291 | unsigned long hv_err; |
| 292 | int i; | ||
| 293 | 293 | ||
| 294 | hdesc = kzalloc(sizeof(*hdesc), GFP_KERNEL); | 294 | hdesc = kzalloc(sizeof(*hdesc) + |
| 295 | (sizeof(struct hvtramp_mapping) * | ||
| 296 | num_kernel_image_mappings - 1), | ||
| 297 | GFP_KERNEL); | ||
| 295 | if (!hdesc) { | 298 | if (!hdesc) { |
| 296 | printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate " | 299 | printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate " |
| 297 | "hvtramp_descr.\n"); | 300 | "hvtramp_descr.\n"); |
| @@ -299,7 +302,7 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 299 | } | 302 | } |
| 300 | 303 | ||
| 301 | hdesc->cpu = cpu; | 304 | hdesc->cpu = cpu; |
| 302 | hdesc->num_mappings = (bigkernel ? 2 : 1); | 305 | hdesc->num_mappings = num_kernel_image_mappings; |
| 303 | 306 | ||
| 304 | tb = &trap_block[cpu]; | 307 | tb = &trap_block[cpu]; |
| 305 | tb->hdesc = hdesc; | 308 | tb->hdesc = hdesc; |
| @@ -312,13 +315,11 @@ static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | |||
| 312 | tte_vaddr = (unsigned long) KERNBASE; | 315 | tte_vaddr = (unsigned long) KERNBASE; |
| 313 | tte_data = kern_locked_tte_data; | 316 | tte_data = kern_locked_tte_data; |
| 314 | 317 | ||
| 315 | hdesc->maps[0].vaddr = tte_vaddr; | 318 | for (i = 0; i < hdesc->num_mappings; i++) { |
| 316 | hdesc->maps[0].tte = tte_data; | 319 | hdesc->maps[i].vaddr = tte_vaddr; |
| 317 | if (bigkernel) { | 320 | hdesc->maps[i].tte = tte_data; |
| 318 | tte_vaddr += 0x400000; | 321 | tte_vaddr += 0x400000; |
| 319 | tte_data += 0x400000; | 322 | tte_data += 0x400000; |
| 320 | hdesc->maps[1].vaddr = tte_vaddr; | ||
| 321 | hdesc->maps[1].tte = tte_data; | ||
| 322 | } | 323 | } |
| 323 | 324 | ||
| 324 | trampoline_ra = kimage_addr_to_ra(hv_cpu_startup); | 325 | trampoline_ra = kimage_addr_to_ra(hv_cpu_startup); |
