1<?xml version="1.0" ?>
2<!--
3     Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
4
5     SPDX-License-Identifier: BSD-2-Clause
6-->
7
8<api name="ObjectApiX86" label_prefix="x86_">
9    <struct name="seL4_VCPUContext">
10        <member name="eax"/>
11        <member name="ebx"/>
12        <member name="ecx"/>
13        <member name="edx"/>
14        <member name="esi"/>
15        <member name="edi"/>
16        <member name="ebp"/>
17    </struct>
18    <interface name="seL4_X86_PageDirectory" manual_name="Page Directory"
19        cap_description="Capability to the page directory being operated on.">
20        <method id="X86PageDirectoryMap" name="Map">
21            <brief>
22                Map a page directory.
23            </brief>
24            <description>
25                <docref>See <autoref label="ch:vspace"/></docref>
26            </description>
27            <param dir="in" name="vspace" type="seL4_CPtr"
28             description='Capability to the VSpace which will contain the mapping'/>
29            <param dir="in" name="vaddr" type="seL4_Word"
30                description='Virtual address to map the page into.'/>
31            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
32                <description>
33                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
34                </description>
35            </param>
36        </method>
37        <method id="X86PageDirectoryUnmap" name="Unmap">
38            <brief>
39                Unmap a page directory.
40            </brief>
41            <description>
42                <docref>See <autoref label="ch:vspace"/></docref>
43            </description>
44        </method>
45        <method id="X86PageDirectoryGetStatusBits" name="GetStatusBits" manual_name="Get Status Bits" condition="defined(CONFIG_ARCH_IA32)">
46            <brief>
47                Retrieve the accessed and dirty bits of a page mapped into an address space.
48            </brief>
49            <description>
50                <docref>See <autoref label="ch:vspace"/></docref>
51            </description>
52            <return>
53                A <texttt text='seL4_X86_PageDirectory_GetStatusBits_t'/> structure.
54            </return>
55            <cap_param append_description='Capability to the address space to query.'/>
56            <param dir="in" name="vaddr" type="seL4_Word" description='Virtual address of the page to query'/>
57            <param dir="out" name="accessed" type="seL4_Word"/>
58            <param dir="out" name="dirty" type="seL4_Word"/>
59        </method>
60    </interface>
61
62    <interface name="seL4_X86_PageTable" manual_name="Page Table"
63        cap_description="Capability to the page table being operated on.">
64        <method id="X86PageTableMap" name="Map" manual_label="pagetable_map">
65            <brief>
66                Map a page table into an address space.
67            </brief>
68            <description>
69                Takes a <texttt text='PageDirectory'/> capability as an argument,
70                and installs a reference to the invoked
71                <texttt text='PageTable'/> in a specified slot in the <texttt text="PageDirectory"/>.
72            </description>
73            <param dir="in" name="vspace" type="seL4_CPtr"
74             description='Capability to the VSpace which will contain the mapping'/>
75            <param dir="in" name="vaddr" type="seL4_Word"
76                description='Virtual address to map the page into.'/>
77            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
78                <description>
79                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
80                </description>
81            </param>
82        </method>
83        <method id="X86PageTableUnmap" name="Unmap" manual_label="pagetable_unmap">
84            <brief>
85                Unmap a page table from its address space and zero it out.
86            </brief>
87            <description>
88                Removes the reference to the invoked <texttt text="PageTable"/> from its containing
89                  <texttt text="PageDirectory"/>.
90                <docref>See <autoref label="ch:vspace"/></docref>
91            </description>
92        </method>
93    </interface>
94
95    <interface name="seL4_X86_IOPageTable" manual_name="I/O Page Table"
96        cap_description="Capability to the I/O page table being operated on.">
97        <method id="X86IOPageTableMap" name="Map" condition='defined(CONFIG_IOMMU)'>
98            <brief>
99                Map an IO page table into an IOSpace.
100            </brief>
101            <description>
102                <docref>See <autoref label="sec:iospace"/></docref>
103            </description>
104            <param dir="in" name="iospace" type="seL4_X86_IOSpace"
105                description='The IOSpace to map the page table into.'/>
106            <param dir="in" name="ioaddr" type="seL4_Word"
107                description='The address to map the page table at.'/>
108        </method>
109        <method id="X86IOPageTableUnmap" name="Unmap" condition='defined(CONFIG_IOMMU)'>
110            <brief>
111                Unmap an IO page table from an IOSpace.
112            </brief>
113            <description>
114                <docref>See <autoref label="sec:iospace"/></docref>
115            </description>
116            <cap_param append_description='The page table to unmap.'/>
117        </method>
118    </interface>
119
120    <interface name="seL4_X86_Page" manual_name="Page" cap_description="Capability to the page being operated on.">
121        <method id="X86PageMap" name="Map" manual_label='page_map'>
122            <brief>
123                Map a page into an address space or update the mapping attributes.
124            </brief>
125            <description>
126                Takes a VSpace capability, as an
127                argument and installs a reference
128                to the given <texttt text="Page"/> in the lowest-level unmapped paging structure
129                corresponding to the given address, or updates the mapping attributes if the page is already mapped at this address. If the required paging structures are not present
130                this operation will fail, returning a seL4_FailedLookup error.
131            </description>
132            <param dir="in" name="vspace" type="seL4_CPtr"
133                description='Capability to the VSpace which will contain the mapping'/>
134            <param dir="in" name="vaddr" type="seL4_Word"
135                description='Virtual address to map the page into.'/>
136            <param dir="in" name="rights" type="seL4_CapRights_t">
137                <description>
138                    Rights for the mapping. <docref>Possible values for this type are given in <autoref label='sec:cap_rights'/></docref>
139                </description>
140            </param>
141            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
142                <description>
143                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
144                </description>
145            </param>
146        </method>
147        <method id="X86PageUnmap" name="Unmap" manual_label='page_unmap'>
148            <brief>
149                Unmap a page.
150            </brief>
151            <description>
152                Removes an existing mapping.
153            </description>
154        </method>
155        <method id="X86PageMapIO" name="MapIO" manual_name="Map I/O" manual_label='page_map_io' condition='defined(CONFIG_IOMMU)'>
156            <brief>
157                Map a page into an IOSpace.
158            </brief>
159            <description>
160                <docref>See <autoref label="ch:vspace"/></docref>
161            </description>
162            <param dir="in" name="iospace" type="seL4_X86_IOSpace"
163                description='The IOSpace that the frame is being mapped into'/>
164            <param dir="in" name="rights" type="seL4_CapRights_t">
165                <description>
166                    Rights for the mapping. <docref>Possible values for this type are given in <autoref label='sec:cap_rights'/></docref>
167                </description>
168            </param>
169            <param dir="in" name="ioaddr" type="seL4_Word"
170                description='The address that the frame is being mapped at.'/>
171        </method>
172        <method id="X86PageGetAddress" name="GetAddress" manual_name="Get Address"
173            manual_label='page_getaddress'>
174            <brief>
175                Get the physical address of the underlying frame.
176            </brief>
177            <description>
178                <docref>See <autoref label="ch:vspace"/></docref>
179            </description>
180            <return>
181                A <texttt text='seL4_IA32_Page_GetAddress_t'/> struct that contains a
182                <texttt text='seL4_Word paddr'/>, which holds the physical address of the page,
183                and <texttt text='int error'/>. <docref>See <autoref label='sec:errors'/> for a description
184                of the message register and tag contents upon error.</docref>
185            </return>
186            <param dir="out" name="paddr" type="seL4_Word"/>
187        </method>
188        <method id="X86PageMapEPT" name="MapEPT" condition="defined(CONFIG_VTX)" manual_name="Map EPT">
189            <param dir="in" name="vspace" type="seL4_X86_EPTPML4"/>
190            <param dir="in" name="vaddr" type="seL4_Word"/>
191            <param dir="in" name="rights" type="seL4_CapRights_t"/>
192            <param dir="in" name="attr" type="seL4_X86_VMAttributes"/>
193        </method>
194    </interface>
195
196    <interface name="seL4_X86_ASIDControl" manual_name="ASID Control">
197        <method id="X86ASIDControlMakePool" name="MakePool" manual_name="Make Pool"
198            manual_label='ASID_controlmakepool'>
199            <brief>
200                Create an X86 ASID pool.
201            </brief>
202            <description>
203                Together with a capability to <texttt text="Untyped Memory"/>, which is passed as an argument,
204                create an <texttt text="ASID Pool"/>. The untyped capability must represent a
205                4K memory object. This will create an ASID pool with enough space for 1024 VSpaces.
206            </description>
207            <cap_param append_description='The master ASIDControl capability.'/>
208            <param dir="in" name="untyped" type="seL4_Untyped"
209                description='Capability to an untyped memory object that will become the pool. Must be 4K bytes.'/>
210            <param dir="in" name="root" type="seL4_CNode"
211                description='CPTR to the CNode that forms the root of the destination CSpace. Must be at a depth equivalent to the wordsize.'/>
212            <param dir="in" name="index" type="seL4_Word"
213                description='CPTR to the destination slot. Resolved from the root of the destination CSpace.'/>
214            <param dir="in" name="depth" type="seL4_Uint8"
215                description='Number of bits of index to resolve to find the destination slot.'/>
216        </method>
217    </interface>
218
219    <interface name="seL4_X86_ASIDPool" manual_name="ASID Pool">
220        <method id="X86ASIDPoolAssign" name="Assign" manual_label='asidpool_assign'>
221            <brief>
222                Assign an ASID pool.
223            </brief>
224            <description>
225                Assigns an ASID to the VSpace associated with the <texttt text="Page Directory"/> passed in as an argument.
226            </description>
227            <cap_param append_description='The ASID pool which is being assigned to. Must not be full. Each ASID pool can contain 1024 entries.'/>
228            <param dir="in" name="vspace" type="seL4_CPtr" description='The page directory that is being assigned to an ASID pool. Must not already be assigned to an ASID pool.'/>
229        </method>
230    </interface>
231
232    <interface name="seL4_X86_IOPortControl" manual_name="I/O Port Control" cap_description='Control capability for I/O ports.'>
233        <method id="X86IOPortControlIssue" name="Issue" manual_label="ioport_issue">
234            <brief>
235                Issue an IO port sub range.
236            </brief>
237            <description>
238                <docref>See <autoref label='sec:ioports'/></docref>
239                </description>
240            <param dir="in" name="first_port" type="seL4_Word" description="First port of the range of the issued capability."/>
241            <param dir="in" name="last_port" type="seL4_Word" description="Last port of the range of the issued capability."/>
242            <param dir="in" name="root" type="seL4_CNode" description="CPTR to the CNode that forms the root of the destination CSpace."/>
243            <param dir="in" name="index" type="seL4_Word" description="CPTR to the destination slot. Resolved from the root of the destination CSpace."/>
244            <param dir="in" name="depth" type="seL4_Uint8" description="Number of bits of dest_index to resolve to find the destination slot."/>
245        </method>
246    </interface>
247
248    <interface name="seL4_X86_IOPort" manual_name="I/O Port" cap_description='An I/O Port capability.'>
249        <method id="X86IOPortIn8" name="In8">
250            <brief>
251                Read 8 bits from an IO port.
252            </brief>
253            <description>
254                <docref>See <autoref label='sec:ioports'/></docref>
255            </description>
256            <return>
257                A <texttt text='seL4_X86_IOPort_In8_t'/> structure <docref>as described in <autoref label='sec:ioports'/>.</docref>
258            </return>
259            <param dir="out" name="result" type="seL4_Uint8" />
260            <param dir="in" name="port" type="seL4_Uint16" description='The port to read from.'/>
261        </method>
262        <method id="X86IOPortIn16" name="In16">
263            <brief>
264                Read 16 bits from an IO port.
265            </brief>
266            <description>
267                <docref>See <autoref label='sec:ioports'/></docref>
268            </description>
269            <return>
270                A <texttt text='seL4_X86_IOPort_In16_t'/> structure <docref>as described in <autoref label='sec:ioports'/>.</docref>
271            </return>
272            <param dir="out" name="result" type="seL4_Uint16"/>
273            <param dir="in" name="port" type="seL4_Uint16" description='The port to read from.'/>
274        </method>
275        <method id="X86IOPortIn32" name="In32">
276            <brief>
277                Read 32 bits from an IO port.
278            </brief>
279            <description>
280                <docref>See <autoref label='sec:ioports'/></docref>
281            </description>
282            <return>
283                A <texttt text='seL4_X86_IOPort_In32_t'/> structure <docref>as described in <autoref label='sec:ioports'/>.</docref>
284            </return>
285            <param dir="out" name="result" type="seL4_Uint32"/>
286            <param dir="in" name="port" type="seL4_Uint16" description='The port to read from.'/>
287        </method>
288        <method id="X86IOPortOut8" name="Out8">
289            <brief>
290                Write 8 bits to an IO port.
291            </brief>
292            <description>
293                <docref>See <autoref label='sec:ioports'/></docref>
294            </description>
295            <param dir="in" name="port" type="seL4_Word" description='The port to write to.'/>
296            <param dir="in" name="data" type="seL4_Word" description='Data to write to the IO port.'/>
297        </method>
298        <method id="X86IOPortOut16" name="Out16">
299            <brief>
300                Write 16 bits to an IO port.
301            </brief>
302            <description>
303                <docref>See <autoref label='sec:ioports'/></docref>
304            </description>
305            <param dir="in" name="port" type="seL4_Word" description='The port to write to.'/>
306            <param dir="in" name="data" type="seL4_Word" description='Data to write to the IO port.'/>
307        </method>
308        <method id="X86IOPortOut32" name="Out32">
309            <brief>
310                Write 32 bits to an IO port.
311            </brief>
312            <description>
313                <docref>See <autoref label='sec:ioports'/></docref>
314            </description>
315            <param dir="in" name="port" type="seL4_Word" description='The port to write to.'/>
316            <param dir="in" name="data" type="seL4_Word" description='Data to write to the IO port.'/>
317        </method>
318    </interface>
319
320    <interface name="seL4_IRQControl" manual_name="IRQ Control" cap_description='An IRQControl capability. This gives you the authority to make this call.'>
321        <method id="X86IRQIssueIRQHandlerIOAPIC" name="GetIOAPIC" manual_name="Get I/O APIC">
322            <brief>
323                Create an IRQ handler capability for an interrupt from an IOAPIC.
324            </brief>
325            <description>
326                <docref>See <autoref label='sec:interrupts'/> and <autoref label='sec:x86_interrupts'/>.</docref>
327            </description>
328            <param dir="in" name="root" type="seL4_CNode"
329                description='CPTR to the CNode that forms the root of the destination CSpace. Must be at a depth equivalent to the wordsize.'/>
330            <param dir="in" name="index" type="seL4_Word"
331                description='CPTR to the destination slot. Resolved from the root of the destination CSpace.'/>
332            <param dir="in" name="depth" type="seL4_Uint8"
333                description='Number of bits of index to resolve to find the destination slot.'/>
334
335            <param dir="in" name="ioapic" type="seL4_Word"
336                description='Zero based index of IOAPIC to get interrupt from,
337                             ordered the same as in ACPI tables'/>
338            <param dir="in" name="pin" type="seL4_Word" description='IOAPIC pin that generates the interrupt.'/>
339            <param dir="in" name="level" type="seL4_Word" description='Indicates whether the IOAPIC should be programmed to treat this interrupt as level triggered.'/>
340            <param dir="in" name="polarity" type="seL4_Word" description='Indicates whether the IOAPIC should be programmed to treat this interrupt as high or
341                     low triggered'/>
342            <param dir="in" name="vector" type="seL4_Word" description='CPU vector to deliver the interrupt to.'/>
343        </method>
344        <method id="X86IRQIssueIRQHandlerMSI" name="GetMSI" manual_name="Get MSI">
345            <brief>
346                Create an IRQ handler capability for an interrupt from an MSI.
347            </brief>
348            <description>
349                <docref>See <autoref label='sec:interrupts'/> and <autoref label='sec:x86_interrupts'/>.</docref>
350            </description>
351            <param dir="in" name="root" type="seL4_CNode"
352                description='CPTR to the CNode that forms the root of the destination CSpace. Must be at a depth equivalent to the wordsize.'/>
353            <param dir="in" name="index" type="seL4_Word"
354                description='CPTR to the destination slot. Resolved from the root of the destination CSpace.'/>
355            <param dir="in" name="depth" type="seL4_Uint8"
356                description='Number of bits of index to resolve to find the destination slot.'/>
357            <param dir="in" name="pci_bus" type="seL4_Word" description='PCI bus ID of the device that will generate the interrupt.'/>
358            <param dir="in" name="pci_dev" type="seL4_Word" description='PCI device ID of the device that will generate the interrupt.'/>
359            <param dir="in" name="pci_func" type="seL4_Word" description='PCI function ID of the device that will generate the interrupt.'/>
360            <param dir="in" name="handle" type="seL4_Word" description='Value of the handle programmed into the data portion of the MSI.'/>
361            <param dir="in" name="vector" type="seL4_Word" description='CPU vector to deliver the interrupt to.'/>
362        </method>
363    </interface>
364    <interface name="seL4_TCB" manual_name="TCB">
365        <method id="TCBSetEPTRoot" name="SetEPTRoot" condition="defined(CONFIG_VTX)" manual_name="Set EPT Root" manual_label="set_eptroot">
366            <brief>
367                Set the EPT root of a thread
368            </brief>
369            <description>
370                <docref>See <autoref label='sec:virt'/>.</docref>
371            </description>
372            <param dir="in" name="eptpml4" type="seL4_X86_EPTPML4"
373                description='CPTR to an EPT PML4 object to act as the guest mode vspace root'/>
374        </method>
375    </interface>
376    <interface name="seL4_X86_VCPU" manual_name="VCPU" cap_description='VCPU object to operate on'>
377        <method id="X86VCPUSetTCB" name="SetTCB" condition="defined(CONFIG_VTX)" manual_name="Set TCB">
378            <brief>
379                Bind TCB to VCPU
380            </brief>
381            <description>
382                Configures the one-to-one binding of a VCPU and TCB, overwriting any previous binding
383                in both. <docref>See <autoref label='sec:virt'/>.</docref>
384            </description>
385            <param dir="in" name="tcb" type="seL4_TCB" description='CPTR of the TCB to bind to'/>
386        </method>
387        <method id="X86VCPUReadVMCS" name="ReadVMCS" condition="defined(CONFIG_VTX)" manual_name="Read VMCS" manual_label="vcpu_readvmcs">
388            <brief>
389                Read VMCS field from the hardware
390            </brief>
391            <description>
392                Thin wrapper around the <texttt text='vmread'/> instruction that is performed on the
393                VMCS region that is part of the VCPU object. After validating that a legal
394                field is requested the value of `vmread` is returned directly in the result.
395            </description>
396            <return>
397                A <texttt text='seL4_X86_VCPU_ReadVMCS_t'/> struct that contains a
398                <texttt text='seL4_Word value'/>, which holds the return result of the <texttt text='vmread'/> instruction,
399                and <texttt text='int error'/>. <docref>See <autoref label='sec:errors'/> for a description
400                of the message register and tag contents upon error.</docref>
401            </return>
402            <param dir="in" name="field" type="seL4_Word"
403                description='Field to give to `vmread` instruction'/>
404            <param dir="out" name="value" type="seL4_Word"
405                description='Value returned by `vmread` instruction'/>
406        </method>
407        <method id="X86VCPUWriteVMCS" name="WriteVMCS" condition="defined(CONFIG_VTX)" manual_name="Write VMCS" manual_label="vcpu_writevmcs">
408            <brief>
409                Write VMCS field to the hardware
410            </brief>
411            <description>
412                Thin wrapper around the `vmwrite` instruction that is performed on the
413                VMCS region that is part of the VCPU object. As well as validating that
414                a legal field is requested, the value may be modified to ensure any
415                bits that are fixed in the hardware are correct, and that any features
416                required for kernel correctness are not disabled <docref>(see <autoref label='sec:virt'/>)</docref>.
417
418                The final value written to the hardware is returned and can be compared
419                to the input parameter to determine what bits the kernel changed.
420            </description>
421            <return>
422                A <texttt text='seL4_X86_VCPU_WriteVMCS_t'/> struct that contains a
423                <texttt text='seL4_Word writen'/>, which holds the final value written with the <texttt text='vmwrite'/> instruction,
424                and <texttt text='int error'/>. <docref>See <autoref label='sec:errors'/> for a description
425                of the message register and tag contents upon error.</docref>
426            </return>
427            <param dir="in" name="field" type="seL4_Word"
428                description='Field to give to `vmwrite` instruction'/>
429            <param dir="in" name="value" type="seL4_Word"
430                description='Value to write using `vmwrite` instruction'/>
431            <param dir="out" name="written" type="seL4_Word"
432                description='Final value written using `vmwrite` after kernel validation'/>
433        </method>
434        <method id="X86VCPUEnableIOPort" name="EnableIOPort" condition="defined(CONFIG_VTX)"
435            manual_name="Enable IO Port" manual_label="vcpu_enableioport">
436            <brief>
437                Enable I/O port range in guest execution
438            </brief>
439            <description>
440                Enables a range of I/O ports for direct access by the execution mode in
441                the <texttt text='VCPU'/>. The requested port range must be a sub range
442                of the provided I/O port capability.
443
444                This also establishes a link between the provided I/O port capability and
445                the <texttt text='VCPU'/><docref>, see <autoref label='sec:virt'/> for details.</docref>
446            </description>
447            <param dir="in" name="ioPort" type="seL4_X86_IOPort"
448                description='I/O port capability whose authority is being delegating'/>
449            <param dir="in" name="low" type="seL4_Word"
450                description='Start of the I/O port range to enable'/>
451            <param dir="in" name="high" type="seL4_Word"
452                description='Last I/O port in the range to enable'/>
453        </method>
454        <method id="X86VCPUDisableIOPort" name="DisableIOPort" condition="defined(CONFIG_VTX)"
455            manual_name="Disable IO Port">
456            <brief>
457                Disable I/O port range in privileged execution
458            </brief>
459            <description>
460                Disable a range of I/O ports for direct access by the execution mode in
461                the <texttt text='VCPU'/>.
462            </description>
463            <param dir="in" name="low" type="seL4_Word"
464                description='Start of the I/O port range to disable'/>
465            <param dir="in" name="high" type="seL4_Word"
466                description='Last I/O port in the range to disable'/>
467        </method>
468        <method id="X86VCPUWriteRegisters" name="WriteRegisters" condition="defined(CONFIG_VTX)"
469            manual_name="Write Registers">
470            <brief>
471                Set guest mode registers to the fields of a given <texttt text="seL4_VCPUContext"/>
472            </brief>
473            <description>
474                Sets the guest mode registers, which is any registers not already part of the VMCS.
475            </description>
476            <param dir="in" name="regs" type="seL4_VCPUContext"
477                description='Data structure containing the new register values.'/>
478        </method>
479    </interface>
480    <interface name="seL4_X86_EPTPDPT" manual_name="Extended Page Table Page Directory Page Table"
481        cap_description="Capability to the EPT PDPT being operated on.">
482        <method id="X86EPTPDPTMap" name="Map" condition="defined(CONFIG_VTX)">
483            <brief>
484                Map an EPT page directory page table.
485            </brief>
486            <description>
487                <docref>See <autoref label="ch:vspace"/></docref>
488            </description>
489            <param dir="in" name="eptpml4" type="seL4_X86_EPTPML4"
490                description='Capability to the EPT root which will contain the mapping'/>
491            <param dir="in" name="gpa" type="seL4_Word"
492                description='Guest physical address to map the page into.'/>
493            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
494                <description>
495                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
496                </description>
497            </param>
498        </method>
499        <method id="X86EPTPDPTUnmap" name="Unmap" condition="defined(CONFIG_VTX)">
500            <brief>
501                Unmap an EPT page directory page table.
502            </brief>
503            <description>
504                <docref>See <autoref label="ch:vspace"/></docref>
505            </description>
506        </method>
507    </interface>
508    <interface name="seL4_X86_EPTPD" manual_name="Extended Page Table Page Directory"
509        cap_description="Capability to the EPT PD being operated on.">
510        <method id="X86EPTPDMap" name="Map" condition="defined(CONFIG_VTX)">
511            <brief>
512                Map an EPT page directory.
513            </brief>
514            <description>
515                <docref>See <autoref label="ch:vspace"/></docref>
516            </description>
517            <param dir="in" name="eptpml4" type="seL4_X86_EPTPML4"
518                description='Capability to the EPT root which will contain the mapping'/>
519            <param dir="in" name="gpa" type="seL4_Word"
520                description='Guest physical address to map the page into.'/>
521            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
522                <description>
523                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
524                </description>
525            </param>
526        </method>
527        <method id="X86EPTPDUnmap" name="Unmap" condition="defined(CONFIG_VTX)">
528            <brief>
529                Unmap an EPT page directory.
530            </brief>
531            <description>
532                <docref>See <autoref label="ch:vspace"/></docref>
533            </description>
534        </method>
535    </interface>
536    <interface name="seL4_X86_EPTPT" manual_name="Extended Page Table Page Table"
537            cap_description="Capability to the EPT PT being operated on.">
538        <method id="X86EPTPTMap" name="Map" condition="defined(CONFIG_VTX)">
539            <brief>
540                Map an EPT page table.
541            </brief>
542            <description>
543                <docref>See <autoref label="ch:vspace"/></docref>
544            </description>
545            <param dir="in" name="eptpml4" type="seL4_X86_EPTPML4"
546                description='Capability to the EPT root which will contain the mapping'/>
547            <param dir="in" name="gpa" type="seL4_Word"
548                description='Guest physical address to map the page into.'/>
549            <param dir="in" name="attr" type="seL4_X86_VMAttributes">
550                <description>
551                    VM attributes for the mapping. <docref>Possible values for this type are given in <autoref label='ch:vspace'/></docref>
552                </description>
553            </param>
554        </method>
555        <method id="X86EPTPTUnmap" name="Unmap" condition="defined(CONFIG_VTX)">
556            <brief>
557                Unmap an EPT page table.
558            </brief>
559            <description>
560                <docref>See <autoref label="ch:vspace"/></docref>
561            </description>
562        </method>
563    </interface>
564</api>
565