@@ -38,6 +38,7 @@
#include "hw/block/flash.h"
#include "sysemu/kvm.h"
#include "sysemu/sev.h"
+#include "sysemu/tdx.h"
#define FLASH_SECTOR_SIZE 4096
@@ -328,6 +329,11 @@ void pc_system_firmware_init(PCMachineState *pcms,
int i;
BlockBackend *pflash_blk[ARRAY_SIZE(pcms->flash)];
+ if (!tdx_system_firmware_init(pcms, rom_memory)) {
+ pc_system_flash_cleanup_unused(pcms);
+ return;
+ }
+
if (!pcmc->pci_enabled) {
x86_bios_rom_init(MACHINE(pcms), "bios.bin", rom_memory, true);
return;
@@ -3,8 +3,10 @@
#ifndef CONFIG_USER_ONLY
#include "sysemu/kvm.h"
+#include "hw/i386/pc.h"
bool kvm_has_tdx(KVMState *s);
+int tdx_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory);
#endif
void tdx_pre_create_vcpu(CPUState *cpu);
@@ -7,6 +7,11 @@ bool kvm_has_tdx(KVMState *s)
{
return false;
}
+
+int tdx_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory)
+{
+ return -ENOSYS;
+}
#endif
void tdx_pre_create_vcpu(CPUState *cpu)
@@ -109,6 +109,31 @@ int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
return 0;
}
+int tdx_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory)
+{
+ MachineState *ms = MACHINE(pcms);
+ TdxGuest *tdx = (TdxGuest *)object_dynamic_cast(OBJECT(ms->cgs),
+ TYPE_TDX_GUEST);
+ int i;
+
+ if (!tdx) {
+ return -ENOSYS;
+ }
+
+ /*
+ * Sanitiy check for tdx:
+ * TDX uses generic loader to load bios instead of pflash.
+ */
+ for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
+ if (drive_get(IF_PFLASH, 0, i)) {
+ error_report("pflash not supported by VM type, "
+ "use -device loader,file=<path>");
+ exit(1);
+ }
+ }
+ return 0;
+}
+
void tdx_get_supported_cpuid(KVMState *s, uint32_t function,
uint32_t index, int reg, uint32_t *ret)
{