lkml.org 
[lkml]   [2015]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 5/6] xen/x86/pvh: Add 32-bit PVH initialization code
    On Mon, Jul 06, 2015 at 11:34:24PM -0400, Boris Ostrovsky wrote:
    > Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>

    A little bit more here I think - as in that the parameter
    passing is not an Xen specific thing but something this
    code cooked up?

    > ---
    > arch/x86/xen/enlighten.c | 4 ----
    > arch/x86/xen/smp.c | 17 ++++++++++-------
    > arch/x86/xen/xen-head.S | 17 +++++++++++++++--
    > 3 files changed, 25 insertions(+), 13 deletions(-)
    >
    > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    > index 7953e68..807337e 100644
    > --- a/arch/x86/xen/enlighten.c
    > +++ b/arch/x86/xen/enlighten.c
    > @@ -1464,10 +1464,6 @@ static void __init xen_pvh_early_guest_init(void)
    >
    > xen_pvh_early_cpu_init(0, false);
    > xen_pvh_set_cr_flags(0);
    > -
    > -#ifdef CONFIG_X86_32
    > - BUG(); /* PVH: Implement proper support. */
    > -#endif
    > }
    > #endif /* CONFIG_XEN_PVH */
    >
    > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
    > index 7cf0765..99be53b 100644
    > --- a/arch/x86/xen/smp.c
    > +++ b/arch/x86/xen/smp.c
    > @@ -372,11 +372,8 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
    >
    > gdt = get_cpu_gdt_table(cpu);
    >
    > -#ifdef CONFIG_X86_32
    > - /* Note: PVH is not yet supported on x86_32. */
    > - ctxt->user_regs.fs = __KERNEL_PERCPU;
    > - ctxt->user_regs.gs = __KERNEL_STACK_CANARY;
    > -#endif
    > + ctxt->user_regs.esp = idle->thread.sp0 - sizeof(struct pt_regs);
    > + ctxt->ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(swapper_pg_dir));
    >
    > if (!xen_feature(XENFEAT_auto_translated_physmap)) {
    > ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle;
    > @@ -403,6 +400,8 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
    > ctxt->kernel_sp = idle->thread.sp0;
    >
    > #ifdef CONFIG_X86_32
    > + ctxt->user_regs.fs = __KERNEL_PERCPU;
    > + ctxt->user_regs.gs = __KERNEL_STACK_CANARY;
    > ctxt->event_callback_cs = __KERNEL_CS;
    > ctxt->failsafe_callback_cs = __KERNEL_CS;
    > #else
    > @@ -424,12 +423,16 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
    > */
    > ctxt->user_regs.eip =
    > (unsigned long)xen_pvh_early_cpu_init_secondary;
    > +#ifdef CONFIG_X86_64
    > ctxt->user_regs.rdi = cpu;
    > ctxt->user_regs.rsi = true; /* entry == true */
    > +#else
    > + *((uint32_t *)ctxt->user_regs.esp + 1) = cpu;
    > + *((uint32_t *)ctxt->user_regs.esp + 2) = true;
    > +#endif
    > }
    > #endif
    > - ctxt->user_regs.esp = idle->thread.sp0 - sizeof(struct pt_regs);
    > - ctxt->ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(swapper_pg_dir));
    > +
    > if (HYPERVISOR_vcpu_op(VCPUOP_initialise, cpu, ctxt))
    > BUG();
    >
    > diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
    > index b1508a8..12c4e2a 100644
    > --- a/arch/x86/xen/xen-head.S
    > +++ b/arch/x86/xen/xen-head.S
    > @@ -51,14 +51,18 @@ ENTRY(startup_xen)
    >
    > #ifdef CONFIG_XEN_PVH
    > /*
    > - * xen_pvh_early_cpu_init() - early PVH VCPU initialization
    > + * xen_pvh_early_cpu_init(cpu, entry) - early PVH VCPU initialization
    > * @cpu: this cpu number (%rdi)
    > * @entry: true if this is a secondary vcpu coming up on this entry
    > * point, false if this is the boot CPU being initialized for
    > * the first time (%rsi)

    Should this be updated to reflect how it is to be done on 32-bit (as in
    not using %rdi and %rsi?)
    > */
    > ENTRY(xen_pvh_early_cpu_init)
    > +#ifdef CONFIG_X86_64
    > mov %rbx, -8(%rsp)
    > +#else
    > + mov %ebx, -4(%esp)
    > +#endif
    >
    > /* Entry point for secondary CPUs */
    > ENTRY(xen_pvh_early_cpu_init_secondary)
    > @@ -69,15 +73,24 @@ ENTRY(xen_pvh_early_cpu_init_secondary)
    >
    > mov $MSR_EFER, %ecx
    > rdmsr
    > +#ifdef CONFIG_X86_64
    > bts $_EFER_SCE, %eax
    > +#endif
    >
    > bt $20, %ebx
    > jnc 1f /* No NX, skip setting it */
    > bts $_EFER_NX, %eax
    > 1: wrmsr
    > +
    > +#ifdef CONFIG_X86_64
    > mov -8(%rsp), %rbx
    > -#ifdef CONFIG_SMP
    > cmp $0, %esi
    > +#else
    > + mov -4(%esp), %ebx
    > + cmp $0, 8(%esp) /* second argument */
    > +#endif
    > +
    > +#ifdef CONFIG_SMP
    > jne cpu_bringup_and_idle
    > #endif
    > ret
    > --
    > 1.8.1.4
    >


    \
     
     \ /
      Last update: 2015-07-07 22:21    [W:4.128 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site