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