diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2016-12-01 06:20:09 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-12-02 01:36:24 -0500 |
commit | db7ad63624b370100077aa0a849d54fbeabd432b (patch) | |
tree | df248c8b794c7970368e25776f2327b2ec5d5184 | |
parent | 3e488c95c72ba8cbe8ab3a5c1c61f058f9e30aed (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.c | 16 |
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; |