target/i386: sev: Embed SEVState in SevGuestState
Currently SevGuestState contains only configuration information. For runtime state another non-QOM struct SEVState is allocated separately. Simplify things by instead embedding the SEVState structure in SevGuestState. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200604064219.436242-5-david@gibson.dropbear.id.au> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d2d8a1984d
commit
75a877e3b1
@ -35,30 +35,7 @@
|
|||||||
|
|
||||||
typedef struct SevGuestState SevGuestState;
|
typedef struct SevGuestState SevGuestState;
|
||||||
|
|
||||||
/**
|
|
||||||
* SevGuestState:
|
|
||||||
*
|
|
||||||
* The SevGuestState object is used for creating and managing a SEV
|
|
||||||
* guest.
|
|
||||||
*
|
|
||||||
* # $QEMU \
|
|
||||||
* -object sev-guest,id=sev0 \
|
|
||||||
* -machine ...,memory-encryption=sev0
|
|
||||||
*/
|
|
||||||
struct SevGuestState {
|
|
||||||
Object parent_obj;
|
|
||||||
|
|
||||||
char *sev_device;
|
|
||||||
uint32_t policy;
|
|
||||||
uint32_t handle;
|
|
||||||
char *dh_cert_file;
|
|
||||||
char *session_file;
|
|
||||||
uint32_t cbitpos;
|
|
||||||
uint32_t reduced_phys_bits;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SEVState {
|
struct SEVState {
|
||||||
SevGuestState *sev_info;
|
|
||||||
uint8_t api_major;
|
uint8_t api_major;
|
||||||
uint8_t api_minor;
|
uint8_t api_minor;
|
||||||
uint8_t build_id;
|
uint8_t build_id;
|
||||||
@ -74,6 +51,32 @@ struct SEVState {
|
|||||||
|
|
||||||
typedef struct SEVState SEVState;
|
typedef struct SEVState SEVState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SevGuestState:
|
||||||
|
*
|
||||||
|
* The SevGuestState object is used for creating and managing a SEV
|
||||||
|
* guest.
|
||||||
|
*
|
||||||
|
* # $QEMU \
|
||||||
|
* -object sev-guest,id=sev0 \
|
||||||
|
* -machine ...,memory-encryption=sev0
|
||||||
|
*/
|
||||||
|
struct SevGuestState {
|
||||||
|
Object parent_obj;
|
||||||
|
|
||||||
|
/* configuration parameters */
|
||||||
|
char *sev_device;
|
||||||
|
uint32_t policy;
|
||||||
|
uint32_t handle;
|
||||||
|
char *dh_cert_file;
|
||||||
|
char *session_file;
|
||||||
|
uint32_t cbitpos;
|
||||||
|
uint32_t reduced_phys_bits;
|
||||||
|
|
||||||
|
/* runtime state */
|
||||||
|
SEVState state;
|
||||||
|
};
|
||||||
|
|
||||||
#define DEFAULT_GUEST_POLICY 0x1 /* disable debug */
|
#define DEFAULT_GUEST_POLICY 0x1 /* disable debug */
|
||||||
#define DEFAULT_SEV_DEVICE "/dev/sev"
|
#define DEFAULT_SEV_DEVICE "/dev/sev"
|
||||||
|
|
||||||
@ -506,12 +509,12 @@ sev_read_file_base64(const char *filename, guchar **data, gsize *len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sev_launch_start(SEVState *s)
|
sev_launch_start(SevGuestState *sev)
|
||||||
{
|
{
|
||||||
|
SEVState *s = &sev->state;
|
||||||
gsize sz;
|
gsize sz;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
int fw_error, rc;
|
int fw_error, rc;
|
||||||
SevGuestState *sev = s->sev_info;
|
|
||||||
struct kvm_sev_launch_start *start;
|
struct kvm_sev_launch_start *start;
|
||||||
guchar *session = NULL, *dh_cert = NULL;
|
guchar *session = NULL, *dh_cert = NULL;
|
||||||
|
|
||||||
@ -686,6 +689,7 @@ sev_vm_state_change(void *opaque, int running, RunState state)
|
|||||||
void *
|
void *
|
||||||
sev_guest_init(const char *id)
|
sev_guest_init(const char *id)
|
||||||
{
|
{
|
||||||
|
SevGuestState *sev;
|
||||||
SEVState *s;
|
SEVState *s;
|
||||||
char *devname;
|
char *devname;
|
||||||
int ret, fw_error;
|
int ret, fw_error;
|
||||||
@ -693,27 +697,27 @@ sev_guest_init(const char *id)
|
|||||||
uint32_t host_cbitpos;
|
uint32_t host_cbitpos;
|
||||||
struct sev_user_data_status status = {};
|
struct sev_user_data_status status = {};
|
||||||
|
|
||||||
sev_state = s = g_new0(SEVState, 1);
|
sev = lookup_sev_guest_info(id);
|
||||||
s->sev_info = lookup_sev_guest_info(id);
|
if (!sev) {
|
||||||
if (!s->sev_info) {
|
|
||||||
error_report("%s: '%s' is not a valid '%s' object",
|
error_report("%s: '%s' is not a valid '%s' object",
|
||||||
__func__, id, TYPE_SEV_GUEST);
|
__func__, id, TYPE_SEV_GUEST);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sev_state = s = &sev->state;
|
||||||
s->state = SEV_STATE_UNINIT;
|
s->state = SEV_STATE_UNINIT;
|
||||||
|
|
||||||
host_cpuid(0x8000001F, 0, NULL, &ebx, NULL, NULL);
|
host_cpuid(0x8000001F, 0, NULL, &ebx, NULL, NULL);
|
||||||
host_cbitpos = ebx & 0x3f;
|
host_cbitpos = ebx & 0x3f;
|
||||||
|
|
||||||
s->cbitpos = object_property_get_int(OBJECT(s->sev_info), "cbitpos", NULL);
|
s->cbitpos = object_property_get_int(OBJECT(sev), "cbitpos", NULL);
|
||||||
if (host_cbitpos != s->cbitpos) {
|
if (host_cbitpos != s->cbitpos) {
|
||||||
error_report("%s: cbitpos check failed, host '%d' requested '%d'",
|
error_report("%s: cbitpos check failed, host '%d' requested '%d'",
|
||||||
__func__, host_cbitpos, s->cbitpos);
|
__func__, host_cbitpos, s->cbitpos);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->reduced_phys_bits = object_property_get_int(OBJECT(s->sev_info),
|
s->reduced_phys_bits = object_property_get_int(OBJECT(sev),
|
||||||
"reduced-phys-bits", NULL);
|
"reduced-phys-bits", NULL);
|
||||||
if (s->reduced_phys_bits < 1) {
|
if (s->reduced_phys_bits < 1) {
|
||||||
error_report("%s: reduced_phys_bits check failed, it should be >=1,"
|
error_report("%s: reduced_phys_bits check failed, it should be >=1,"
|
||||||
@ -723,7 +727,7 @@ sev_guest_init(const char *id)
|
|||||||
|
|
||||||
s->me_mask = ~(1UL << s->cbitpos);
|
s->me_mask = ~(1UL << s->cbitpos);
|
||||||
|
|
||||||
devname = object_property_get_str(OBJECT(s->sev_info), "sev-device", NULL);
|
devname = object_property_get_str(OBJECT(sev), "sev-device", NULL);
|
||||||
s->sev_fd = open(devname, O_RDWR);
|
s->sev_fd = open(devname, O_RDWR);
|
||||||
if (s->sev_fd < 0) {
|
if (s->sev_fd < 0) {
|
||||||
error_report("%s: Failed to open %s '%s'", __func__,
|
error_report("%s: Failed to open %s '%s'", __func__,
|
||||||
@ -754,7 +758,7 @@ sev_guest_init(const char *id)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sev_launch_start(s);
|
ret = sev_launch_start(sev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("%s: failed to create encryption context", __func__);
|
error_report("%s: failed to create encryption context", __func__);
|
||||||
goto err;
|
goto err;
|
||||||
|
Loading…
Reference in New Issue
Block a user