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); |