@@ -121,10 +121,11 @@ const (
121121 extendedFamilyShift = 20
122122 extendedModelShift = 16
123123 familyShift = 8
124- sevExtendedFamily = 0xA
125- sevFamily = 0xF
126- milanExtendedModel = 0
127- genoaExtendedModel = 1
124+ modelShift = 4
125+ // Combined extended values
126+ zen3zen4Family = 0x19
127+ milanModel = 0
128+ genoaModel = 1 << 4
128129
129130 // ReportVersion2 is set by the SNP API specification
130131 // https://web.archive.org/web/20231222054111if_/http://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56860.pdf
@@ -487,9 +488,7 @@ func ReportToProto(data []uint8) (*pb.Report, error) {
487488 mbzLo := 0x188
488489 if r .Version == ReportVersion3 {
489490 mbzLo = 0x18B
490- r .CpuidFamId = []byte {data [0x188 ]}
491- r .CpuidModId = []byte {data [0x189 ]}
492- r .CpuidStep = []byte {data [0x18A ]}
491+ r .Cpuid1EaxFms = FmsToCpuid1Eax (data [0x188 ], data [0x189 ], data [0x18A ])
493492 }
494493
495494 if err := mbz (data , mbzLo , 0x1A0 ); err != nil {
@@ -635,9 +634,10 @@ func ReportToAbiBytes(r *pb.Report) ([]byte, error) {
635634
636635 // Add CPUID information if this is a version 3 report.
637636 if r .Version == ReportVersion3 {
638- data [0x188 ] = r .CpuidFamId [0 ]
639- data [0x189 ] = r .CpuidModId [0 ]
640- data [0x18A ] = r .CpuidStep [0 ]
637+ family , model , stepping := FmsFromCpuid1Eax (r .Cpuid1EaxFms )
638+ data [0x188 ] = family
639+ data [0x189 ] = model
640+ data [0x18A ] = stepping
641641 }
642642
643643 copy (data [0x1A0 :0x1E0 ], r .ChipId [:])
@@ -903,27 +903,57 @@ func (c *CertTable) Proto() *pb.CertificateChain {
903903// See assembly implementations in cpuid_*.s
904904var cpuid func (op uint32 ) (eax , ebx , ecx , edx uint32 )
905905
906- // SevProductFromCpuid1Eax returns the SevProduct that is represented by cpuid(1).eax.
907- func SevProductFromCpuid1Eax (eax uint32 ) * pb.SevProduct {
906+ // FmsToCpuid1Eax returns the masked CPUID_1_EAX value that represents the given
907+ // family, model, stepping (FMS) values.
908+ func FmsToCpuid1Eax (family , model , stepping byte ) uint32 {
909+ var extendedFamily byte
910+
911+ familyID := family
912+ if family >= 0xf {
913+ extendedFamily = family - 0xf
914+ familyID = 0xf
915+ }
916+ extendedModel := model >> 4
917+ modelID := model & 0xf
918+ return (uint32 (extendedFamily ) << extendedFamilyShift ) |
919+ (uint32 (extendedModel ) << extendedModelShift ) |
920+ (uint32 (familyID ) << familyShift ) |
921+ (uint32 (modelID ) << modelShift ) |
922+ (uint32 (stepping & 0xf ))
923+ }
924+
925+ // FmsFromCpuid1Eax returns the family, model, stepping (FMS) values extracted from a
926+ // CPUID_1_EAX value.
927+ func FmsFromCpuid1Eax (eax uint32 ) (byte , byte , byte ) {
908928 // 31:28 reserved
909929 // 27:20 Extended Family ID
910- extendedFamily := ( eax >> extendedFamilyShift ) & 0xff
930+ extendedFamily := byte (( eax >> extendedFamilyShift ) & 0xff )
911931 // 19:16 Extended Model ID
912- extendedModel := ( eax >> extendedModelShift ) & 0xf
932+ extendedModel := byte (( eax >> extendedModelShift ) & 0xf )
913933 // 15:14 reserved
914934 // 11:8 Family ID
915- family := (eax >> familyShift ) & 0xf
935+ familyID := byte ((eax >> familyShift ) & 0xf )
936+ // 7:4 Model
937+ modelID := byte ((eax >> modelShift ) & 0xf )
916938 // 3:0 Stepping
917- stepping := eax & 0xf
939+ family := extendedFamily + familyID
940+ model := (extendedModel << 4 ) | modelID
941+ stepping := byte (eax & 0xf )
942+ return family , model , stepping
943+ }
944+
945+ // SevProductFromCpuid1Eax returns the SevProduct that is represented by cpuid(1).eax.
946+ func SevProductFromCpuid1Eax (eax uint32 ) * pb.SevProduct {
947+ family , model , stepping := FmsFromCpuid1Eax (eax )
918948 // Ah, Fh, {0h,1h} values from the KDS specification,
919949 // section "Determining the Product Name".
920950 var productName pb.SevProduct_SevProductName
921951 // Product information specified by processor programming reference publications.
922- if extendedFamily == sevExtendedFamily && family == sevFamily {
923- switch extendedModel {
924- case milanExtendedModel :
952+ if family == zen3zen4Family {
953+ switch model {
954+ case milanModel :
925955 productName = pb .SevProduct_SEV_PRODUCT_MILAN
926- case genoaExtendedModel :
956+ case genoaModel :
927957 productName = pb .SevProduct_SEV_PRODUCT_GENOA
928958 default :
929959 productName = pb .SevProduct_SEV_PRODUCT_UNKNOWN
@@ -932,7 +962,7 @@ func SevProductFromCpuid1Eax(eax uint32) *pb.SevProduct {
932962 }
933963 return & pb.SevProduct {
934964 Name : productName ,
935- MachineStepping : & wrapperspb.UInt32Value {Value : stepping },
965+ MachineStepping : & wrapperspb.UInt32Value {Value : uint32 ( stepping ) },
936966 }
937967}
938968
@@ -943,15 +973,15 @@ func MaskedCpuid1EaxFromSevProduct(product *pb.SevProduct) uint32 {
943973 if product .MachineStepping != nil {
944974 stepping = product .MachineStepping .Value & 0xf
945975 }
946- extendedFamily := uint32 (sevExtendedFamily ) << extendedFamilyShift
947- family := uint32 (sevFamily ) << familyShift
976+ extendedFamily := uint32 (zen3zen4Family - 0xf ) << extendedFamilyShift
977+ family := uint32 (0xf ) << familyShift
948978
949979 var extendedModel uint32
950980 switch product .Name {
951981 case pb .SevProduct_SEV_PRODUCT_MILAN :
952- extendedModel = milanExtendedModel
982+ extendedModel = milanModel
953983 case pb .SevProduct_SEV_PRODUCT_GENOA :
954- extendedModel = genoaExtendedModel
984+ extendedModel = genoaModel
955985 default :
956986 return 0
957987 }
0 commit comments