Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement the final two ioctls #8

Open
wants to merge 10 commits into
base: main
Choose a base branch
from

Conversation

jakecorrenti
Copy link
Member

Implements the API for the last two TDX ioctls: INIT_MEMORY_REGION and FINALIZE_VM.

Updates the tests/launch.rs file accordingly.

Use `PhantomData` in `Cmd` to prevent undefined behavior with regards to
the address represented by `data`.

Signed-off-by: Jake Correnti <[email protected]>
Adds `align_down` which rounds a number down to multiple. Equivalent to
the `ALIGN_DOWN` macro in QEMU.

Adds `align_up` which rounds a number up to multiple. Equivalent to the
`ALIGN_UP` macro in QEMU`.

Adds `mmap_reserve` which reserves a new memory region of the requested
size to be used for mapping from the given fd (if any). This is
equivalent to `mmap_reserve` in QEMU.

Adds `mmap_activate` which activates memory in a reserved region from
the given fd (if any), to make it accessible.  This is equivalent to
`mmap_activate` in QEMU.

Signed-off-by: Jake Correnti <[email protected]>
Adds the function `ram_mmap` which is an `mmap()` abstraction to map
guest RAM, simplifying flag handling, taking care of alignment
requirements and installing guard pages.

This is equivalent to `qemu_ram_mmap` in QEMU.

Signed-off-by: Jake Correnti <[email protected]>
Re-implements the `KVM_CHECK_EXTENSION` ioctl for the launch test. We
need to check if `KVM_CAP_MEMORY_MAPPING` and `KVM_CAP_GUEST_MEMFD` are
supported on the host. These values aren't upstream in
rust-vmm/kvm-ioctls and you can't convert a `u32` into `kvm_ioctls::Cap`, so it needed to be re-written.

Signed-off-by: Jake Correnti <[email protected]>
@jakecorrenti jakecorrenti force-pushed the finish-ioctls branch 2 times, most recently from 447e580 to d0cd56f Compare December 12, 2024 17:52
src/launch/mod.rs Outdated Show resolved Hide resolved

/// Complete measurement of the initial TD contents and mark it ready to run
pub fn finalize(&self) -> Result<(), TdxError> {
let mut cmd: Cmd<u64> = Cmd::from(CmdId::FinalizeVm, &0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why &0?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's a data field in Cmd which is a pointer to whatever we pass as the second argument. The FINALIZE_VM ioctl doesn't require any data so that should be null. I can make the parameter Option<&'a T> instead if that makes more sense.

tests/launch.rs Outdated Show resolved Hide resolved
Implements the `KVM_TDX_INIT_MEM_REGION` ioctl for TDX. This will
encrypt a memory continuous region, which correstponds to the
`TDH.MEM.PAGE.ADD` SEAM call. Based on the attributes it will
also extend the measurement which corresponds to the `TDH.MR.EXTEND`
 SEAM call.

Signed-off-by: Jake Correnti <[email protected]>
Extends the `tests/launch.rs` test to include `init_mem_region`.

Based on the QEMU implementation, if the host supports the
`KVM_CAP_MEMORY_MAPPING` extension, then we should use a different set
of ioctls: `KVM_MEMORY_MAPPING` and `KVM_TDX_EXTEND_MEMORY` instead of
`KVM_TDX_INIT_MEM_REGION`. However, the current state of the CentOS SIG
build doesn't support these ioctls so I have no way to test.

Signed-off-by: Jake Correnti <[email protected]>

underscore `caps` to silence warning

Signed-off-by: Jake Correnti <[email protected]>
Implements the `KVM_TDX_FINALIZE_VM` ioctl for TDX. This completes the
measurement of the initial TD contents and marks it ready to run. This
corresponds to the `TDH.MR.FINALIZE` SEAM call.

Additionally runs the vCPU after the measurement is finalized.

Signed-off-by: Jake Correnti <[email protected]>
In the KVM selftests for TDX[0] there are only very few patches.
We should be in line with those as the bare minimum when initializing
the VM.

[0] https://lore.kernel.org/all/[email protected]/T/#m1e11e4ba2fb56d702fc5980dbd184a81845f869c

Signed-off-by: Jake Correnti <[email protected]>
Enables the KVM_CAP_X2APIC_API capability to be in line with the KVM
selftests for TDX[0].

[0] https://lore.kernel.org/all/[email protected]/T/#m1e11e4ba2fb56d702fc5980dbd184a81845f869c

Signed-off-by: Jake Correnti <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants