mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: harden use of calc_ler_msr()
Avoid calling the function more than once, thus making sure we won't, under any unusual circumstances, attempt to enable XEN_LER late (which can't work, for setup_force_cpu_cap() being __init. In turn this then allows making the function itself __init, too. While fiddling with section attributes in this area, also move the two involved variables to .data.ro_after_init. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
7fbebfa540
commit
58ce5b6c33
1 file changed
+13
-4
+13
-4
@@ -126,11 +126,11 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct tss_page, tss_page);
|
||||
static int debug_stack_lines = 20;
|
||||
integer_param("debug_stack_lines", debug_stack_lines);
|
||||
|
||||
static bool opt_ler;
|
||||
static bool __ro_after_init opt_ler;
|
||||
boolean_param("ler", opt_ler);
|
||||
|
||||
/* LastExceptionFromIP on this hardware. Zero if LER is not in use. */
|
||||
unsigned int __read_mostly ler_msr;
|
||||
unsigned int __ro_after_init ler_msr;
|
||||
|
||||
const unsigned int nmi_cpu;
|
||||
|
||||
@@ -2133,7 +2133,7 @@ static void __init set_intr_gate(unsigned int n, void *addr)
|
||||
__set_intr_gate(n, 0, addr);
|
||||
}
|
||||
|
||||
static unsigned int calc_ler_msr(void)
|
||||
static unsigned int noinline __init calc_ler_msr(void)
|
||||
{
|
||||
switch ( boot_cpu_data.x86_vendor )
|
||||
{
|
||||
@@ -2171,8 +2171,17 @@ void percpu_traps_init(void)
|
||||
if ( !opt_ler )
|
||||
return;
|
||||
|
||||
if ( !ler_msr && (ler_msr = calc_ler_msr()) )
|
||||
if ( !ler_msr )
|
||||
{
|
||||
ler_msr = calc_ler_msr();
|
||||
if ( !ler_msr )
|
||||
{
|
||||
opt_ler = false;
|
||||
return;
|
||||
}
|
||||
|
||||
setup_force_cpu_cap(X86_FEATURE_XEN_LBR);
|
||||
}
|
||||
|
||||
if ( cpu_has_xen_lbr )
|
||||
wrmsrl(MSR_IA32_DEBUGCTLMSR, IA32_DEBUGCTLMSR_LBR);
|
||||
|
||||