1use bitfield_struct::bitfield;
7use zerocopy::FromBytes;
8use zerocopy::Immutable;
9use zerocopy::IntoBytes;
10use zerocopy::KnownLayout;
11
12pub const SEV_INTR_TYPE_EXT: u32 = 0;
14pub const SEV_INTR_TYPE_NMI: u32 = 2;
15pub const SEV_INTR_TYPE_EXCEPT: u32 = 3;
16pub const SEV_INTR_TYPE_SW: u32 = 4;
17
18pub const REG_TWEAK_BITMAP_OFFSET: usize = 0x100;
20pub const REG_TWEAK_BITMAP_SIZE: usize = 0x40;
21
22pub const SNP_GUEST_REQ_MSG_VERSION: u32 = 1;
25
26#[bitfield(u64)]
27#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
28pub struct SevEventInjectInfo {
29    pub vector: u8,
30    #[bits(3)]
31    pub interruption_type: u32,
32    pub deliver_error_code: bool,
33    #[bits(19)]
34    _rsvd1: u64,
35    pub valid: bool,
36    pub error_code: u32,
37}
38
39#[repr(u8)]
40#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
41pub enum Vmpl {
42    Vmpl0 = 0,
43    Vmpl1 = 1,
44    Vmpl2 = 2,
45    Vmpl3 = 3,
46}
47
48impl From<Vmpl> for u8 {
49    fn from(value: Vmpl) -> Self {
50        value as _
51    }
52}
53
54#[repr(C)]
56#[derive(Debug, Clone, Copy, IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
57pub struct SevSelector {
58    pub selector: u16,
59    pub attrib: u16,
60    pub limit: u32,
61    pub base: u64,
62}
63
64impl SevSelector {
65    pub fn as_u128(&self) -> u128 {
66        ((self.base as u128) << 64)
67            | ((self.limit as u128) << 32)
68            | ((self.attrib as u128) << 16)
69            | self.selector as u128
70    }
71}
72
73impl From<u128> for SevSelector {
74    fn from(val: u128) -> Self {
75        SevSelector {
76            selector: val as u16,
77            attrib: (val >> 16) as u16,
78            limit: (val >> 32) as u32,
79            base: (val >> 64) as u64,
80        }
81    }
82}
83
84#[repr(C)]
86#[derive(Debug, Clone, Copy, IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
87pub struct SevXmmRegister {
88    low: u64,
89    high: u64,
90}
91
92impl SevXmmRegister {
93    pub fn as_u128(&self) -> u128 {
94        ((self.high as u128) << 64) | self.low as u128
95    }
96}
97
98impl From<u128> for SevXmmRegister {
99    fn from(val: u128) -> Self {
100        SevXmmRegister {
101            low: val as u64,
102            high: (val >> 64) as u64,
103        }
104    }
105}
106
107#[bitfield(u64)]
108#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
109pub struct SevFeatures {
110    pub snp: bool,
111    pub vtom: bool,
112    pub reflect_vc: bool,
113    pub restrict_injection: bool,
114    pub alternate_injection: bool,
115    pub debug_swap: bool,
116    pub prevent_host_ibs: bool,
117    pub snp_btb_isolation: bool,
118    pub vmpl_isss: bool,
119    pub secure_tsc: bool,
120    pub vmgexit_param: bool,
121    pub pmc_virt: bool,
122    pub ibs_virt: bool,
123    rsvd: bool,
124    pub vmsa_reg_prot: bool,
125    pub smt_prot: bool,
126    pub secure_avic: bool,
127    #[bits(4)]
128    _reserved: u64,
129    pub ibpb_on_entry: bool,
130    #[bits(42)]
131    _unused: u64,
132}
133
134#[bitfield(u64)]
135#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
136pub struct SevVirtualInterruptControl {
137    pub tpr: u8,
138    pub irq: bool,
139    pub gif: bool,
140    pub intr_shadow: bool,
141    #[bits(5)]
142    _rsvd1: u64,
143    #[bits(4)]
144    pub priority: u64,
145    pub ignore_tpr: bool,
146    #[bits(11)]
147    _rsvd2: u64,
148    pub vector: u8,
149    #[bits(23)]
150    _rsvd3: u64,
151    pub guest_busy: bool,
152}
153
154#[bitfield(u64)]
155#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
156pub struct SevRmpAdjust {
157    pub target_vmpl: u8,
158    pub enable_read: bool,
159    pub enable_write: bool,
160    pub enable_user_execute: bool,
161    pub enable_kernel_execute: bool,
162    #[bits(4)]
163    _rsvd1: u64,
164    pub vmsa: bool,
165    #[bits(47)]
166    _rsvd2: u64,
167}
168
169#[bitfield(u32)]
170#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
171pub struct SevIoAccessInfo {
172    pub read_access: bool,
173    #[bits(1)]
174    reserved1: u32,
175    pub string_access: bool,
176    pub rep_access: bool,
177    pub access_size8: bool,
178    pub access_size16: bool,
179    pub access_size32: bool,
180    pub address_size8: bool,
181    pub address_size16: bool,
182    pub address_size32: bool,
183    #[bits(3)]
184    pub effective_segment: u32,
185    #[bits(3)]
186    rsvd2: u32,
187    pub port: u16,
188}
189
190#[bitfield(u64)]
191#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
192pub struct SevNpfInfo {
193    pub present: bool,
194    pub is_write: bool,
195    pub user: bool,
196    pub reserved_bit_set: bool,
197    pub fetch: bool,
198    #[bits(1)]
199    rsvd5: u64,
200    pub shadow_stack: bool,
201    #[bits(24)]
202    rsvd7_31: u64,
203    pub rmp_failure: bool,
204    pub caused_by_gpa_access: bool,
205    pub caused_by_page_table_access: bool,
206    pub encrypted_access: bool,
207    pub rmp_size_mismatch: bool,
208    pub vmpl_violation: bool,
209    pub npt_supervisor_shadow_stack: bool,
210    #[bits(26)]
211    rsvd38_63: u64,
212}
213
214#[repr(C)]
216#[derive(Debug, Clone, IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
217pub struct SevVmsa {
218    pub es: SevSelector,
220    pub cs: SevSelector,
221    pub ss: SevSelector,
222    pub ds: SevSelector,
223    pub fs: SevSelector,
224    pub gs: SevSelector,
225
226    pub gdtr: SevSelector,
228    pub ldtr: SevSelector,
229    pub idtr: SevSelector,
230    pub tr: SevSelector,
231
232    pub pl0_ssp: u64,
234    pub pl1_ssp: u64,
235    pub pl2_ssp: u64,
236    pub pl3_ssp: u64,
237    pub u_cet: u64,
238
239    pub vmsa_reserved1: [u8; 2],
241
242    pub vmpl: u8,
244
245    pub cpl: u8,
247
248    pub vmsa_reserved2: u32,
250
251    pub efer: u64,
253
254    pub vmsa_reserved3: [u32; 26],
256
257    pub xss: u64,
259
260    pub cr4: u64,
262    pub cr3: u64,
263    pub cr0: u64,
264
265    pub dr7: u64,
267    pub dr6: u64,
268
269    pub rflags: u64,
271
272    pub rip: u64,
274
275    pub dr0: u64,
277    pub dr1: u64,
278    pub dr2: u64,
279    pub dr3: u64,
280
281    pub dr0_addr_mask: u64,
283    pub dr1_addr_mask: u64,
284    pub dr2_addr_mask: u64,
285    pub dr3_addr_mask: u64,
286
287    pub vmsa_reserved4: [u64; 3],
289
290    pub rsp: u64,
292
293    pub s_cet: u64,
295    pub ssp: u64,
296    pub interrupt_ssp_table_addr: u64,
297
298    pub rax: u64,
300
301    pub star: u64,
303    pub lstar: u64,
304    pub cstar: u64,
305    pub sfmask: u64,
306
307    pub kernel_gs_base: u64,
309
310    pub sysenter_cs: u64,
312    pub sysenter_esp: u64,
313    pub sysenter_eip: u64,
314
315    pub cr2: u64,
317
318    pub vmsa_reserved5: [u64; 4],
320
321    pub pat: u64,
323
324    pub dbgctl: u64,
326    pub last_branch_from_ip: u64,
327    pub last_branch_to_ip: u64,
328    pub last_excp_from_ip: u64,
329    pub last_excp_to_ip: u64,
330
331    pub vmsa_reserved6: [u64; 9],
333
334    pub spec_ctrl: u64,
336
337    pub pkru: u32,
339
340    pub tsc_aux: u32,
342
343    pub vmsa_reserved7: [u32; 4],
345
346    pub register_protection_nonce: u64,
347
348    pub rcx: u64,
350    pub rdx: u64,
351    pub rbx: u64,
352    pub vmsa_reserved8: u64, pub rbp: u64,
354    pub rsi: u64,
355    pub rdi: u64,
356    pub r8: u64,
357    pub r9: u64,
358    pub r10: u64,
359    pub r11: u64,
360    pub r12: u64,
361    pub r13: u64,
362    pub r14: u64,
363    pub r15: u64,
364
365    pub vmsa_reserved9: [u64; 2],
367
368    pub exit_info1: u64,
370    pub exit_info2: u64,
371    pub exit_int_info: u64,
372
373    pub next_rip: u64,
375
376    pub sev_features: SevFeatures,
378
379    pub v_intr_cntrl: SevVirtualInterruptControl,
381
382    pub guest_error_code: u64,
384
385    pub virtual_tom: u64,
387
388    pub tlb_id: u64,
391    pub pcpu_id: u64,
392
393    pub event_inject: SevEventInjectInfo,
395
396    pub xcr0: u64,
398
399    pub xsave_valid_bitmap: [u8; 16],
401
402    pub x87dp: u64,
404    pub mxcsr: u32,
405    pub x87_ftw: u16,
406    pub x87_fsw: u16,
407    pub x87_fcw: u16,
408    pub x87_op: u16,
409    pub x87_ds: u16,
410    pub x87_cs: u16,
411    pub x87_rip: u64,
412
413    pub x87_registers: [u64; 10],
416
417    pub xmm_registers: [SevXmmRegister; 16],
419
420    pub ymm_registers: [SevXmmRegister; 16],
422}
423
424open_enum::open_enum! {
426    pub enum GhcbInfo: u64 {
427        NORMAL = 0x000,
428        SEV_INFO_RESPONSE = 0x001,
429        SEV_INFO_REQUEST = 0x002,
430        AP_JUMP_TABLE = 0x003,
431        CPUID_REQUEST = 0x004,
432        CPUID_RESPONSE = 0x005,
433        PREFERRED_REQUEST = 0x010,
434        PREFERRED_RESPONSE = 0x011,
435        REGISTER_REQUEST = 0x012,
436        REGISTER_RESPONSE = 0x013,
437        PAGE_STATE_CHANGE = 0x014,
438        PAGE_STATE_UPDATED = 0x015,
439        HYP_FEATURE_REQUEST = 0x080,
440        HYP_FEATURE_RESPONSE = 0x081,
441        SPECIAL_HYPERCALL = 0xF00,
442        SPECIAL_FAST_CALL = 0xF01,
443        HYPERCALL_OUTPUT = 0xF02,
444        SPECIAL_DBGPRINT = 0xF03,
445        SHUTDOWN_REQUEST = 0x100,
446    }
447}
448
449pub const GHCB_DATA_PAGE_STATE_PRIVATE: u64 = 0x001;
450pub const GHCB_DATA_PAGE_STATE_SHARED: u64 = 0x002;
451pub const GHCB_DATA_PAGE_STATE_PSMASH: u64 = 0x003;
452pub const GHCB_DATA_PAGE_STATE_UNSMASH: u64 = 0x004;
453pub const GHCB_DATA_PAGE_STATE_MASK: u64 = 0x00F;
454pub const GHCB_DATA_PAGE_STATE_LARGE_PAGE: u64 = 0x010;
455
456open_enum::open_enum! {
457    pub enum GhcbUsage: u32 {
458        BASE = 0,
459        HYPERCALL = 1,
460        VTL_RETURN = 2,
461    }
462}
463
464#[repr(C)]
467#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
468pub struct GhcbHypercallParameters {
469    pub output_gpa: u64,
470    pub input_control: u64,
471}
472
473pub const GHCB_PAGE_HYPERCALL_PARAMETERS_OFFSET: usize = 4072;
474pub const GHCB_PAGE_HYPERCALL_OUTPUT_OFFSET: usize = 4080;
475
476open_enum::open_enum! {
478    pub enum SevExitCode: u64 {
479        CR0_READ = 0x0,
480        CR1_READ = 0x1,
481        CR2_READ = 0x2,
482        CR3_READ = 0x3,
483        CR4_READ = 0x4,
484        CR5_READ = 0x5,
485        CR6_READ = 0x6,
486        CR7_READ = 0x7,
487        CR8_READ = 0x8,
488        CR9_READ = 0x9,
489        CR10_READ = 0xa,
490        CR11_READ = 0xb,
491        CR12_READ = 0xc,
492        CR13_READ = 0xd,
493        CR14_READ = 0xe,
494        CR15_READ = 0xf,
495        CR0_WRITE = 0x10,
496        CR1_WRITE = 0x11,
497        CR2_WRITE = 0x12,
498        CR3_WRITE = 0x13,
499        CR4_WRITE = 0x14,
500        CR5_WRITE = 0x15,
501        CR6_WRITE = 0x16,
502        CR7_WRITE = 0x17,
503        CR8_WRITE = 0x18,
504        CR9_WRITE = 0x19,
505        CR10_WRITE = 0x1a,
506        CR11_WRITE = 0x1b,
507        CR12_WRITE = 0x1c,
508        CR13_WRITE = 0x1d,
509        CR14_WRITE = 0x1e,
510        CR15_WRITE = 0x1f,
511        DR0_READ = 0x20,
512        DR1_READ = 0x21,
513        DR2_READ = 0x22,
514        DR3_READ = 0x23,
515        DR4_READ = 0x24,
516        DR5_READ = 0x25,
517        DR6_READ = 0x26,
518        DR7_READ = 0x27,
519        DR8_READ = 0x28,
520        DR9_READ = 0x29,
521        DR10_READ = 0x2a,
522        DR11_READ = 0x2b,
523        DR12_READ = 0x2c,
524        DR13_READ = 0x2d,
525        DR14_READ = 0x2e,
526        DR15_READ = 0x2f,
527        DR0_WRITE = 0x30,
528        DR1_WRITE = 0x31,
529        DR2_WRITE = 0x32,
530        DR3_WRITE = 0x33,
531        DR4_WRITE = 0x34,
532        DR5_WRITE = 0x35,
533        DR6_WRITE = 0x36,
534        DR7_WRITE = 0x37,
535        DR8_WRITE = 0x38,
536        DR9_WRITE = 0x39,
537        DR10_WRITE = 0x3a,
538        DR11_WRITE = 0x3b,
539        DR12_WRITE = 0x3c,
540        DR13_WRITE = 0x3d,
541        DR14_WRITE = 0x3e,
542        DR15_WRITE = 0x3f,
543        EXCP0 = 0x40,
544        EXCP_DB = 0x41,
545        EXCP2 = 0x42,
546        EXCP3 = 0x43,
547        EXCP4 = 0x44,
548        EXCP5 = 0x45,
549        EXCP6 = 0x46,
550        EXCP7 = 0x47,
551        EXCP8 = 0x48,
552        EXCP9 = 0x49,
553        EXCP10 = 0x4a,
554        EXCP11 = 0x4b,
555        EXCP12 = 0x4c,
556        EXCP13 = 0x4d,
557        EXCP14 = 0x4e,
558        EXCP15 = 0x4f,
559        EXCP16 = 0x50,
560        EXCP17 = 0x51,
561        EXCP18 = 0x52,
562        EXCP19 = 0x53,
563        EXCP20 = 0x54,
564        EXCP21 = 0x55,
565        EXCP22 = 0x56,
566        EXCP23 = 0x57,
567        EXCP24 = 0x58,
568        EXCP25 = 0x59,
569        EXCP26 = 0x5a,
570        EXCP27 = 0x5b,
571        EXCP28 = 0x5c,
572        EXCP29 = 0x5d,
573        EXCP30 = 0x5e,
574        EXCP31 = 0x5f,
575        INTR = 0x60,
576        NMI = 0x61,
577        SMI = 0x62,
578        INIT = 0x63,
579        VINTR = 0x64,
580        CR0_SEL_WRITE = 0x65,
581        IDTR_READ = 0x66,
582        GDTR_READ = 0x67,
583        LDTR_READ = 0x68,
584        TR_READ = 0x69,
585        IDTR_WRITE = 0x6a,
586        GDTR_WRITE = 0x6b,
587        LDTR_WRITE = 0x6c,
588        TR_WRITE = 0x6d,
589        RDTSC = 0x6e,
590        RDPMC = 0x6f,
591        PUSHF = 0x70,
592        POPF = 0x71,
593        CPUID = 0x72,
594        RSM = 0x73,
595        IRET = 0x74,
596        SWINT = 0x75,
597        INVD = 0x76,
598        PAUSE = 0x77,
599        HLT = 0x78,
600        INVLPG = 0x79,
601        INVLPGA = 0x7a,
602        IOIO = 0x7b,
603        MSR = 0x7c,
604        TASK_SWITCH = 0x7d,
605        FERR_FREEZE = 0x7e,
606        SHUTDOWN = 0x7f,
607        VMRUN = 0x80,
608        VMMCALL = 0x81,
609        VMLOAD = 0x82,
610        VMSAVE = 0x83,
611        STGI = 0x84,
612        CLGI = 0x85,
613        SKINIT = 0x86,
614        RDTSCP = 0x87,
615        ICEBP = 0x88,
616        WBINVD = 0x89,
617        MONITOR = 0x8a,
618        MWAIT = 0x8b,
619        MWAIT_CONDITIONAL = 0x8c,
620        XSETBV = 0x8d,
621        RDPRU = 0x8e,
622        EFER_WRITE_TRAP = 0x8f,
623        CR0_WRITE_TRAP = 0x90,
624        CR1_WRITE_TRAP = 0x91,
625        CR2_WRITE_TRAP = 0x92,
626        CR3_WRITE_TRAP = 0x93,
627        CR4_WRITE_TRAP = 0x94,
628        CR5_WRITE_TRAP = 0x95,
629        CR6_WRITE_TRAP = 0x96,
630        CR7_WRITE_TRAP = 0x97,
631        CR8_WRITE_TRAP = 0x98,
632        CR9_WRITE_TRAP = 0x99,
633        CR10_WRITE_TRAP = 0x9a,
634        CR11_WRITE_TRAP = 0x9b,
635        CR12_WRITE_TRAP = 0x9c,
636        CR13_WRITE_TRAP = 0x9d,
637        CR14_WRITE_TRAP = 0x9e,
638        CR15_WRITE_TRAP = 0x9f,
639        INVLPGB = 0xa0,
640        ILLEGAL_INVLPGB = 0xa1,
641        INVPCID = 0xa2,
642        BUSLOCK = 0xa5,
643        IDLE_HLT = 0xa6,
644        NPF = 0x400,
645        AVIC_INCOMPLETE_IPI = 0x401,
646        AVIC_NOACCEL = 0x402,
647        VMGEXIT = 0x403,
648        PAGE_NOT_VALIDATED = 0x404,
649
650        SNP_GUEST_REQUEST = 0x80000011,
652        SNP_EXTENDED_GUEST_REQUEST = 0x80000012,
653        HV_DOORBELL_PAGE = 0x80000014,
654
655        INVALID_VMCB = 0xffff_ffff_ffff_ffff,
657        VMSA_BUSY = 0xffff_ffff_ffff_fffe,
658        IDLE_REQUIRED = 0xffff_ffff_ffff_fffd,
659        INVALID_PMC = 0xffff_ffff_ffff_fffc,
660    }
661}
662
663#[bitfield(u64)]
664#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
665pub struct GhcbMsr {
666    #[bits(12)]
667    pub info: u64,
668    #[bits(40)]
669    pub pfn: u64,
670    #[bits(12)]
671    pub extra_data: u64,
672}
673
674#[repr(C)]
676#[derive(Debug, IntoBytes, Immutable, KnownLayout, FromBytes, Clone, Copy)]
677pub struct HvPspCpuidLeaf {
678    pub eax_in: u32,
679    pub ecx_in: u32,
680    pub xfem_in: u64,
681    pub xss_in: u64,
682    pub eax_out: u32,
683    pub ebx_out: u32,
684    pub ecx_out: u32,
685    pub edx_out: u32,
686    pub reserved_z: u64,
687}
688
689pub const HV_PSP_CPUID_LEAF_COUNT_MAX: usize = 64;
690
691#[repr(C)]
692#[derive(Debug, IntoBytes, Immutable, KnownLayout, FromBytes, Clone, Copy)]
693pub struct HvPspCpuidPage {
694    pub count: u32,
695    pub reserved_z1: u32,
696    pub reserved_z2: u64,
697    pub cpuid_leaf_info: [HvPspCpuidLeaf; HV_PSP_CPUID_LEAF_COUNT_MAX],
698    pub reserved_z3: [u64; 126],
699}
700
701#[repr(C)]
705#[derive(Debug, Clone, Copy, IntoBytes, Immutable, KnownLayout, FromBytes)]
706pub struct SnpPageInfo {
707    pub digest_current: [u8; 48],
709    pub contents: [u8; 48],
711    pub length: u16,
713    pub page_type: SnpPageType,
715    pub imi_page_bit: u8,
717    pub lower_vmpl_permissions: u32,
719    pub gpa: u64,
722}
723
724open_enum::open_enum! {
725    #[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
727    pub enum SnpPageType: u8 {
728        RESERVED = 0x0,
730        NORMAL = 0x1,
732        VMSA = 0x2,
734        ZERO = 0x3,
736        UNMEASURED = 0x4,
738        SECRETS = 0x5,
740        CPUID = 0x6,
742    }
743}
744
745#[repr(C)]
749#[derive(Debug, Clone, Copy, IntoBytes, Immutable, KnownLayout, FromBytes)]
750pub struct SnpPspIdBlock {
751    pub ld: [u8; 48],
753    pub family_id: [u8; 16],
755    pub image_id: [u8; 16],
757    pub version: u32,
759    pub guest_svn: u32,
761    pub policy: u64,
763}
764
765#[bitfield(u64)]
766#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
767pub struct SevStatusMsr {
768    pub sev_enabled: bool,
769    pub es_enabled: bool,
770    pub snp_enabled: bool,
771    pub vtom: bool,
772    pub reflect_vc: bool,
773    pub restrict_injection: bool,
774    pub alternate_injection: bool,
775    pub debug_swap: bool,
776    pub prevent_host_ibs: bool,
777    pub snp_btb_isolation: bool,
778    pub _rsvd1: bool,
779    pub secure_tsc: bool,
780    pub _rsvd2: bool,
781    pub _rsvd3: bool,
782    pub _rsvd4: bool,
783    pub _rsvd5: bool,
784    pub vmsa_reg_prot: bool,
785    #[bits(6)]
786    _reserved: u64,
787    pub ibpb_on_entry: bool,
788    #[bits(40)]
789    _unused: u64,
790}
791
792#[bitfield(u64)]
793#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
794pub struct SevInvlpgbRax {
795    pub va_valid: bool,
796    pub pcid_valid: bool,
797    pub asid_valid: bool,
798    pub global: bool,
799    pub final_only: bool,
800    pub nested: bool,
801    #[bits(6)]
802    reserved: u64,
803    #[bits(52)]
804    pub virtual_page_number: u64,
805}
806
807#[bitfield(u32)]
808#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
809pub struct SevInvlpgbEdx {
810    #[bits(16)]
811    pub asid: u64,
812    #[bits(12)]
813    pub pcid: u64,
814    #[bits(4)]
815    reserved: u32,
816}
817
818#[bitfield(u32)]
819#[derive(IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
820pub struct SevInvlpgbEcx {
821    #[bits(16)]
822    pub additional_count: u64,
823    #[bits(15)]
824    reserved: u64,
825    pub large_page: bool,
826}
827
828#[bitfield(u64)]
829pub struct MovCrxDrxInfo {
830    #[bits(4)]
831    pub gpr_number: u64,
832    #[bits(59)]
833    pub reserved: u64,
834    pub mov_crx: bool,
835}
836
837#[repr(C)]
840#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
841pub struct SnpReportReq {
842    pub user_data: [u8; 64],
844    pub vmpl: u32,
847    pub rsvd: [u8; 28],
850}
851
852pub const SNP_REPORT_RESP_DATA_SIZE: usize =
853    size_of::<u32>() + size_of::<u32>() + 24 + size_of::<SnpReport>();
854
855#[repr(C)]
858#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
859pub struct SnpReportResp {
860    pub status: u32,
865    pub report_size: u32,
867    pub _reserved0: [u8; 24],
869    pub report: SnpReport,
871}
872
873pub const SNP_REPORT_SIZE: usize = 0x4a0;
875
876pub const SNP_REPORT_DATA_SIZE: usize = 64;
878
879#[repr(C)]
882#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
883pub struct SnpReport {
884    pub version: u32,
887    pub guest_svn: u32,
889    pub policy: u64,
891    pub family: u128,
893    pub image_id: u128,
895    pub vmpl: u32,
898    pub signature_algo: u32,
901    pub current_tcb: u64,
903    pub platform_info: u64,
905    pub flags: u32,
907    pub _reserved0: u32,
909    pub report_data: [u8; SNP_REPORT_DATA_SIZE],
911    pub measurement: [u8; 48],
914    pub host_data: [u8; 32],
917    pub id_key_digest: [u8; 48],
921    pub author_key_digest: [u8; 48],
925    pub report_id: [u8; 32],
927    pub report_id_ma: [u8; 32],
930    pub reported_tcb: u64,
933    pub _reserved1: [u8; 24],
935    pub chip_id: [u8; 64],
939    pub committed_tcb: u64,
941    pub current_build: u8,
943    pub current_minor: u8,
945    pub current_major: u8,
947    pub _reserved2: u8,
949    pub committed_build: u8,
951    pub committed_minor: u8,
953    pub committed_major: u8,
955    pub _reserved3: u8,
957    pub launch_tcb: u64,
960    pub _reserved4: [u8; 168],
962    pub signature: [u8; 512],
964}
965
966static_assertions::const_assert_eq!(SNP_REPORT_SIZE, size_of::<SnpReport>());
967
968#[repr(C)]
971#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
972pub struct SnpDerivedKeyReq {
973    pub root_key_select: u32,
978    pub rsvd: u32,
980    pub guest_field_select: u64,
983    pub vmpl: u32,
986    pub guest_svn: u32,
989    pub tcb_version: u64,
992}
993
994#[bitfield(u64)]
997pub struct GuestFieldSelect {
998    pub guest_policy: bool,
1000    pub image_id: bool,
1002    pub family_id: bool,
1004    pub measurement: bool,
1006    pub guest_svn: bool,
1008    pub tcb_version: bool,
1010    #[bits(58)]
1012    pub _reserved: u64,
1013}
1014
1015pub const SNP_DERIVED_KEY_SIZE: usize = 32;
1017
1018#[repr(C)]
1021#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
1022pub struct SnpDerivedKeyResp {
1023    pub status: u32,
1028    pub _reserved: [u8; 28],
1030    pub derived_key: [u8; SNP_DERIVED_KEY_SIZE],
1032}
1033
1034static_assertions::const_assert_eq!(
1035    64,
1037    size_of::<SnpDerivedKeyResp>()
1038);