1a9b4942fSBrijesh Singh /* 2a9b4942fSBrijesh Singh * QEMU Secure Encrypted Virutualization (SEV) support 3a9b4942fSBrijesh Singh * 4a9b4942fSBrijesh Singh * Copyright: Advanced Micro Devices, 2016-2018 5a9b4942fSBrijesh Singh * 6a9b4942fSBrijesh Singh * Authors: 7a9b4942fSBrijesh Singh * Brijesh Singh <brijesh.singh@amd.com> 8a9b4942fSBrijesh Singh * 9a9b4942fSBrijesh Singh * This work is licensed under the terms of the GNU GPL, version 2 or later. 10a9b4942fSBrijesh Singh * See the COPYING file in the top-level directory. 11a9b4942fSBrijesh Singh * 12a9b4942fSBrijesh Singh */ 13a9b4942fSBrijesh Singh 1452581c71SMarkus Armbruster #ifndef I386_SEV_H 1552581c71SMarkus Armbruster #define I386_SEV_H 16a9b4942fSBrijesh Singh 1702eacf31SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY 1802eacf31SPhilippe Mathieu-Daudé #include CONFIG_DEVICES /* CONFIG_SEV */ 1902eacf31SPhilippe Mathieu-Daudé #endif 2002eacf31SPhilippe Mathieu-Daudé 21deae846fSPhilippe Mathieu-Daudé #include "exec/confidential-guest-support.h" 22a9b4942fSBrijesh Singh 2316dcf200SMichael Roth #define TYPE_SEV_COMMON "sev-common" 2416dcf200SMichael Roth #define TYPE_SEV_GUEST "sev-guest" 257b34df44SBrijesh Singh #define TYPE_SEV_SNP_GUEST "sev-snp-guest" 2616dcf200SMichael Roth 27a9b4942fSBrijesh Singh #define SEV_POLICY_NODBG 0x1 28a9b4942fSBrijesh Singh #define SEV_POLICY_NOKS 0x2 29a9b4942fSBrijesh Singh #define SEV_POLICY_ES 0x4 30a9b4942fSBrijesh Singh #define SEV_POLICY_NOSEND 0x8 31a9b4942fSBrijesh Singh #define SEV_POLICY_DOMAIN 0x10 32a9b4942fSBrijesh Singh #define SEV_POLICY_SEV 0x20 33a9b4942fSBrijesh Singh 3459d3740cSMichael Roth #define SEV_SNP_POLICY_SMT 0x10000 3559d3740cSMichael Roth #define SEV_SNP_POLICY_DBG 0x80000 3659d3740cSMichael Roth 37cff03145SDov Murik typedef struct SevKernelLoaderContext { 38cff03145SDov Murik char *setup_data; 39cff03145SDov Murik size_t setup_size; 40cff03145SDov Murik char *kernel_data; 41cff03145SDov Murik size_t kernel_size; 42cff03145SDov Murik char *initrd_data; 43cff03145SDov Murik size_t initrd_size; 44cff03145SDov Murik char *cmdline_data; 45cff03145SDov Murik size_t cmdline_size; 46cff03145SDov Murik } SevKernelLoaderContext; 47cff03145SDov Murik 4802eacf31SPhilippe Mathieu-Daudé #ifdef CONFIG_SEV 49deae846fSPhilippe Mathieu-Daudé bool sev_enabled(void); 5002eacf31SPhilippe Mathieu-Daudé bool sev_es_enabled(void); 5199190f80SMichael Roth bool sev_snp_enabled(void); 5202eacf31SPhilippe Mathieu-Daudé #else 5302eacf31SPhilippe Mathieu-Daudé #define sev_enabled() 0 5402eacf31SPhilippe Mathieu-Daudé #define sev_es_enabled() 0 5599190f80SMichael Roth #define sev_snp_enabled() 0 5602eacf31SPhilippe Mathieu-Daudé #endif 5702eacf31SPhilippe Mathieu-Daudé 58f703f1efSPhilippe Mathieu-Daudé uint32_t sev_get_cbit_position(void); 59f703f1efSPhilippe Mathieu-Daudé uint32_t sev_get_reduced_phys_bits(void); 60f703f1efSPhilippe Mathieu-Daudé bool sev_add_kernel_loader_hashes(SevKernelLoaderContext *ctx, Error **errp); 61d8575c6cSBrijesh Singh 62*77d1abd9SBrijesh Singh int sev_encrypt_flash(hwaddr gpa, uint8_t *ptr, uint64_t len, Error **errp); 63deae846fSPhilippe Mathieu-Daudé int sev_inject_launch_secret(const char *hdr, const char *secret, 64deae846fSPhilippe Mathieu-Daudé uint64_t gpa, Error **errp); 65deae846fSPhilippe Mathieu-Daudé 66deae846fSPhilippe Mathieu-Daudé int sev_es_save_reset_vector(void *flash_ptr, uint64_t flash_size); 67deae846fSPhilippe Mathieu-Daudé void sev_es_set_reset_vector(CPUState *cpu); 68deae846fSPhilippe Mathieu-Daudé 69f3c30c57SBrijesh Singh void pc_system_parse_sev_metadata(uint8_t *flash_ptr, size_t flash_size); 70f3c30c57SBrijesh Singh 71a9b4942fSBrijesh Singh #endif 72