Syntic Interrupt Controller (SynIC) jest rozszerzeniem wirtualizowanego kontrolera przerwań (wirtualnego LAPIC). SynIC nie tylko zapewnia wydajne dostarczanie przerwań, ale jest również używany do komunikacji między partycjami. Partycje mogą komunikować się ze sobą za pomocą dwóch mechanizmów: wiadomości i zdarzeń. Gdy partycja docelowa otrzymuje wiadomość lub zdarzenie, odbywa się to za pośrednictwem SynIC. SynIC CONTROL MSR Każdy procesor wirtualny ma SynIC, który jest domyślnie wyłączony. Aby włączyć SynIC dla bieżącego procesora wirtualnego, musimy zapisać do rejestru HV_X64_MSR_SCONTROL (0x40000080), ustawiając jego pole „enable”. Układ rejestru HV_X64_MSR_SCONTROL jest następujący:
- Bity 63–1 Bity zarezerwowane.
- Bit 0 Włącz/wyłącz SynIC dla bieżącego procesora wirtualnego.
Rejestry SINT MSR SynIC udostępnia 16 kolejnych rejestrów „źródła przerwań syntetycznych” (SINTx): HV_X64_MSR_SINT0 (0x40000090) do HV_X64_MSR_SINT15 (0x4000009F). Źródła przerwań mogą być selektywnie demaskowane, a następnie przypisywane do określonego wektora przerwań. W ten sposób gość może być powiadamiany o zdarzeniach za pośrednictwem przerwań (jeśli przerwania są włączone), które są obsługiwane przez odpowiednią procedurę serwisową z IDT (Interrupt Descriptor Table) gościa. Układ rejestru SINT jest następujący:
- Bity 63–19 Zarezerwowane bity.
- Bit 18 Pole „Polling”. Jeśli ten bit jest włączony, źródło przerwań jest demaskowane bez generowania przerwań.
- Bit 17 Pole „AutoEOI”. Jeśli ten bit jest włączony, po dostarczeniu przerwania wykonywany jest niejawny End Of Interrupt (EOI).
- Pole „Masked” bitu 16. Wszystkie rejestry SINT zaczynają się od tego bitu ustawionego domyślnie. Gość może odmaskować źródło przerwania, czyszcząc ten bit.
- Bity 15–8 Zarezerwowane bity.
- Bity 7–0 Wektor przerwania. Gość może ustawić tę wartość na dowolny wektor w zakresie 16–255.
Docelowy SINTx wiadomości lub zdarzenia może być następujący:
- Niejawny (na przykład SINT0 jest zarezerwowany dla wiadomości pochodzących z hiperwizora).
- Jawny (na przykład pole SINTx rejestrów Synthetic Timer Configuration).
- Przypisany do portu przydzielonego przez hiperwywołanie HvCallCreatePort.
Wywołujący musi określić typ portu: HvPortTypeMessage, HvPortTypeEvent lub HvPortTypeMonitor. W przypadku pierwszych dwóch typów należy określić docelowy SINTx. To hiperwywołanie jest używane przez partycję główną do tworzenia portów używanych przez VMBus. SIMP MSR Rejestr HV_X64_MSR_SIMP (0x40000083) jest używany do włączania i przypisywania adresu bazowego strony wiadomości syntetycznego przerwania (SIMP). Ta strona zawiera zestaw gniazd wiadomości do odbierania wiadomości z hiperwizora lub innych partycji (nadawcy używają hiperwywołania HvCallPostMessage). Gniazda są ułożone jako tablica struktur danych HV_MESSAGE, z jednym gniazdem na SINTx (16). Po skopiowaniu nowej wiadomości do gniazda hiperwizor spróbuje dostarczyć przerwanie wyzwalane krawędzią do odpowiedniego SINTx (jeśli nie jest w trybie sondowania). Struktura HV_MESSAGE jest zdefiniowana w następujący sposób:

HV_MESSAGE składa się z nagłówka i ładunku zawierającego faktyczną wiadomość. Nagłówek wiadomości zaczyna się od 32-bitowego identyfikatora (1). Wiadomości pochodzące z hiperwizora mają ustawiony bit
HV_MESSAGE_TYPE_HYPERVISOR_MASK (0x80000000),
podczas gdy wiadomości pochodzące z partycji mogą używać dowolnej innej wartości, o ile nie ustawią tego bitu. Wartość HvMessageTypeNone (0x00000000) oznacza, że slot jest pusty. Po otrzymaniu wiadomości gość powinien ustawić MessageType na HvMessageTypeNone, a następnie potwierdzić koniec wiadomości (EOM). Na koniec nagłówek zawiera albo identyfikator partycji (2) (na przykład wiadomości przechwytujące zawierają identyfikator dziecka) albo identyfikator portu (3) (skojarzony z identyfikatorem połączenia), gdy wiadomość została wysłana za pośrednictwem HvCallPostMessage. Układ HV_X64_MSR_SIMP jest następujący:
- Bity 63–12 GPFN, gdzie mapowany jest SIMP.
- Bity 11–1 Zarezerwowane.
- Bit 0 Włącz/wyłącz SIMP.EOM MSR Po przetworzeniu wiadomości dostarczonej do gniazda SIMP i ustawieniu jej na HvMessageTypeNone możemy zapisać zero w HV_X64_MSR_EOM (0x40000084), aby hiperwizor wiedział, że może usunąć z kolejki i dostarczyć następną wiadomość.
SIEFP MSR HV_X64_MSR_SIEFP (0x40000082) służy do włączania i
przypisywania adresu bazowego strony Synthetic Interrupt Event Flags Page (SIEFP). Ta strona zawiera 16-elementową tablicę HV_SYNIC_EVENT_FLAGS; każdy element jest bitmapą o stałym rozmiarze i pojemności 2048 flag:

Gdy port HvPortTypeEvent jest przydzielany za pomocą HvCallCreatePort, należy podać następujące informacje:

Oprócz docelowego SINTx (1) i docelowego procesora wirtualnego (2), port zdarzeń ma numer flagi bazowej (3) i liczbę flag (4). Partycja może użyć HvCallSignalEvent do ustawienia określonej flagi w partycji docelowej, przekazując dwa parametry: parametr identyfikatora połączenia (skojarzony z portem zdarzeń) i numer flagi (ten numer musi być niższy od FlagCount portu zdarzeń). Wartość BaseFlagNumber jest dodawana do numeru flagi, a wynikiem jest bezwzględna pozycja bitowa, która zostanie ustawiona w mapie bitowej HV_SYNIC_EVENT_FLAGS gniazda odpowiadającego docelowemu SINTx. Po ustawieniu flagi hiperwizor spróbuje dostarczyć przerwanie wyzwalane krawędzią do odpowiadającego mu SINTx (jeśli nie jest w trybie sondowania). Gość odbierający zdarzenia powinien użyć atomowej instrukcji Compare and Swap (CAS), aby wyczyścić flagi, a następnie potwierdzić EOI (za pośrednictwem APIC). Układ HV_X64_MSR_SIEFP jest następujący:
- Bity 63–12 GPFN, gdzie mapowany jest SIEFP.
- Bity 11–1 Zarezerwowane.
- Bit 0 Włącz/wyłącz SIEFP.


