LLVM code generation can attempt to load from a variable in the next
condition of an expression under certain circumstances, thus
attempting to load use_xsave regardless of the value of the bsp
variable, which leads to a page fault when the init section has
already been unmapped.
Fix this by making use_xsave non-init, thus preventing the page fault.
The LLVM bug with the discussion about this issue can be found at:
https://bugs.llvm.org/show_bug.cgi?id=39707
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
xen/arch/x86/xstate.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c
index 3293ef834f..1dddda2818 100644
--- a/xen/arch/x86/xstate.c
+++ b/xen/arch/x86/xstate.c
@@ -577,7 +577,11 @@ unsigned int xstate_ctxt_size(u64 xcr0)
/* Collect the information of processor's extended state */
void xstate_init(struct cpuinfo_x86 *c)
{
- static bool __initdata use_xsave = true;
+ /*
+ * NB: use_xsave cannot live in initdata because llvm might optimize
+ * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707
+ */
+ static bool use_xsave = true;
boolean_param("xsave", use_xsave);
bool bsp = c == &boot_cpu_data;
--
2.22.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
On 05.09.2019 18:04, Roger Pau Monne wrote: > --- a/xen/arch/x86/xstate.c > +++ b/xen/arch/x86/xstate.c > @@ -577,7 +577,11 @@ unsigned int xstate_ctxt_size(u64 xcr0) > /* Collect the information of processor's extended state */ > void xstate_init(struct cpuinfo_x86 *c) > { > - static bool __initdata use_xsave = true; > + /* > + * NB: use_xsave cannot live in initdata because llvm might optimize > + * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707 > + */ > + static bool use_xsave = true; > boolean_param("xsave", use_xsave); > > bool bsp = c == &boot_cpu_data; I think we'd want to use __read_mostly then instead. Can be added while committing of course, if you agree. With the addition Acked-by: Jan Beulich <jbeulich@suse.com> Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
On Fri, Sep 06, 2019 at 03:33:50PM +0200, Jan Beulich wrote: > On 05.09.2019 18:04, Roger Pau Monne wrote: > > --- a/xen/arch/x86/xstate.c > > +++ b/xen/arch/x86/xstate.c > > @@ -577,7 +577,11 @@ unsigned int xstate_ctxt_size(u64 xcr0) > > /* Collect the information of processor's extended state */ > > void xstate_init(struct cpuinfo_x86 *c) > > { > > - static bool __initdata use_xsave = true; > > + /* > > + * NB: use_xsave cannot live in initdata because llvm might optimize > > + * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707 > > + */ > > + static bool use_xsave = true; > > boolean_param("xsave", use_xsave); > > > > bool bsp = c == &boot_cpu_data; > > I think we'd want to use __read_mostly then instead. Can be added > while committing of course, if you agree. With the addition > Acked-by: Jan Beulich <jbeulich@suse.com> Yes, that seems OK to me. Feel free to expand the commit message to mention the change to read_mostly if you want. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
© 2016 - 2024 Red Hat, Inc.