[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [RFC PATCH 5/8]: PVH: smp changes



On Thu, 2012-08-16 at 02:04 +0100, Mukesh Rathor wrote:
> ---
>  arch/x86/xen/smp.c |   33 +++++++++++++++++++++++++--------
>  1 files changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
> index cdf269d..017d7fa 100644
> --- a/arch/x86/xen/smp.c
> +++ b/arch/x86/xen/smp.c
> @@ -68,9 +68,11 @@ static void __cpuinit cpu_bringup(void)
>       touch_softlockup_watchdog();
>       preempt_disable();
>  
> -     xen_enable_sysenter();
> -     xen_enable_syscall();
> -
> +     /* PVH runs in ring 0 and allows us to do native syscalls. Yay! */
> +     if (!xen_pvh_domain()) {

Can this be gated on X86_FEATURE_BLAH, with appropriate masking for the
PV vs PVH cases.

Looks like enable_sysenter actually does that already, maybe
enable_syscall could too?

> +             xen_enable_sysenter();
> +             xen_enable_syscall();
> +     }
>       cpu = smp_processor_id();
>       smp_store_cpu_info(cpu);
>       cpu_data(cpu).x86_max_cores = 1;
> @@ -230,10 +232,11 @@ static void __init xen_smp_prepare_boot_cpu(void)
>       BUG_ON(smp_processor_id() != 0);
>       native_smp_prepare_boot_cpu();
>  
> -     /* We've switched to the "real" per-cpu gdt, so make sure the
> -        old memory can be recycled */
> -     make_lowmem_page_readwrite(xen_initial_gdt);
> -
> +     if (!xen_pvh_domain()) {

XENFEAT_writable_pagetalbes, I think? And possibly pushed down into
make_lowmem_page_readwrite?

> +             /* We've switched to the "real" per-cpu gdt, so make sure the
> +              * old memory can be recycled */
> +             make_lowmem_page_readwrite(xen_initial_gdt);
> +     }
>       xen_filter_cpu_maps();
>       xen_setup_vcpu_info_placement();
>  }
> @@ -312,6 +315,7 @@ cpu_initialize_context(unsigned int cpu, struct 
> task_struct *idle)
>  
>       memset(&ctxt->fpu_ctxt, 0, sizeof(ctxt->fpu_ctxt));
>  
> +     if (!xen_pvh_domain()) {
>               ctxt->user_regs.ds = __USER_DS;
>               ctxt->user_regs.es = __USER_DS;
>  
> @@ -339,7 +343,20 @@ cpu_initialize_context(unsigned int cpu, struct 
> task_struct *idle)
>                                       (unsigned long)xen_hypervisor_callback;
>               ctxt->failsafe_callback_eip = 
>                                       (unsigned long)xen_failsafe_callback;
> -
> +     } else {
> +             ctxt->user_regs.ds = __KERNEL_DS;
> +             ctxt->user_regs.es = 0;
> +             ctxt->user_regs.gs = 0;

Not __KERNEL_DS for es too?

Not sure about gs -- shouldn't that point to some per-cpu segment or
something? Maybe that happens somewhere else? (in which case a comment?)

> +
> +             ctxt->gdt_frames[0] = (unsigned long)gdt;
> +             ctxt->gdt_ents = (unsigned long)(GDT_SIZE - 1);
> +
> +             /* Note: PVH is not supported on x86_32. */
> +#ifdef __x86_64__

ITYM CONFIG_X86_64?

> +             ctxt->gs_base_user = (unsigned long)
> +                                      per_cpu(irq_stack_union.gs_base, cpu);
> +#endif
> +     }
>       ctxt->user_regs.cs = __KERNEL_CS;
>       ctxt->user_regs.esp = idle->thread.sp0 - sizeof(struct pt_regs);
>  



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.