aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2016-12-01 06:20:09 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-12-02 01:36:24 -0500
commitdb7ad63624b370100077aa0a849d54fbeabd432b (patch)
treedf248c8b794c7970368e25776f2327b2ec5d5184
parent3e488c95c72ba8cbe8ab3a5c1c61f058f9e30aed (diff)
s390/setup: fix memblock usage
When converting from bootmem to memblock I missed a subtle difference: the memblock_alloc() functions return uninitialized memory, while the memblock_virt_alloc() functions return zeroed memory. This led to quite random early boot crashes. Therefore use the correct version everywhere now. Hopefully. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/kernel/setup.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index 14b57ddd4f62..b57e28f1edc2 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -304,9 +304,7 @@ static void __init setup_lowcore(void)
304 * Setup lowcore for boot cpu 304 * Setup lowcore for boot cpu
305 */ 305 */
306 BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * 4096); 306 BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * 4096);
307 lc = (struct lowcore *) memblock_alloc_base(sizeof(struct lowcore), 307 lc = memblock_virt_alloc_low(sizeof(*lc), sizeof(*lc));
308 sizeof(struct lowcore),
309 MAX_DMA_ADDRESS);
310 lc->restart_psw.mask = PSW_KERNEL_BITS; 308 lc->restart_psw.mask = PSW_KERNEL_BITS;
311 lc->restart_psw.addr = (unsigned long) restart_int_handler; 309 lc->restart_psw.addr = (unsigned long) restart_int_handler;
312 lc->external_new_psw.mask = PSW_KERNEL_BITS | 310 lc->external_new_psw.mask = PSW_KERNEL_BITS |
@@ -326,9 +324,11 @@ static void __init setup_lowcore(void)
326 lc->clock_comparator = -1ULL; 324 lc->clock_comparator = -1ULL;
327 lc->kernel_stack = ((unsigned long) &init_thread_union) 325 lc->kernel_stack = ((unsigned long) &init_thread_union)
328 + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); 326 + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
329 lc->async_stack = memblock_alloc(ASYNC_SIZE, ASYNC_SIZE) 327 lc->async_stack = (unsigned long)
328 memblock_virt_alloc(ASYNC_SIZE, ASYNC_SIZE)
330 + ASYNC_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); 329 + ASYNC_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
331 lc->panic_stack = memblock_alloc(PAGE_SIZE, PAGE_SIZE) 330 lc->panic_stack = (unsigned long)
331 memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE)
332 + PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); 332 + PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
333 lc->current_task = (unsigned long)&init_task; 333 lc->current_task = (unsigned long)&init_task;
334 lc->lpp = LPP_MAGIC; 334 lc->lpp = LPP_MAGIC;
@@ -350,7 +350,7 @@ static void __init setup_lowcore(void)
350 lc->last_update_timer = S390_lowcore.last_update_timer; 350 lc->last_update_timer = S390_lowcore.last_update_timer;
351 lc->last_update_clock = S390_lowcore.last_update_clock; 351 lc->last_update_clock = S390_lowcore.last_update_clock;
352 352
353 restart_stack = (void *) memblock_alloc(ASYNC_SIZE, ASYNC_SIZE); 353 restart_stack = memblock_virt_alloc(ASYNC_SIZE, ASYNC_SIZE);
354 restart_stack += ASYNC_SIZE; 354 restart_stack += ASYNC_SIZE;
355 355
356 /* 356 /*
@@ -413,7 +413,7 @@ static void __init setup_resources(void)
413 bss_resource.end = (unsigned long) &__bss_stop - 1; 413 bss_resource.end = (unsigned long) &__bss_stop - 1;
414 414
415 for_each_memblock(memory, reg) { 415 for_each_memblock(memory, reg) {
416 res = (void *) memblock_alloc(sizeof(*res), 8); 416 res = memblock_virt_alloc(sizeof(*res), 8);
417 res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM; 417 res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
418 418
419 res->name = "System RAM"; 419 res->name = "System RAM";
@@ -427,7 +427,7 @@ static void __init setup_resources(void)
427 std_res->start > res->end) 427 std_res->start > res->end)
428 continue; 428 continue;
429 if (std_res->end > res->end) { 429 if (std_res->end > res->end) {
430 sub_res = (void *) memblock_alloc(sizeof(*sub_res), 8); 430 sub_res = memblock_virt_alloc(sizeof(*sub_res), 8);
431 *sub_res = *std_res; 431 *sub_res = *std_res;
432 sub_res->end = res->end; 432 sub_res->end = res->end;
433 std_res->start = res->end + 1; 433 std_res->start = res->end + 1;