[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [mini-os master] mini-os: setup hypercall page for HVMlite
commit f68d917cc2d94f3a434c485561cb4a7f0500b609 Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Thu Aug 18 13:00:27 2016 +0200 Commit: Wei Liu <wei.liu2@xxxxxxxxxx> CommitDate: Wed Aug 24 11:37:05 2016 +0100 mini-os: setup hypercall page for HVMlite When running in HVMlite mode we need to setup the hypercall page by ourself. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> --- arch/x86/events.c | 4 ++-- arch/x86/setup.c | 26 ++++++++++++++++++++++++++ include/x86/os.h | 28 ++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/arch/x86/events.c b/arch/x86/events.c index 5198cf3..342662d 100644 --- a/arch/x86/events.c +++ b/arch/x86/events.c @@ -16,7 +16,7 @@ void arch_init_events(void) { #if defined(__x86_64__) asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); - wrmsrl(0xc0000101, &cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */ + wrmsrl(0xc0000101, (uint64_t)&cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */ cpu0_pda.irqcount = -1; cpu0_pda.irqstackptr = (void*) (((unsigned long)irqstack + 2 * STACK_SIZE) & ~(STACK_SIZE - 1)); @@ -30,6 +30,6 @@ void arch_unbind_ports(void) void arch_fini_events(void) { #if defined(__x86_64__) - wrmsrl(0xc0000101, NULL); /* 0xc0000101 is MSR_GS_BASE */ + wrmsrl(0xc0000101, 0); /* 0xc0000101 is MSR_GS_BASE */ #endif } diff --git a/arch/x86/setup.c b/arch/x86/setup.c index 30a9143..edc4ca4 100644 --- a/arch/x86/setup.c +++ b/arch/x86/setup.c @@ -30,6 +30,7 @@ #include <mini-os/lib.h> /* for printk, memcpy */ #include <mini-os/kernel.h> #include <xen/xen.h> +#include <xen/arch-x86/cpuid.h> /* * Shared page for communicating with the hypervisor. @@ -89,6 +90,30 @@ static inline void sse_init(void) { #define sse_init() #endif +#ifdef CONFIG_PARAVIRT +#define hpc_init() +#else +static void hpc_init(void) +{ + uint32_t eax, ebx, ecx, edx, base; + + for ( base = XEN_CPUID_FIRST_LEAF; + base < XEN_CPUID_FIRST_LEAF + 0x10000; base += 0x100 ) + { + cpuid(base, &eax, &ebx, &ecx, &edx); + + if ( (ebx == XEN_CPUID_SIGNATURE_EBX) && + (ecx == XEN_CPUID_SIGNATURE_ECX) && + (edx == XEN_CPUID_SIGNATURE_EDX) && + ((eax - base) >= 2) ) + break; + } + + cpuid(base + 2, &eax, &ebx, &ecx, &edx); + wrmsrl(ebx, (unsigned long)&hypercall_page); + barrier(); +} +#endif /* * INITIAL C ENTRY POINT. @@ -99,6 +124,7 @@ arch_init(void *par) static char hello[] = "Bootstrapping...\n"; start_info_t *si; + hpc_init(); (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(hello), hello); trap_init(); diff --git a/include/x86/os.h b/include/x86/os.h index eeefbe2..7b7869a 100644 --- a/include/x86/os.h +++ b/include/x86/os.h @@ -440,20 +440,23 @@ static __inline__ unsigned long __ffs(unsigned long word) (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ } while(0) -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define wrmsrl(msr,val) wrmsr(msr,(uint32_t)((uint64_t)(val)),((uint64_t)(val))>>32) - - #else /* ifdef __x86_64__ */ #error "Unsupported architecture" #endif + #endif /* ifdef __INSIDE_MINIOS */ /********************* common i386 and x86_64 ****************************/ +#define wrmsr(msr,val1,val2) \ + __asm__ __volatile__("wrmsr" \ + : /* no outputs */ \ + : "c" (msr), "a" (val1), "d" (val2)) + +static inline void wrmsrl(unsigned msr, uint64_t val) +{ + wrmsr(msr, (uint32_t)(val & 0xffffffffULL), (uint32_t)(val >> 32)); +} + struct __synch_xchg_dummy { unsigned long a[100]; }; #define __synch_xg(x) ((struct __synch_xchg_dummy *)(x)) @@ -571,6 +574,15 @@ HYPERVISOR_xsm_op( return _hypercall1(int, xsm_op, op); } +static inline void cpuid(uint32_t leaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + asm volatile ("cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "0" (leaf)); +} + #undef ADDR #endif /* not assembly */ -- generated by git-patchbot for /home/xen/git/mini-os.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |