x86: prepare 64-bit architecture initialization for paravirt
This patch prepares the x86_64 architecture initialization for paravirt. It requires a memory initialization step, which is done by implementing 64-bit version for machine_specific_memory_setup, and putting an ARCH_SETUP hook, for guest-dependent initialization. This last step is done akin to i386 Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
ba082427ae
commit
746ef0cd0c
4 changed files with 44 additions and 8 deletions
|
@ -638,8 +638,10 @@ static void early_panic(char *msg)
|
|||
panic(msg);
|
||||
}
|
||||
|
||||
void __init setup_memory_region(void)
|
||||
/* We're not void only for x86 32-bit compat */
|
||||
char * __init machine_specific_memory_setup(void)
|
||||
{
|
||||
char *who = "BIOS-e820";
|
||||
/*
|
||||
* Try to copy the BIOS-supplied E820-map.
|
||||
*
|
||||
|
@ -650,7 +652,10 @@ void __init setup_memory_region(void)
|
|||
if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
|
||||
early_panic("Cannot find a valid memory map");
|
||||
printk(KERN_INFO "BIOS-provided physical RAM map:\n");
|
||||
e820_print_map("BIOS-e820");
|
||||
e820_print_map(who);
|
||||
|
||||
/* In case someone cares... */
|
||||
return who;
|
||||
}
|
||||
|
||||
static int __init parse_memopt(char *p)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/dmi.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -62,6 +63,12 @@
|
|||
#include <asm/mce.h>
|
||||
#include <asm/ds.h>
|
||||
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
#else
|
||||
#define ARCH_SETUP
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Machine setup..
|
||||
*/
|
||||
|
@ -246,6 +253,16 @@ static void discover_ebda(void)
|
|||
* 4K EBDA area at 0x40E
|
||||
*/
|
||||
ebda_addr = *(unsigned short *)__va(EBDA_ADDR_POINTER);
|
||||
/*
|
||||
* There can be some situations, like paravirtualized guests,
|
||||
* in which there is no available ebda information. In such
|
||||
* case, just skip it
|
||||
*/
|
||||
if (!ebda_addr) {
|
||||
ebda_size = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
ebda_addr <<= 4;
|
||||
|
||||
ebda_size = *(unsigned short *)__va(ebda_addr);
|
||||
|
@ -259,6 +276,12 @@ static void discover_ebda(void)
|
|||
ebda_size = 64*1024;
|
||||
}
|
||||
|
||||
/* Overridden in paravirt.c if CONFIG_PARAVIRT */
|
||||
void __attribute__((weak)) memory_setup(void)
|
||||
{
|
||||
machine_specific_memory_setup();
|
||||
}
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -276,7 +299,10 @@ void __init setup_arch(char **cmdline_p)
|
|||
rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0);
|
||||
rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0);
|
||||
#endif
|
||||
setup_memory_region();
|
||||
|
||||
ARCH_SETUP
|
||||
|
||||
memory_setup();
|
||||
copy_edd();
|
||||
|
||||
if (!boot_params.hdr.root_flags)
|
||||
|
|
|
@ -369,7 +369,7 @@ void __cpuinit start_secondary(void)
|
|||
|
||||
unlock_ipi_call_lock();
|
||||
|
||||
setup_secondary_APIC_clock();
|
||||
setup_secondary_clock();
|
||||
|
||||
cpu_idle();
|
||||
}
|
||||
|
@ -923,7 +923,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
* Set up local APIC timer on boot CPU.
|
||||
*/
|
||||
|
||||
setup_boot_APIC_clock();
|
||||
setup_boot_clock();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -3,6 +3,13 @@
|
|||
|
||||
#define COMMAND_LINE_SIZE 2048
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
char *machine_specific_memory_setup(void);
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
#define paravirt_post_allocator_init() do {} while (0)
|
||||
#endif
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifdef __i386__
|
||||
|
@ -51,9 +58,7 @@ void __init add_memory_region(unsigned long long start,
|
|||
|
||||
extern unsigned long init_pg_tables_end;
|
||||
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
#define paravirt_post_allocator_init() do {} while (0)
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __i386__ */
|
||||
#endif /* _SETUP */
|
||||
|
|
Loading…
Reference in a new issue