Skip to content
  • Konrad Rzeszutek Wilk's avatar
    xen/enlighten: Disable MWAIT_LEAF so that acpi-pad won't be loaded. · df88b2d9
    Konrad Rzeszutek Wilk authored
    
    
    There are exactly four users of __monitor and __mwait:
    
     - cstate.c (which allows acpi_processor_ffh_cstate_enter to be called
       when the cpuidle API drivers are used. However patch
       "cpuidle: replace xen access to x86 pm_idle and default_idle"
       provides a mechanism to disable the cpuidle and use safe_halt.
     - smpboot (which allows mwait_play_dead to be called). However
       safe_halt is always used so we skip that.
     - intel_idle (same deal as above).
     - acpi_pad.c. This the one that we do not want to run as we
       will hit the below crash.
    
    Why do we want to expose MWAIT_LEAF in the first place?
    We want it for the xen-acpi-processor driver - which uploads
    C-states to the hypervisor. If MWAIT_LEAF is set, the cstate.c
    sets the proper address in the C-states so that the hypervisor
    can benefit from using the MWAIT functionality. And that is
    the sole reason for using it.
    
    Without this patch, if a module performs mwait or monitor we
    get this:
    
    invalid opcode: 0000 [#1] SMP
    CPU 2
    .. snip..
    Pid: 5036, comm: insmod Tainted: G           O 3.4.0-rc2upstream-dirty #2 Intel Corporation S2600CP/S2600CP
    RIP: e030:[<ffffffffa000a017>]  [<ffffffffa000a017>] mwait_check_init+0x17/0x1000 [mwait_check]
    RSP: e02b:ffff8801c298bf18  EFLAGS: 00010282
    RAX: ffff8801c298a010 RBX: ffffffffa03b2000 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffff8801c29800d8 RDI: ffff8801ff097200
    RBP: ffff8801c298bf18 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000
    R13: ffffffffa000a000 R14: 0000005148db7294 R15: 0000000000000003
    FS:  00007fbb364f2700(0000) GS:ffff8801ff08c000(0000) knlGS:0000000000000000
    CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 000000000179f038 CR3: 00000001c9469000 CR4: 0000000000002660
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process insmod (pid: 5036, threadinfo ffff8801c298a000, task ffff8801c29cd7e0)
    Stack:
     ffff8801c298bf48 ffffffff81002124 ffffffffa03b2000 00000000000081fd
     000000000178f010 000000000178f030 ffff8801c298bf78 ffffffff810c41e6
     00007fff3fb30db9 00007fff3fb30db9 00000000000081fd 0000000000010000
    Call Trace:
     [<ffffffff81002124>] do_one_initcall+0x124/0x170
     [<ffffffff810c41e6>] sys_init_module+0xc6/0x220
     [<ffffffff815b15b9>] system_call_fastpath+0x16/0x1b
    Code: <0f> 01 c8 31 c0 0f 01 c9 c9 c3 00 00 00 00 00 00 00 00 00 00 00 00
    RIP  [<ffffffffa000a017>] mwait_check_init+0x17/0x1000 [mwait_check]
     RSP <ffff8801c298bf18>
    ---[ end trace 16582fc8a3d1e29a ]---
    Kernel panic - not syncing: Fatal exception
    
    With this module (which is what acpi_pad.c would hit):
    
    MODULE_AUTHOR("Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>");
    MODULE_DESCRIPTION("mwait_check_and_back");
    MODULE_LICENSE("GPL");
    MODULE_VERSION();
    
    static int __init mwait_check_init(void)
    {
    	__monitor((void *)&current_thread_info()->flags, 0, 0);
    	__mwait(0, 0);
    	return 0;
    }
    static void __exit mwait_check_exit(void)
    {
    }
    module_init(mwait_check_init);
    module_exit(mwait_check_exit);
    
    Reported-by: default avatarLiu, Jinsong <jinsong.liu@intel.com>
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    df88b2d9