From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
Subject: Re: [[RFC PATCH 2/8]: PVH: changes related to initial boot and irq rewiring
Date: Thu, 16 Aug 2012 10:09:29 -0400 [thread overview]
Message-ID: <20120816140929.GB17687@phenom.dumpdata.com> (raw)
In-Reply-To: <20120815180131.24aaa5ce@mantra.us.oracle.com>
On Wed, Aug 15, 2012 at 06:01:31PM -0700, Mukesh Rathor wrote:
>
> ---
> arch/x86/xen/enlighten.c | 67 ++++++++++++++++++++++++++++++++++++++-------
> arch/x86/xen/irq.c | 22 ++++++++++++++-
> 2 files changed, 77 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> index bf4bda6..3a58c51 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -139,6 +139,8 @@ struct tls_descs {
> */
> static DEFINE_PER_CPU(struct tls_descs, shadow_tls_desc);
>
> +static void __init xen_hvm_init_shared_info(void);
> +
> static void clamp_max_cpus(void)
> {
> #ifdef CONFIG_SMP
> @@ -217,8 +219,8 @@ static void __init xen_banner(void)
> struct xen_extraversion extra;
> HYPERVISOR_xen_version(XENVER_extraversion, &extra);
>
> - printk(KERN_INFO "Booting paravirtualized kernel on %s\n",
> - pv_info.name);
> + printk(KERN_INFO "Booting paravirtualized kernel %son %s\n",
> + (xen_pvh_domain() ? "in HVM " : ""), pv_info.name);
> printk(KERN_INFO "Xen version: %d.%d%s%s\n",
> version >> 16, version & 0xffff, extra.extraversion,
> xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : "");
> @@ -271,12 +273,15 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
> break;
> }
>
> - asm(XEN_EMULATE_PREFIX "cpuid"
> - : "=a" (*ax),
> - "=b" (*bx),
> - "=c" (*cx),
> - "=d" (*dx)
> - : "0" (*ax), "2" (*cx));
> + if (xen_pvh_domain())
> + native_cpuid(ax, bx, cx, dx);
> + else
> + asm(XEN_EMULATE_PREFIX "cpuid"
> + : "=a" (*ax),
> + "=b" (*bx),
> + "=c" (*cx),
> + "=d" (*dx)
> + : "0" (*ax), "2" (*cx));
>
> *bx &= maskebx;
> *cx &= maskecx;
> @@ -1034,6 +1039,10 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
>
> void xen_setup_shared_info(void)
> {
> + /* do later in xen_pvh_guest_init() when extend_brk is properly setup*/
> + if (xen_pvh_domain() && xen_initial_domain())
> + return;
> +
> if (!xen_feature(XENFEAT_auto_translated_physmap)) {
> set_fixmap(FIX_PARAVIRT_BOOTMAP,
> xen_start_info->shared_info);
> @@ -1044,6 +1053,10 @@ void xen_setup_shared_info(void)
> HYPERVISOR_shared_info =
> (struct shared_info *)__va(xen_start_info->shared_info);
>
> + /* PVH TBD/FIXME: vcpu info placement in phase 2 */
> + if (xen_pvh_domain())
> + return;
> +
> #ifndef CONFIG_SMP
> /* In UP this is as good a place as any to set up shared info */
> xen_setup_vcpu_info_placement();
> @@ -1274,6 +1287,10 @@ static const struct machine_ops xen_machine_ops __initconst = {
> */
> static void __init xen_setup_stackprotector(void)
> {
> + if (xen_pvh_domain()) {
> + switch_to_new_gdt(0);
> + return;
> + }
> pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot;
> pv_cpu_ops.load_gdt = xen_load_gdt_boot;
>
> @@ -1284,6 +1301,25 @@ static void __init xen_setup_stackprotector(void)
> pv_cpu_ops.load_gdt = xen_load_gdt;
> }
>
> +static void __init xen_pvh_guest_init(void)
> +{
> +#ifndef __HAVE_ARCH_PTE_SPECIAL
> + ("__HAVE_ARCH_PTE_SPECIAL is required for PVH for now\n");
> + #error("__HAVE_ARCH_PTE_SPECIAL is required for PVH\n");
> +#endif
Should this be just rolled in the Kconfig as part of enabling
this mode?
> + /* PVH TBD/FIXME: for now just disable this. */
> + have_vcpu_info_placement = 0;
> +
> + if (xen_feature(XENFEAT_hvm_callback_vector))
> + xen_have_vector_callback = 1;
> +
> + /* for domU, the library sets start_info.shared_info to pfn, but for
> + * dom0, it contains mfn. we need to get the pfn for shared_info. PVH
> + * uses HVM code in many places */
> + if (xen_initial_domain())
> + xen_hvm_init_shared_info();
> +}
> +
> /* First C function to be called on Xen boot */
> asmlinkage void __init xen_start_kernel(void)
> {
> @@ -1294,15 +1330,23 @@ asmlinkage void __init xen_start_kernel(void)
> if (!xen_start_info)
> return;
>
> +#ifdef CONFIG_X86_32
> + xen_raw_printk("ERROR: 32bit PV guest can not run in HVM container\n");
> + return;
Perhaps BUG() ?
> +#endif
> xen_domain_type = XEN_PV_DOMAIN;
>
> + xen_setup_features();
> xen_setup_machphys_mapping();
>
> /* Install Xen paravirt ops */
> pv_info = xen_info;
> pv_init_ops = xen_init_ops;
> - pv_cpu_ops = xen_cpu_ops;
> pv_apic_ops = xen_apic_ops;
> + if (xen_pvh_domain())
> + pv_cpu_ops.cpuid = xen_cpuid;
> + else
> + pv_cpu_ops = xen_cpu_ops;
>
> x86_init.resources.memory_setup = xen_memory_setup;
> x86_init.oem.arch_setup = xen_arch_setup;
> @@ -1334,8 +1378,6 @@ asmlinkage void __init xen_start_kernel(void)
> /* Work out if we support NX */
> x86_configure_nx();
>
> - xen_setup_features();
> -
> /* Get mfn list */
> if (!xen_feature(XENFEAT_auto_translated_physmap))
> xen_build_dynamic_phys_to_machine();
> @@ -1462,6 +1504,9 @@ asmlinkage void __init xen_start_kernel(void)
>
> xen_setup_runstate_info(0);
>
> + if (xen_pvh_domain())
> + xen_pvh_guest_init();
> +
> /* Start the world */
> #ifdef CONFIG_X86_32
> i386_start_kernel();
> diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c
> index 1573376..7c7dfd1 100644
> --- a/arch/x86/xen/irq.c
> +++ b/arch/x86/xen/irq.c
> @@ -100,6 +100,10 @@ PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable);
>
> static void xen_safe_halt(void)
> {
> + /* so event channel can be delivered to us, since in HVM container */
> + if (xen_pvh_domain())
> + local_irq_enable();
> +
> /* Blocking includes an implicit local_irq_enable(). */
> if (HYPERVISOR_sched_op(SCHEDOP_block, NULL) != 0)
> BUG();
> @@ -126,8 +130,24 @@ static const struct pv_irq_ops xen_irq_ops __initconst = {
> #endif
> };
>
> +static const struct pv_irq_ops xen_pvh_irq_ops __initdata = {
> + .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
> + .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl),
> + .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
> + .irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable),
> +
> + .safe_halt = xen_safe_halt,
> + .halt = xen_halt,
> +#ifdef CONFIG_X86_64
> + .adjust_exception_frame = paravirt_nop,
> +#endif
> +};
> +
> void __init xen_init_irq_ops(void)
> {
> - pv_irq_ops = xen_irq_ops;
> + if (xen_pvh_domain())
> + pv_irq_ops = xen_pvh_irq_ops;
> + else
> + pv_irq_ops = xen_irq_ops;
> x86_init.irqs.intr_init = xen_init_IRQ;
> }
> --
> 1.7.2.3
next prev parent reply other threads:[~2012-08-16 14:09 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-16 1:01 [[RFC PATCH 2/8]: PVH: changes related to initial boot and irq rewiring Mukesh Rathor
2012-08-16 14:05 ` Stefano Stabellini
2012-08-16 18:56 ` Mukesh Rathor
2012-08-16 14:09 ` Konrad Rzeszutek Wilk [this message]
2012-08-16 19:00 ` Mukesh Rathor
2012-08-16 19:09 ` Konrad Rzeszutek Wilk
2012-08-16 21:45 ` Mukesh Rathor
2012-08-17 8:56 ` Ian Campbell
2012-08-17 23:37 ` Mukesh Rathor
2012-08-18 8:23 ` Ian Campbell
2012-09-04 23:56 ` Mukesh Rathor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120816140929.GB17687@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=Xen-devel@lists.xensource.com \
--cc=mukesh.rathor@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.