Commit 746ef0cd authored by Glauber de Oliveira Costa's avatar Glauber de Oliveira Costa Committed by Ingo Molnar

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: default avatarGlauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent ba082427
...@@ -638,8 +638,10 @@ static void early_panic(char *msg) ...@@ -638,8 +638,10 @@ static void early_panic(char *msg)
panic(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. * Try to copy the BIOS-supplied E820-map.
* *
...@@ -650,7 +652,10 @@ void __init setup_memory_region(void) ...@@ -650,7 +652,10 @@ void __init setup_memory_region(void)
if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
early_panic("Cannot find a valid memory map"); early_panic("Cannot find a valid memory map");
printk(KERN_INFO "BIOS-provided physical RAM map:\n"); 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) static int __init parse_memopt(char *p)
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/ctype.h> #include <linux/ctype.h>
#include <linux/uaccess.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -62,6 +63,12 @@ ...@@ -62,6 +63,12 @@
#include <asm/mce.h> #include <asm/mce.h>
#include <asm/ds.h> #include <asm/ds.h>
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
#else
#define ARCH_SETUP
#endif
/* /*
* Machine setup.. * Machine setup..
*/ */
...@@ -246,6 +253,16 @@ static void discover_ebda(void) ...@@ -246,6 +253,16 @@ static void discover_ebda(void)
* 4K EBDA area at 0x40E * 4K EBDA area at 0x40E
*/ */
ebda_addr = *(unsigned short *)__va(EBDA_ADDR_POINTER); 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_addr <<= 4;
ebda_size = *(unsigned short *)__va(ebda_addr); ebda_size = *(unsigned short *)__va(ebda_addr);
...@@ -259,6 +276,12 @@ static void discover_ebda(void) ...@@ -259,6 +276,12 @@ static void discover_ebda(void)
ebda_size = 64*1024; 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) void __init setup_arch(char **cmdline_p)
{ {
unsigned i; unsigned i;
...@@ -276,7 +299,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -276,7 +299,10 @@ void __init setup_arch(char **cmdline_p)
rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0); rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0);
rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0); rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0);
#endif #endif
setup_memory_region();
ARCH_SETUP
memory_setup();
copy_edd(); copy_edd();
if (!boot_params.hdr.root_flags) if (!boot_params.hdr.root_flags)
......
...@@ -369,7 +369,7 @@ void __cpuinit start_secondary(void) ...@@ -369,7 +369,7 @@ void __cpuinit start_secondary(void)
unlock_ipi_call_lock(); unlock_ipi_call_lock();
setup_secondary_APIC_clock(); setup_secondary_clock();
cpu_idle(); cpu_idle();
} }
...@@ -923,7 +923,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -923,7 +923,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
* Set up local APIC timer on boot CPU. * Set up local APIC timer on boot CPU.
*/ */
setup_boot_APIC_clock(); setup_boot_clock();
} }
/* /*
......
...@@ -3,6 +3,13 @@ ...@@ -3,6 +3,13 @@
#define COMMAND_LINE_SIZE 2048 #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 __KERNEL__
#ifdef __i386__ #ifdef __i386__
...@@ -51,9 +58,7 @@ void __init add_memory_region(unsigned long long start, ...@@ -51,9 +58,7 @@ void __init add_memory_region(unsigned long long start,
extern unsigned long init_pg_tables_end; extern unsigned long init_pg_tables_end;
#ifndef CONFIG_PARAVIRT
#define paravirt_post_allocator_init() do {} while (0)
#endif
#endif /* __i386__ */ #endif /* __i386__ */
#endif /* _SETUP */ #endif /* _SETUP */
......
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