#if defined(CONFIG_PV)
#define m2p ((unsigned long *)MACH2PHYS_VIRT_START)
-extern struct start_info *start_info;
+extern start_info_t *start_info;
static inline void *mfn_to_virt(unsigned long mfn)
{
#include <arch/lib.h>
#include <arch/page.h>
+#include <xen/xen.h>
+
/*
* Arch-specific function to initialise the exception entry points, etc.
*/
extern uint8_t boot_stack[3 * PAGE_SIZE];
extern uint8_t user_stack[PAGE_SIZE];
-#if defined(CONFIG_PV)
-#include <xen/xen.h>
-
-extern struct start_info *start_info;
-#endif
+extern start_info_t *start_info;
+extern shared_info_t shared_info;
#endif /* XTF_X86_TRAPS_H */
#include <arch/desc.h>
#include <arch/lib.h>
#include <arch/mm.h>
+#include <arch/symbolic-const.h>
#include <arch/traps.h>
/*
start_info_t *start_info = NULL;
#endif
+shared_info_t shared_info __page_aligned_bss;
+
static void collect_cpuid(cpuid_count_fn_t cpuid_fn)
{
unsigned int tmp, eax, ebx, ecx, edx, addr = 0;
init_pv_console(cons_ring, cons_evtchn);
}
+static void map_shared_info(void)
+{
+ int rc;
+
+ if ( IS_DEFINED(CONFIG_HVM) )
+ {
+ struct xen_add_to_physmap xatp =
+ {
+ .domid = DOMID_SELF,
+ .space = XENMAPSPACE_shared_info,
+ .idx = 0,
+ .gfn = virt_to_gfn(&shared_info),
+ };
+
+ rc = hypercall_memory_op(XENMEM_add_to_physmap, &xatp);
+ }
+ else /* PV */
+ rc = hypercall_update_va_mapping(
+ &shared_info, start_info->shared_info | PF_SYM(RW, P),
+ UVMF_INVLPG);
+
+ if ( rc )
+ panic("Failed to map shared_info: %d\n", rc);
+}
+
static void qemu_console_write(const char *buf, size_t len)
{
asm volatile("rep; outsb"
init_hypercalls();
setup_pv_console();
+ map_shared_info();
}
/*
domid_t domid;
};
+#define XENMEM_add_to_physmap 7
+
+struct xen_add_to_physmap {
+ domid_t domid;
+ uint16_t size;
+
+#define XENMAPSPACE_shared_info 0
+#define XENMAPSPACE_grant_table 1
+#define XENMAPSPACE_gmfn 2
+#define XENMAPSPACE_gmfn_range 3
+#define XENMAPSPACE_gmfn_foreign 4
+#define XENMAPSPACE_dev_mmio 5
+ unsigned int space;
+
+ unsigned long idx;
+ unsigned long gfn;
+};
+
#define XENMEM_exchange 11
struct xen_memory_exchange {