[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 for-next v2 6/8] x86/mm: move two PV hypercalls from x86_64/mm.c to pv/mm.c
No functional change. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/pv/mm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ xen/arch/x86/x86_64/mm.c | 70 ------------------------------------------------ 2 files changed, 68 insertions(+), 70 deletions(-) diff --git a/xen/arch/x86/pv/mm.c b/xen/arch/x86/pv/mm.c index b5277b5d28..48d3fe184b 100644 --- a/xen/arch/x86/pv/mm.c +++ b/xen/arch/x86/pv/mm.c @@ -4106,6 +4106,74 @@ int mmio_ro_do_page_fault(struct vcpu *v, unsigned long addr, return 0; } +long do_stack_switch(unsigned long ss, unsigned long esp) +{ + fixup_guest_stack_selector(current->domain, ss); + current->arch.pv_vcpu.kernel_ss = ss; + current->arch.pv_vcpu.kernel_sp = esp; + return 0; +} + +long do_set_segment_base(unsigned int which, unsigned long base) +{ + struct vcpu *v = current; + long ret = 0; + + if ( is_pv_32bit_vcpu(v) ) + return -ENOSYS; /* x86/64 only. */ + + switch ( which ) + { + case SEGBASE_FS: + if ( is_canonical_address(base) ) + { + wrfsbase(base); + v->arch.pv_vcpu.fs_base = base; + } + else + ret = -EINVAL; + break; + + case SEGBASE_GS_USER: + if ( is_canonical_address(base) ) + { + wrmsrl(MSR_SHADOW_GS_BASE, base); + v->arch.pv_vcpu.gs_base_user = base; + } + else + ret = -EINVAL; + break; + + case SEGBASE_GS_KERNEL: + if ( is_canonical_address(base) ) + { + wrgsbase(base); + v->arch.pv_vcpu.gs_base_kernel = base; + } + else + ret = -EINVAL; + break; + + case SEGBASE_GS_USER_SEL: + __asm__ __volatile__ ( + " swapgs \n" + "1: movl %k0,%%gs \n" + " "safe_swapgs" \n" + ".section .fixup,\"ax\" \n" + "2: xorl %k0,%k0 \n" + " jmp 1b \n" + ".previous \n" + _ASM_EXTABLE(1b, 2b) + : : "r" (base&0xffff) ); + break; + + default: + ret = -EINVAL; + break; + } + + return ret; +} /* * Local variables: diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 34f3250fd7..19a14e8829 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -1018,76 +1018,6 @@ long subarch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) return rc; } -long do_stack_switch(unsigned long ss, unsigned long esp) -{ - fixup_guest_stack_selector(current->domain, ss); - current->arch.pv_vcpu.kernel_ss = ss; - current->arch.pv_vcpu.kernel_sp = esp; - return 0; -} - -long do_set_segment_base(unsigned int which, unsigned long base) -{ - struct vcpu *v = current; - long ret = 0; - - if ( is_pv_32bit_vcpu(v) ) - return -ENOSYS; /* x86/64 only. */ - - switch ( which ) - { - case SEGBASE_FS: - if ( is_canonical_address(base) ) - { - wrfsbase(base); - v->arch.pv_vcpu.fs_base = base; - } - else - ret = -EINVAL; - break; - - case SEGBASE_GS_USER: - if ( is_canonical_address(base) ) - { - wrmsrl(MSR_SHADOW_GS_BASE, base); - v->arch.pv_vcpu.gs_base_user = base; - } - else - ret = -EINVAL; - break; - - case SEGBASE_GS_KERNEL: - if ( is_canonical_address(base) ) - { - wrgsbase(base); - v->arch.pv_vcpu.gs_base_kernel = base; - } - else - ret = -EINVAL; - break; - - case SEGBASE_GS_USER_SEL: - __asm__ __volatile__ ( - " swapgs \n" - "1: movl %k0,%%gs \n" - " "safe_swapgs" \n" - ".section .fixup,\"ax\" \n" - "2: xorl %k0,%k0 \n" - " jmp 1b \n" - ".previous \n" - _ASM_EXTABLE(1b, 2b) - : : "r" (base&0xffff) ); - break; - - default: - ret = -EINVAL; - break; - } - - return ret; -} - - /* Returns TRUE if given descriptor is valid for GDT or LDT. */ int check_descriptor(const struct domain *dom, struct desc_struct *d) { -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |