← Documents Documentation/virt/kvm/devices/arm-vgic-its.rst GitHub 원문 ↗

Linux 6.18.37 · 가상화 / KVM / Device

ARM Virtual ITS

Guest MSI·MSI-X를 처리하는 virtual ITS의 address, register, table migration ABI와 reset state입니다.

Source pathDocumentation/virt/kvm/devices/arm-vgic-its.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

arm-vgic-its.rst:1-215

Guest MSI·MSI-X를 처리하는 virtual ITS의 address, register, table migration ABI와 reset state입니다.

Register, attribute, bit field, error code와 source path는 원문 표기를 유지했습니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 ===============================================
4 ARM Virtual Interrupt Translation Service (ITS)
5 ===============================================
6
7 Device types supported:
8 KVM_DEV_TYPE_ARM_VGIC_ITS ARM Interrupt Translation Service Controller
9
10 The ITS allows MSI(-X) interrupts to be injected into guests. This extension is
11 optional. Creating a virtual ITS controller also requires a host GICv3 (see
12 arm-vgic-v3.txt), but does not depend on having physical ITS controllers.
13
14 There can be multiple ITS controllers per guest, each of them has to have
15 a separate, non-overlapping MMIO region.
16
17
18 Groups
19 ======
20
21 KVM_DEV_ARM_VGIC_GRP_ADDR
22 -------------------------
23
24 Attributes:
25 KVM_VGIC_ITS_ADDR_TYPE (rw, 64-bit)
26 Base address in the guest physical address space of the GICv3 ITS
27 control register frame.
28 This address needs to be 64K aligned and the region covers 128K.
29
30 Errors:
31
32 ======= =================================================
33 -E2BIG Address outside of addressable IPA range
34 -EINVAL Incorrectly aligned address
35 -EEXIST Address already configured
36 -EFAULT Invalid user pointer for attr->addr.
37 -ENODEV Incorrect attribute or the ITS is not supported.
38 ======= =================================================
39
40
41 KVM_DEV_ARM_VGIC_GRP_CTRL
42 -------------------------
43
44 Attributes:
45 KVM_DEV_ARM_VGIC_CTRL_INIT
46 request the initialization of the ITS, no additional parameter in
47 kvm_device_attr.addr.
48
49 KVM_DEV_ARM_ITS_CTRL_RESET
50 reset the ITS, no additional parameter in kvm_device_attr.addr.
51 See "ITS Reset State" section.
52
53 KVM_DEV_ARM_ITS_SAVE_TABLES
54 save the ITS table data into guest RAM, at the location provisioned
55 by the guest in corresponding registers/table entries. Should userspace
56 require a form of dirty tracking to identify which pages are modified
57 by the saving process, it should use a bitmap even if using another
58 mechanism to track the memory dirtied by the vCPUs.
59
60 The layout of the tables in guest memory defines an ABI. The entries
61 are laid out in little endian format as described in the last paragraph.
62
63 KVM_DEV_ARM_ITS_RESTORE_TABLES
64 restore the ITS tables from guest RAM to ITS internal structures.
65
66 The GICV3 must be restored before the ITS and all ITS registers but
67 the GITS_CTLR must be restored before restoring the ITS tables.
68
69 The GITS_IIDR read-only register must also be restored before
70 calling KVM_DEV_ARM_ITS_RESTORE_TABLES as the IIDR revision field
71 encodes the ABI revision.
72
73 The expected ordering when restoring the GICv3/ITS is described in section
74 "ITS Restore Sequence".
75
76 Errors:
77
78 ======= ==========================================================
79 -ENXIO ITS not properly configured as required prior to setting
80 this attribute
81 -ENOMEM Memory shortage when allocating ITS internal data
82 -EINVAL Inconsistent restored data
83 -EFAULT Invalid guest ram access
84 -EBUSY One or more VCPUS are running
85 -EACCES The virtual ITS is backed by a physical GICv4 ITS, and the
86 state is not available without GICv4.1
87 ======= ==========================================================
88
89 KVM_DEV_ARM_VGIC_GRP_ITS_REGS
90 -----------------------------
91
92 Attributes:
93 The attr field of kvm_device_attr encodes the offset of the
94 ITS register, relative to the ITS control frame base address
95 (ITS_base).
96
97 kvm_device_attr.addr points to a __u64 value whatever the width
98 of the addressed register (32/64 bits). 64 bit registers can only
99 be accessed with full length.
100
101 Writes to read-only registers are ignored by the kernel except for:
102
103 - GITS_CREADR. It must be restored otherwise commands in the queue
104 will be re-executed after restoring CWRITER. GITS_CREADR must be
105 restored before restoring the GITS_CTLR which is likely to enable the
106 ITS. Also it must be restored after GITS_CBASER since a write to
107 GITS_CBASER resets GITS_CREADR.
108 - GITS_IIDR. The Revision field encodes the table layout ABI revision.
109 In the future we might implement direct injection of virtual LPIs.
110 This will require an upgrade of the table layout and an evolution of
111 the ABI. GITS_IIDR must be restored before calling
112 KVM_DEV_ARM_ITS_RESTORE_TABLES.
113
114 For other registers, getting or setting a register has the same
115 effect as reading/writing the register on real hardware.
116
117 Errors:
118
119 ======= ====================================================
120 -ENXIO Offset does not correspond to any supported register
121 -EFAULT Invalid user pointer for attr->addr
122 -EINVAL Offset is not 64-bit aligned
123 -EBUSY one or more VCPUS are running
124 ======= ====================================================
125
126 ITS Restore Sequence:
127 ---------------------
128
129 The following ordering must be followed when restoring the GIC, ITS, and
130 KVM_IRQFD assignments:
131
132 a) restore all guest memory and create vcpus
133 b) restore all redistributors
134 c) provide the ITS base address
135 (KVM_DEV_ARM_VGIC_GRP_ADDR)
136 d) restore the ITS in the following order:
137
138 1. Restore GITS_CBASER
139 2. Restore all other ``GITS_`` registers, except GITS_CTLR!
140 3. Load the ITS table data (KVM_DEV_ARM_ITS_RESTORE_TABLES)
141 4. Restore GITS_CTLR
142
143 e) restore KVM_IRQFD assignments for MSIs
144
145 Then vcpus can be started.
146
147 ITS Table ABI REV0:
148 -------------------
149
150 Revision 0 of the ABI only supports the features of a virtual GICv3, and does
151 not support a virtual GICv4 with support for direct injection of virtual
152 interrupts for nested hypervisors.
153
154 The device table and ITT are indexed by the DeviceID and EventID,
155 respectively. The collection table is not indexed by CollectionID, and the
156 entries in the collection are listed in no particular order.
157 All entries are 8 bytes.
158
159 Device Table Entry (DTE)::
160
161 bits: | 63| 62 ... 49 | 48 ... 5 | 4 ... 0 |
162 values: | V | next | ITT_addr | Size |
163
164 where:
165
166 - V indicates whether the entry is valid. If not, other fields
167 are not meaningful.
168 - next: equals to 0 if this entry is the last one; otherwise it
169 corresponds to the DeviceID offset to the next DTE, capped by
170 2^14 -1.
171 - ITT_addr matches bits [51:8] of the ITT address (256 Byte aligned).
172 - Size specifies the supported number of bits for the EventID,
173 minus one
174
175 Collection Table Entry (CTE)::
176
177 bits: | 63| 62 .. 52 | 51 ... 16 | 15 ... 0 |
178 values: | V | RES0 | RDBase | ICID |
179
180 where:
181
182 - V indicates whether the entry is valid. If not, other fields are
183 not meaningful.
184 - RES0: reserved field with Should-Be-Zero-or-Preserved behavior.
185 - RDBase is the PE number (GICR_TYPER.Processor_Number semantic),
186 - ICID is the collection ID
187
188 Interrupt Translation Entry (ITE)::
189
190 bits: | 63 ... 48 | 47 ... 16 | 15 ... 0 |
191 values: | next | pINTID | ICID |
192
193 where:
194
195 - next: equals to 0 if this entry is the last one; otherwise it corresponds
196 to the EventID offset to the next ITE capped by 2^16 -1.
197 - pINTID is the physical LPI ID; if zero, it means the entry is not valid
198 and other fields are not meaningful.
199 - ICID is the collection ID
200
201 ITS Reset State:
202 ----------------
203
204 RESET returns the ITS to the same state that it was when first created and
205 initialized. When the RESET command returns, the following things are
206 guaranteed:
207
208 - The ITS is not enabled and quiescent
209 GITS_CTLR.Enabled = 0 .Quiescent=1
210 - There is no internally cached state
211 - No collection or device table are used
212 GITS_BASER<n>.Valid = 0
213 - GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0
214 - The ABI version is unchanged and remains the one set when the ITS
215 device was first created.
216

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

ITS device와 MMIO address

1-40

`KVM_DEV_TYPE_ARM_VGIC_ITS`는 guest에 MSI와 MSI-X interrupt를 주입하는 optional virtual Interrupt Translation Service controller입니다. Virtual ITS 생성에는 host GICv3가 필요하지만 physical ITS controller 자체는 필요하지 않습니다.

Guest 하나에 여러 ITS controller를 만들 수 있으며 각 controller는 서로 겹치지 않는 독립 MMIO region을 사용해야 합니다.

`KVM_DEV_ARM_VGIC_GRP_ADDR`의 `KVM_VGIC_ITS_ADDR_TYPE`은 guest physical address space에서 GICv3 ITS control-register frame의 base를 정하는 read/write 64-bit attribute입니다. Address는 64KiB aligned여야 하며 region 크기는 128KiB입니다.

ITS address error
Error조건
`-E2BIG`Addressable IPA range 밖의 address
`-EINVAL`잘못된 alignment
`-EEXIST`Address가 이미 설정됨
`-EFAULT``attr->addr`가 잘못된 userspace pointer
`-ENODEV`잘못된 attribute이거나 ITS 미지원

Base-address attribute 검증 실패입니다.

.. SPDX-License-Identifier: GPL-2.0

===============================================
ARM Virtual Interrupt Translation Service (ITS)
===============================================

Device types supported:
  KVM_DEV_TYPE_ARM_VGIC_ITS    ARM Interrupt Translation Service Controller

The ITS allows MSI(-X) interrupts to be injected into guests. This extension is
optional.  Creating a virtual ITS controller also requires a host GICv3 (see
arm-vgic-v3.txt), but does not depend on having physical ITS controllers.

There can be multiple ITS controllers per guest, each of them has to have
a separate, non-overlapping MMIO region.


Groups
======

KVM_DEV_ARM_VGIC_GRP_ADDR
-------------------------

  Attributes:
    KVM_VGIC_ITS_ADDR_TYPE (rw, 64-bit)
      Base address in the guest physical address space of the GICv3 ITS
      control register frame.
      This address needs to be 64K aligned and the region covers 128K.

  Errors:

    =======  =================================================
    -E2BIG   Address outside of addressable IPA range
    -EINVAL  Incorrectly aligned address
    -EEXIST  Address already configured
    -EFAULT  Invalid user pointer for attr->addr.
    -ENODEV  Incorrect attribute or the ITS is not supported.
    =======  =================================================

ITS control과 register state

41-125
ITS control attribute
Attribute동작
`KVM_DEV_ARM_VGIC_CTRL_INIT`추가 parameter 없이 ITS 초기화
`KVM_DEV_ARM_ITS_CTRL_RESET`추가 parameter 없이 ITS를 최초 생성·초기화 상태로 reset
`KVM_DEV_ARM_ITS_SAVE_TABLES`Guest register와 table entry가 지정한 RAM 위치에 ITS table을 little-endian ABI layout으로 저장
`KVM_DEV_ARM_ITS_RESTORE_TABLES`Guest RAM의 table을 ITS internal structure로 복원

`KVM_DEV_ARM_VGIC_GRP_CTRL`이 initialization, reset과 table migration을 제어합니다.

SAVE_TABLES가 수정한 page를 찾기 위해 dirty tracking이 필요하면 vCPU dirty tracking에 다른 mechanism을 쓰더라도 bitmap을 사용해야 합니다. Guest memory의 table layout 자체가 migration ABI입니다.

RESTORE_TABLES 전에 GICv3를 먼저 복원해야 합니다. ITS에서는 `GITS_CTLR`를 제외한 register를 먼저 복원하고, read-only `GITS_IIDR`도 먼저 복원해야 합니다. IIDR Revision field가 table-layout ABI revision을 encode하기 때문입니다.

ITS control error
Error조건
`-ENXIO`Attribute 설정 전에 ITS가 올바르게 구성되지 않음
`-ENOMEM`ITS internal data allocation 실패
`-EINVAL`복원한 data가 일관되지 않음
`-EFAULT`Guest RAM access 실패
`-EBUSY`하나 이상의 vCPU가 실행 중
`-EACCES`Physical GICv4 ITS backing에서 GICv4.1 없이는 state를 얻을 수 없음

Control operation이 요구하는 configuration과 실행 상태입니다.

`KVM_DEV_ARM_VGIC_GRP_ITS_REGS`의 `attr`은 ITS control-frame base에 대한 register offset입니다. `addr`는 실제 register 폭이 32-bit든 64-bit든 `__u64`를 가리키며 64-bit register는 full-length access만 허용합니다.

Read-only register write는 보통 무시하지만 `GITS_CREADR`와 `GITS_IIDR`는 migration 복원을 위해 예외적으로 기록할 수 있습니다. `GITS_CREADR`를 복원하지 않으면 `CWRITER` 복원 뒤 command가 재실행될 수 있습니다.

`GITS_CREADR`는 ITS를 enable할 수 있는 `GITS_CTLR`보다 먼저, 그리고 write 시 CREADR를 reset하는 `GITS_CBASER`보다 뒤에 복원해야 합니다. `GITS_IIDR`는 table restore보다 먼저 복원합니다.

ITS register error
Error조건
`-ENXIO`지원 register가 아닌 offset
`-EFAULT`잘못된 `attr->addr`
`-EINVAL`Offset이 64-bit aligned가 아님
`-EBUSY`하나 이상의 vCPU가 실행 중

Register group access 제약입니다.

KVM_DEV_ARM_VGIC_GRP_CTRL
-------------------------

  Attributes:
    KVM_DEV_ARM_VGIC_CTRL_INIT
      request the initialization of the ITS, no additional parameter in
      kvm_device_attr.addr.

    KVM_DEV_ARM_ITS_CTRL_RESET
      reset the ITS, no additional parameter in kvm_device_attr.addr.
      See "ITS Reset State" section.

    KVM_DEV_ARM_ITS_SAVE_TABLES
      save the ITS table data into guest RAM, at the location provisioned
      by the guest in corresponding registers/table entries. Should userspace
      require a form of dirty tracking to identify which pages are modified
      by the saving process, it should use a bitmap even if using another
      mechanism to track the memory dirtied by the vCPUs.

      The layout of the tables in guest memory defines an ABI. The entries
      are laid out in little endian format as described in the last paragraph.

    KVM_DEV_ARM_ITS_RESTORE_TABLES
      restore the ITS tables from guest RAM to ITS internal structures.

      The GICV3 must be restored before the ITS and all ITS registers but
      the GITS_CTLR must be restored before restoring the ITS tables.

      The GITS_IIDR read-only register must also be restored before
      calling KVM_DEV_ARM_ITS_RESTORE_TABLES as the IIDR revision field
      encodes the ABI revision.

      The expected ordering when restoring the GICv3/ITS is described in section
      "ITS Restore Sequence".

  Errors:

    =======  ==========================================================
     -ENXIO  ITS not properly configured as required prior to setting
             this attribute
    -ENOMEM  Memory shortage when allocating ITS internal data
    -EINVAL  Inconsistent restored data
    -EFAULT  Invalid guest ram access
    -EBUSY   One or more VCPUS are running
    -EACCES  The virtual ITS is backed by a physical GICv4 ITS, and the
	     state is not available without GICv4.1
    =======  ==========================================================

KVM_DEV_ARM_VGIC_GRP_ITS_REGS
-----------------------------

  Attributes:
      The attr field of kvm_device_attr encodes the offset of the
      ITS register, relative to the ITS control frame base address
      (ITS_base).

      kvm_device_attr.addr points to a __u64 value whatever the width
      of the addressed register (32/64 bits). 64 bit registers can only
      be accessed with full length.

      Writes to read-only registers are ignored by the kernel except for:

      - GITS_CREADR. It must be restored otherwise commands in the queue
        will be re-executed after restoring CWRITER. GITS_CREADR must be
        restored before restoring the GITS_CTLR which is likely to enable the
        ITS. Also it must be restored after GITS_CBASER since a write to
        GITS_CBASER resets GITS_CREADR.
      - GITS_IIDR. The Revision field encodes the table layout ABI revision.
        In the future we might implement direct injection of virtual LPIs.
        This will require an upgrade of the table layout and an evolution of
        the ABI. GITS_IIDR must be restored before calling
        KVM_DEV_ARM_ITS_RESTORE_TABLES.

      For other registers, getting or setting a register has the same
      effect as reading/writing the register on real hardware.

  Errors:

    =======  ====================================================
    -ENXIO   Offset does not correspond to any supported register
    -EFAULT  Invalid user pointer for attr->addr
    -EINVAL  Offset is not 64-bit aligned
    -EBUSY   one or more VCPUS are running
    =======  ====================================================

ITS restore sequence와 REV0 table ABI

126-200
GICv3·ITS restore 순서
Guest memory 전체 복원 및 vCPU 생성모든 redistributor 복원KVM_DEV_ARM_VGIC_GRP_ADDR로 ITS base 제공GITS_CBASER 복원GITS_CTLR를 제외한 나머지 GITS_* register 복원KVM_DEV_ARM_ITS_RESTORE_TABLES로 table data loadGITS_CTLR 복원MSI용 KVM_IRQFD assignment 복원vCPU 실행

Register와 memory table의 의존 관계를 지켜야 합니다.

REV0 ABI는 virtual GICv3 기능만 지원하며 nested hypervisor의 virtual interrupt direct injection을 제공하는 virtual GICv4는 지원하지 않습니다. Device table은 DeviceID, ITT는 EventID로 index되며 collection table은 CollectionID index가 아니고 entry 순서도 정해지지 않습니다. 모든 entry는 8 byte입니다.

ITS REV0 Device Table Entry
FieldBit의미
V63Entry valid; 0이면 다른 field는 의미 없음
next62:49마지막이면 0, 아니면 다음 DTE까지 DeviceID offset; 최대 `2^14-1`
ITT_addr48:5256-byte aligned ITT address의 bit [51:8]
Size4:0지원 EventID bit 수에서 1을 뺀 값

64-bit DTE bit field입니다.

ITS REV0 Collection Table Entry
FieldBit의미
V63Entry valid
RES062:52Should-Be-Zero-or-Preserved reserved field
RDBase51:16`GICR_TYPER.Processor_Number` 의미의 PE number
ICID15:0Collection ID

64-bit CTE bit field입니다.

ITS REV0 Interrupt Translation Entry
FieldBit의미
next63:48마지막이면 0, 아니면 다음 ITE까지 EventID offset; 최대 `2^16-1`
pINTID47:16Physical LPI ID; 0이면 invalid이며 다른 field도 의미 없음
ICID15:0Collection ID

64-bit ITE bit field입니다.

ITS Restore Sequence:
---------------------

The following ordering must be followed when restoring the GIC, ITS, and
KVM_IRQFD assignments:

a) restore all guest memory and create vcpus
b) restore all redistributors
c) provide the ITS base address
   (KVM_DEV_ARM_VGIC_GRP_ADDR)
d) restore the ITS in the following order:

     1. Restore GITS_CBASER
     2. Restore all other ``GITS_`` registers, except GITS_CTLR!
     3. Load the ITS table data (KVM_DEV_ARM_ITS_RESTORE_TABLES)
     4. Restore GITS_CTLR

e) restore KVM_IRQFD assignments for MSIs

Then vcpus can be started.

ITS Table ABI REV0:
-------------------

 Revision 0 of the ABI only supports the features of a virtual GICv3, and does
 not support a virtual GICv4 with support for direct injection of virtual
 interrupts for nested hypervisors.

 The device table and ITT are indexed by the DeviceID and EventID,
 respectively. The collection table is not indexed by CollectionID, and the
 entries in the collection are listed in no particular order.
 All entries are 8 bytes.

 Device Table Entry (DTE)::

   bits:     | 63| 62 ... 49 | 48 ... 5 | 4 ... 0 |
   values:   | V |   next    | ITT_addr |  Size   |

 where:

 - V indicates whether the entry is valid. If not, other fields
   are not meaningful.
 - next: equals to 0 if this entry is the last one; otherwise it
   corresponds to the DeviceID offset to the next DTE, capped by
   2^14 -1.
 - ITT_addr matches bits [51:8] of the ITT address (256 Byte aligned).
 - Size specifies the supported number of bits for the EventID,
   minus one

 Collection Table Entry (CTE)::

   bits:     | 63| 62 ..  52  | 51 ... 16 | 15  ...   0 |
   values:   | V |    RES0    |  RDBase   |    ICID     |

 where:

 - V indicates whether the entry is valid. If not, other fields are
   not meaningful.
 - RES0: reserved field with Should-Be-Zero-or-Preserved behavior.
 - RDBase is the PE number (GICR_TYPER.Processor_Number semantic),
 - ICID is the collection ID

 Interrupt Translation Entry (ITE)::

   bits:     | 63 ... 48 | 47 ... 16 | 15 ... 0 |
   values:   |    next   |   pINTID  |  ICID    |

 where:

 - next: equals to 0 if this entry is the last one; otherwise it corresponds
   to the EventID offset to the next ITE capped by 2^16 -1.
 - pINTID is the physical LPI ID; if zero, it means the entry is not valid
   and other fields are not meaningful.
 - ICID is the collection ID

ITS reset state

201-215

RESET은 ITS를 최초 생성하고 초기화했을 때와 같은 상태로 되돌립니다. 완료 시 ITS는 disabled이면서 quiescent이고 internal cached state가 없습니다.

ITS RESET 보장
State보장값
Control`GITS_CTLR.Enabled=0`, `GITS_CTLR.Quiescent=1`
Cached state없음
Device·collection table사용하지 않음, `GITS_BASER<n>.Valid=0`
Command queue`GITS_CBASER=0`, `GITS_CREADR=0`, `GITS_CWRITER=0`
ABI revisionITS device 최초 생성 때 정한 version을 그대로 유지

Reset command 반환 시의 architectural state입니다.

ITS Reset State:
----------------

RESET returns the ITS to the same state that it was when first created and
initialized. When the RESET command returns, the following things are
guaranteed:

- The ITS is not enabled and quiescent
  GITS_CTLR.Enabled = 0 .Quiescent=1
- There is no internally cached state
- No collection or device table are used
  GITS_BASER<n>.Valid = 0
- GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0
- The ABI version is unchanged and remains the one set when the ITS
  device was first created.