|
@@ -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)
|