Skip to content

Commit adfa49a

Browse files
authored
virt_mshv_vtl, snp: Add more automatic exits to boot the debug build (#1324)
On the hardware I have that debug assert fires for the automatic exit that's not in the match statement. Update the match list to be able to boot the debug build on the newer hardware. While at it, convert the exit codes to hex like in the AMD PPR, add additional codes for easier debugging, and panic on the negative exit codes that are not covered by the match statement.
1 parent 6eb4734 commit adfa49a

File tree

2 files changed

+193
-156
lines changed
  • openhcl/virt_mshv_vtl/src/processor/snp
  • vm/x86/x86defs/src

2 files changed

+193
-156
lines changed

openhcl/virt_mshv_vtl/src/processor/snp/mod.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ struct ExitStats {
113113
npf_no_intercept: Counter,
114114
npf_spurious: Counter,
115115
rdpmc: Counter,
116-
unexpected: Counter,
117116
vmgexit: Counter,
118117
vmmcall: Counter,
119118
xsetbv: Counter,
@@ -1471,7 +1470,12 @@ impl UhProcessor<'_, SnpBacked> {
14711470
&mut self.backing.exit_stats[entered_from_vtl].vmgexit
14721471
}
14731472

1474-
SevExitCode::NMI | SevExitCode::PAUSE | SevExitCode::SMI | SevExitCode::VMGEXIT => {
1473+
SevExitCode::NMI
1474+
| SevExitCode::PAUSE
1475+
| SevExitCode::SMI
1476+
| SevExitCode::VMGEXIT
1477+
| SevExitCode::BUSLOCK
1478+
| SevExitCode::IDLE_HLT => {
14751479
// Ignore intercept processing if the guest exited due to an automatic exit.
14761480
&mut self.backing.exit_stats[entered_from_vtl].automatic_exit
14771481
}
@@ -1533,12 +1537,17 @@ impl UhProcessor<'_, SnpBacked> {
15331537
}
15341538

15351539
_ => {
1536-
debug_assert!(
1537-
false,
1538-
"Received unexpected exit code {}",
1539-
vmsa.guest_error_code()
1540+
// Don't print too much of the register state, might have guest secrets
1541+
// parts thereof.
1542+
tracing::error!(
1543+
"SEV exit code {sev_error_code:x?}, rip {:x?}, next rip {:x?}, sev features {:x?}, v_intr_control {:x?}, event inject {:x?}",
1544+
vmsa.rip(),
1545+
vmsa.next_rip(),
1546+
vmsa.sev_features(),
1547+
vmsa.v_intr_cntrl(),
1548+
vmsa.event_inject(),
15401549
);
1541-
&mut self.backing.exit_stats[entered_from_vtl].unexpected
1550+
panic!("Received unexpected SEV exit code {sev_error_code:x?}");
15421551
}
15431552
};
15441553
stat.increment();

vm/x86/x86defs/src/snp.rs

Lines changed: 177 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -469,159 +469,187 @@ pub const GHCB_PAGE_HYPERCALL_OUTPUT_OFFSET: usize = 4080;
469469
// Exit Codes.
470470
open_enum::open_enum! {
471471
pub enum SevExitCode: u64 {
472-
CR0_READ = 0,
473-
CR1_READ = 1,
474-
CR2_READ = 2,
475-
CR3_READ = 3,
476-
CR4_READ = 4,
477-
CR5_READ = 5,
478-
CR6_READ = 6,
479-
CR7_READ = 7,
480-
CR8_READ = 8,
481-
CR9_READ = 9,
482-
CR10_READ = 10,
483-
CR11_READ = 11,
484-
CR12_READ = 12,
485-
CR13_READ = 13,
486-
CR14_READ = 14,
487-
CR15_READ = 15,
488-
CR0_WRITE = 16,
489-
CR1_WRITE = 17,
490-
CR2_WRITE = 18,
491-
CR3_WRITE = 19,
492-
CR4_WRITE = 20,
493-
CR5_WRITE = 21,
494-
CR6_WRITE = 22,
495-
CR7_WRITE = 23,
496-
CR8_WRITE = 24,
497-
CR9_WRITE = 25,
498-
CR10_WRITE = 26,
499-
CR11_WRITE = 27,
500-
CR12_WRITE = 28,
501-
CR13_WRITE = 29,
502-
CR14_WRITE = 30,
503-
CR15_WRITE = 31,
504-
DR0_READ = 32,
505-
DR1_READ = 33,
506-
DR2_READ = 34,
507-
DR3_READ = 35,
508-
DR4_READ = 36,
509-
DR5_READ = 37,
510-
DR6_READ = 38,
511-
DR7_READ = 39,
512-
DR8_READ = 40,
513-
DR9_READ = 41,
514-
DR10_READ = 42,
515-
DR11_READ = 43,
516-
DR12_READ = 44,
517-
DR13_READ = 45,
518-
DR14_READ = 46,
519-
DR15_READ = 47,
520-
DR0_WRITE = 48,
521-
DR1_WRITE = 49,
522-
DR2_WRITE = 50,
523-
DR3_WRITE = 51,
524-
DR4_WRITE = 52,
525-
DR5_WRITE = 53,
526-
DR6_WRITE = 54,
527-
DR7_WRITE = 55,
528-
DR8_WRITE = 56,
529-
DR9_WRITE = 57,
530-
DR10_WRITE = 58,
531-
DR11_WRITE = 59,
532-
DR12_WRITE = 60,
533-
DR13_WRITE = 61,
534-
DR14_WRITE = 62,
535-
DR15_WRITE = 63,
536-
EXCP0 = 64,
537-
EXCP_DB = 65,
538-
EXCP2 = 66,
539-
EXCP3 = 67,
540-
EXCP4 = 68,
541-
EXCP5 = 69,
542-
EXCP6 = 70,
543-
EXCP7 = 71,
544-
EXCP8 = 72,
545-
EXCP9 = 73,
546-
EXCP10 = 74,
547-
EXCP11 = 75,
548-
EXCP12 = 76,
549-
EXCP13 = 77,
550-
EXCP14 = 78,
551-
EXCP15 = 79,
552-
EXCP16 = 80,
553-
EXCP17 = 81,
554-
EXCP18 = 82,
555-
EXCP19 = 83,
556-
EXCP20 = 84,
557-
EXCP21 = 85,
558-
EXCP22 = 86,
559-
EXCP23 = 87,
560-
EXCP24 = 88,
561-
EXCP25 = 89,
562-
EXCP26 = 90,
563-
EXCP27 = 91,
564-
EXCP28 = 92,
565-
EXCP29 = 93,
566-
EXCP30 = 94,
567-
EXCP31 = 95,
568-
INTR = 96,
569-
NMI = 97,
570-
SMI = 98,
571-
INIT = 99,
572-
VINTR = 100,
573-
CR0_SEL_WRITE = 101,
574-
IDTR_READ = 102,
575-
GDTR_READ = 103,
576-
LDTR_READ = 104,
577-
TR_READ = 105,
578-
IDTR_WRITE = 106,
579-
GDTR_WRITE = 107,
580-
LDTR_WRITE = 108,
581-
TR_WRITE = 109,
582-
RDTSC = 110,
583-
RDPMC = 111,
584-
PUSHF = 112,
585-
POPF = 113,
586-
CPUID = 114,
587-
RSM = 115,
588-
IRET = 116,
589-
SWINT = 117,
590-
INVD = 118,
591-
PAUSE = 119,
592-
HLT = 120,
593-
INVLPG = 121,
594-
INVLPGA = 122,
595-
IOIO = 123,
596-
MSR = 124,
597-
TASK_SWITCH = 125,
598-
FERR_FREEZE = 126,
599-
SHUTDOWN = 127,
600-
VMRUN = 128,
601-
VMMCALL = 129,
602-
VMLOAD = 130,
603-
VMSAVE = 131,
604-
STGI = 132,
605-
CLGI = 133,
606-
SKINIT = 134,
607-
RDTSCP = 135,
608-
ICEBP = 136,
609-
WBINVD = 137,
610-
MONITOR = 138,
611-
MWAIT = 139,
612-
MWAIT_CONDITIONAL = 140,
613-
XSETBV = 141,
614-
INVLPGB = 160,
615-
ILLEGAL_INVLPGB = 161,
616-
NPF = 1024,
617-
AVIC_INCOMPLETE_IPI = 1025,
618-
AVIC_NOACCEL = 1026,
619-
VMGEXIT = 1027,
620-
PAGE_NOT_VALIDATED = 1028,
472+
CR0_READ = 0x0,
473+
CR1_READ = 0x1,
474+
CR2_READ = 0x2,
475+
CR3_READ = 0x3,
476+
CR4_READ = 0x4,
477+
CR5_READ = 0x5,
478+
CR6_READ = 0x6,
479+
CR7_READ = 0x7,
480+
CR8_READ = 0x8,
481+
CR9_READ = 0x9,
482+
CR10_READ = 0xa,
483+
CR11_READ = 0xb,
484+
CR12_READ = 0xc,
485+
CR13_READ = 0xd,
486+
CR14_READ = 0xe,
487+
CR15_READ = 0xf,
488+
CR0_WRITE = 0x10,
489+
CR1_WRITE = 0x11,
490+
CR2_WRITE = 0x12,
491+
CR3_WRITE = 0x13,
492+
CR4_WRITE = 0x14,
493+
CR5_WRITE = 0x15,
494+
CR6_WRITE = 0x16,
495+
CR7_WRITE = 0x17,
496+
CR8_WRITE = 0x18,
497+
CR9_WRITE = 0x19,
498+
CR10_WRITE = 0x1a,
499+
CR11_WRITE = 0x1b,
500+
CR12_WRITE = 0x1c,
501+
CR13_WRITE = 0x1d,
502+
CR14_WRITE = 0x1e,
503+
CR15_WRITE = 0x1f,
504+
DR0_READ = 0x20,
505+
DR1_READ = 0x21,
506+
DR2_READ = 0x22,
507+
DR3_READ = 0x23,
508+
DR4_READ = 0x24,
509+
DR5_READ = 0x25,
510+
DR6_READ = 0x26,
511+
DR7_READ = 0x27,
512+
DR8_READ = 0x28,
513+
DR9_READ = 0x29,
514+
DR10_READ = 0x2a,
515+
DR11_READ = 0x2b,
516+
DR12_READ = 0x2c,
517+
DR13_READ = 0x2d,
518+
DR14_READ = 0x2e,
519+
DR15_READ = 0x2f,
520+
DR0_WRITE = 0x30,
521+
DR1_WRITE = 0x31,
522+
DR2_WRITE = 0x32,
523+
DR3_WRITE = 0x33,
524+
DR4_WRITE = 0x34,
525+
DR5_WRITE = 0x35,
526+
DR6_WRITE = 0x36,
527+
DR7_WRITE = 0x37,
528+
DR8_WRITE = 0x38,
529+
DR9_WRITE = 0x39,
530+
DR10_WRITE = 0x3a,
531+
DR11_WRITE = 0x3b,
532+
DR12_WRITE = 0x3c,
533+
DR13_WRITE = 0x3d,
534+
DR14_WRITE = 0x3e,
535+
DR15_WRITE = 0x3f,
536+
EXCP0 = 0x40,
537+
EXCP_DB = 0x41,
538+
EXCP2 = 0x42,
539+
EXCP3 = 0x43,
540+
EXCP4 = 0x44,
541+
EXCP5 = 0x45,
542+
EXCP6 = 0x46,
543+
EXCP7 = 0x47,
544+
EXCP8 = 0x48,
545+
EXCP9 = 0x49,
546+
EXCP10 = 0x4a,
547+
EXCP11 = 0x4b,
548+
EXCP12 = 0x4c,
549+
EXCP13 = 0x4d,
550+
EXCP14 = 0x4e,
551+
EXCP15 = 0x4f,
552+
EXCP16 = 0x50,
553+
EXCP17 = 0x51,
554+
EXCP18 = 0x52,
555+
EXCP19 = 0x53,
556+
EXCP20 = 0x54,
557+
EXCP21 = 0x55,
558+
EXCP22 = 0x56,
559+
EXCP23 = 0x57,
560+
EXCP24 = 0x58,
561+
EXCP25 = 0x59,
562+
EXCP26 = 0x5a,
563+
EXCP27 = 0x5b,
564+
EXCP28 = 0x5c,
565+
EXCP29 = 0x5d,
566+
EXCP30 = 0x5e,
567+
EXCP31 = 0x5f,
568+
INTR = 0x60,
569+
NMI = 0x61,
570+
SMI = 0x62,
571+
INIT = 0x63,
572+
VINTR = 0x64,
573+
CR0_SEL_WRITE = 0x65,
574+
IDTR_READ = 0x66,
575+
GDTR_READ = 0x67,
576+
LDTR_READ = 0x68,
577+
TR_READ = 0x69,
578+
IDTR_WRITE = 0x6a,
579+
GDTR_WRITE = 0x6b,
580+
LDTR_WRITE = 0x6c,
581+
TR_WRITE = 0x6d,
582+
RDTSC = 0x6e,
583+
RDPMC = 0x6f,
584+
PUSHF = 0x70,
585+
POPF = 0x71,
586+
CPUID = 0x72,
587+
RSM = 0x73,
588+
IRET = 0x74,
589+
SWINT = 0x75,
590+
INVD = 0x76,
591+
PAUSE = 0x77,
592+
HLT = 0x78,
593+
INVLPG = 0x79,
594+
INVLPGA = 0x7a,
595+
IOIO = 0x7b,
596+
MSR = 0x7c,
597+
TASK_SWITCH = 0x7d,
598+
FERR_FREEZE = 0x7e,
599+
SHUTDOWN = 0x7f,
600+
VMRUN = 0x80,
601+
VMMCALL = 0x81,
602+
VMLOAD = 0x82,
603+
VMSAVE = 0x83,
604+
STGI = 0x84,
605+
CLGI = 0x85,
606+
SKINIT = 0x86,
607+
RDTSCP = 0x87,
608+
ICEBP = 0x88,
609+
WBINVD = 0x89,
610+
MONITOR = 0x8a,
611+
MWAIT = 0x8b,
612+
MWAIT_CONDITIONAL = 0x8c,
613+
XSETBV = 0x8d,
614+
RDPRU = 0x8e,
615+
EFER_WRITE_TRAP = 0x8f,
616+
CR0_WRITE_TRAP = 0x90,
617+
CR1_WRITE_TRAP = 0x91,
618+
CR2_WRITE_TRAP = 0x92,
619+
CR3_WRITE_TRAP = 0x93,
620+
CR4_WRITE_TRAP = 0x94,
621+
CR5_WRITE_TRAP = 0x95,
622+
CR6_WRITE_TRAP = 0x96,
623+
CR7_WRITE_TRAP = 0x97,
624+
CR8_WRITE_TRAP = 0x98,
625+
CR9_WRITE_TRAP = 0x99,
626+
CR10_WRITE_TRAP = 0x9a,
627+
CR11_WRITE_TRAP = 0x9b,
628+
CR12_WRITE_TRAP = 0x9c,
629+
CR13_WRITE_TRAP = 0x9d,
630+
CR14_WRITE_TRAP = 0x9e,
631+
CR15_WRITE_TRAP = 0x9f,
632+
INVLPGB = 0xa0,
633+
ILLEGAL_INVLPGB = 0xa1,
634+
INVPCID = 0xa2,
635+
BUSLOCK = 0xa5,
636+
IDLE_HLT = 0xa6,
637+
NPF = 0x400,
638+
AVIC_INCOMPLETE_IPI = 0x401,
639+
AVIC_NOACCEL = 0x402,
640+
VMGEXIT = 0x403,
641+
PAGE_NOT_VALIDATED = 0x404,
642+
643+
// SEV-ES software-defined exit codes
621644
SNP_GUEST_REQUEST = 0x80000011,
622645
SNP_EXTENDED_GUEST_REQUEST = 0x80000012,
623646
HV_DOORBELL_PAGE = 0x80000014,
647+
648+
// SEV-SNP hardware error codes
624649
INVALID_VMCB = 0xffff_ffff_ffff_ffff,
650+
VMSA_BUSY = 0xffff_ffff_ffff_fffe,
651+
IDLE_REQUIRED = 0xffff_ffff_ffff_fffd,
652+
INVALID_PMC = 0xffff_ffff_ffff_fffc,
625653
}
626654
}
627655

0 commit comments

Comments
 (0)