Commit b6323697 authored by Richard Weinberger's avatar Richard Weinberger

um: Setup physical memory in setup_arch()

Currently UML sets up physical memory very early,
long before setup_arch() was called by the kernel main
function.
This can cause problems when code paths in UML's memory setup
code assume that the kernel is already running.
i.e. when kmemleak is enabled it will evaluate current()
in free_bootmem(). That early current() is undefined and
UML explodes.

Solve the problem by setting up physical memory in setup_arch(),
at this stage the kernel has materialized and basic infrastructure
such as current() works.
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent fed4c726
...@@ -319,9 +319,6 @@ int __init linux_main(int argc, char **argv) ...@@ -319,9 +319,6 @@ int __init linux_main(int argc, char **argv)
start_vm = VMALLOC_START; start_vm = VMALLOC_START;
setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);
mem_total_pages(physmem_size, iomem_size, highmem);
virtmem_size = physmem_size; virtmem_size = physmem_size;
stack = (unsigned long) argv; stack = (unsigned long) argv;
stack &= ~(1024 * 1024 - 1); stack &= ~(1024 * 1024 - 1);
...@@ -334,7 +331,6 @@ int __init linux_main(int argc, char **argv) ...@@ -334,7 +331,6 @@ int __init linux_main(int argc, char **argv)
printf("Kernel virtual memory size shrunk to %lu bytes\n", printf("Kernel virtual memory size shrunk to %lu bytes\n",
virtmem_size); virtmem_size);
stack_protections((unsigned long) &init_thread_info);
os_flush_stdout(); os_flush_stdout();
return start_uml(); return start_uml();
...@@ -342,6 +338,10 @@ int __init linux_main(int argc, char **argv) ...@@ -342,6 +338,10 @@ int __init linux_main(int argc, char **argv)
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
stack_protections((unsigned long) &init_thread_info);
setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);
mem_total_pages(physmem_size, iomem_size, highmem);
paging_init(); paging_init();
strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
*cmdline_p = command_line; *cmdline_p = command_line;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment