tools/testing/selftests/kvm/include/x86/sev.h

Source file repositories/reference/linux-study-clean/tools/testing/selftests/kvm/include/x86/sev.h

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/kvm/include/x86/sev.h
Extension
.h
Size
4462 bytes
Lines
172
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#ifndef SELFTEST_KVM_SEV_H
#define SELFTEST_KVM_SEV_H

#include <stdint.h>
#include <stdbool.h>

#include "linux/psp-sev.h"

#include "kvm_util.h"
#include "svm_util.h"
#include "processor.h"

enum sev_guest_state {
	SEV_GUEST_STATE_UNINITIALIZED = 0,
	SEV_GUEST_STATE_LAUNCH_UPDATE,
	SEV_GUEST_STATE_LAUNCH_SECRET,
	SEV_GUEST_STATE_RUNNING,
};

#define SEV_POLICY_NO_DBG	(1UL << 0)
#define SEV_POLICY_ES		(1UL << 2)

#define SNP_POLICY_SMT		(1ULL << 16)
#define SNP_POLICY_RSVD_MBO	(1ULL << 17)
#define SNP_POLICY_DBG		(1ULL << 19)

#define GHCB_MSR_TERM_REQ	0x100

static inline bool is_sev_snp_vm(struct kvm_vm *vm)
{
	return vm->type == KVM_X86_SNP_VM;
}

static inline bool is_sev_es_vm(struct kvm_vm *vm)
{
	return is_sev_snp_vm(vm) || vm->type == KVM_X86_SEV_ES_VM;
}

static inline bool is_sev_vm(struct kvm_vm *vm)
{
	return is_sev_es_vm(vm) || vm->type == KVM_X86_SEV_VM;
}

void sev_vm_launch(struct kvm_vm *vm, u32 policy);
void sev_vm_launch_measure(struct kvm_vm *vm, u8 *measurement);
void sev_vm_launch_finish(struct kvm_vm *vm);
void snp_vm_launch_start(struct kvm_vm *vm, u64 policy);
void snp_vm_launch_update(struct kvm_vm *vm);
void snp_vm_launch_finish(struct kvm_vm *vm);

struct kvm_vm *vm_sev_create_with_one_vcpu(u32 type, void *guest_code,
					   struct kvm_vcpu **cpu);
void vm_sev_launch(struct kvm_vm *vm, u64 policy, u8 *measurement);

kvm_static_assert(SEV_RET_SUCCESS == 0);

/*
 * A SEV-SNP VM requires the policy reserved bit to always be set.
 * The SMT policy bit is also required to be set based on SMT being
 * available and active on the system.
 */
static inline u64 snp_default_policy(void)
{
	return SNP_POLICY_RSVD_MBO | (is_smt_on() ? SNP_POLICY_SMT : 0);
}

/*
 * The KVM_MEMORY_ENCRYPT_OP uAPI is utter garbage and takes an "unsigned long"
 * instead of a proper struct.  The size of the parameter is embedded in the
 * ioctl number, i.e. is ABI and thus immutable.  Hack around the mess by
 * creating an overlay to pass in an "unsigned long" without a cast (casting
 * will make the compiler unhappy due to dereferencing an aliased pointer).
 */
#define __vm_sev_ioctl(vm, cmd, arg)					\
({									\
	int r;								\
									\
	union {								\
		struct kvm_sev_cmd c;					\
		unsigned long raw;					\
	} sev_cmd = { .c = {						\
		.id = (cmd),						\
		.data = (u64)(arg),				\
		.sev_fd = (vm)->arch.sev_fd,				\
	} };								\
									\
	r = __vm_ioctl(vm, KVM_MEMORY_ENCRYPT_OP, &sev_cmd.raw);	\
	r ?: sev_cmd.c.error;						\
})

Annotation

Implementation Notes