1 #include "hyperv.h" 2 3 static void synic_ctl(u8 ctl, u8 vcpu_id, u8 sint) 4 { 5 outl((ctl << 16)|((vcpu_id) << 8)|sint, 0x3000); 6 } 7 8 void synic_sint_create(int vcpu, int sint, int vec, bool auto_eoi) 9 { 10 wrmsr(HV_X64_MSR_SINT0 + sint, 11 (u64)vec | ((auto_eoi) ? HV_SYNIC_SINT_AUTO_EOI : 0)); 12 synic_ctl(HV_TEST_DEV_SINT_ROUTE_CREATE, vcpu, sint); 13 } 14 15 void synic_sint_set(int vcpu, int sint) 16 { 17 synic_ctl(HV_TEST_DEV_SINT_ROUTE_SET_SINT, vcpu, sint); 18 } 19 20 void synic_sint_destroy(int vcpu, int sint) 21 { 22 wrmsr(HV_X64_MSR_SINT0 + sint, 0xFF|HV_SYNIC_SINT_MASKED); 23 synic_ctl(HV_TEST_DEV_SINT_ROUTE_DESTROY, vcpu, sint); 24 } 25