@@ -121,11 +121,10 @@ const (
121121 extendedFamilyShift = 20
122122 extendedModelShift = 16
123123 familyShift = 8
124- modelShift = 4
125- // Combined extended values
126- zen3zen4Family = 0x19
127- milanModel = 0
128- genoaModel = 1 << 4
124+ sevExtendedFamily = 0xA
125+ sevFamily = 0xF
126+ milanExtendedModel = 0
127+ genoaExtendedModel = 1
129128
130129 // ReportVersion2 is set by the SNP API specification
131130 // https://web.archive.org/web/20231222054111if_/http://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56860.pdf
@@ -488,7 +487,9 @@ func ReportToProto(data []uint8) (*pb.Report, error) {
488487 mbzLo := 0x188
489488 if r .Version == ReportVersion3 {
490489 mbzLo = 0x18B
491- r .Cpuid1EaxFms = FmsToCpuid1Eax (data [0x188 ], data [0x189 ], data [0x18A ])
490+ r .CpuidFamId = []byte {data [0x188 ]}
491+ r .CpuidModId = []byte {data [0x189 ]}
492+ r .CpuidStep = []byte {data [0x18A ]}
492493 }
493494
494495 if err := mbz (data , mbzLo , 0x1A0 ); err != nil {
@@ -634,10 +635,9 @@ func ReportToAbiBytes(r *pb.Report) ([]byte, error) {
634635
635636 // Add CPUID information if this is a version 3 report.
636637 if r .Version == ReportVersion3 {
637- family , model , stepping := FmsFromCpuid1Eax (r .Cpuid1EaxFms )
638- data [0x188 ] = family
639- data [0x189 ] = model
640- data [0x18A ] = stepping
638+ data [0x188 ] = r .CpuidFamId [0 ]
639+ data [0x189 ] = r .CpuidModId [0 ]
640+ data [0x18A ] = r .CpuidStep [0 ]
641641 }
642642
643643 copy (data [0x1A0 :0x1E0 ], r .ChipId [:])
@@ -903,57 +903,27 @@ 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- // 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 ) {
906+ // SevProductFromCpuid1Eax returns the SevProduct that is represented by cpuid(1).eax.
907+ func SevProductFromCpuid1Eax (eax uint32 ) * pb.SevProduct {
928908 // 31:28 reserved
929909 // 27:20 Extended Family ID
930- extendedFamily := byte (( eax >> extendedFamilyShift ) & 0xff )
910+ extendedFamily := ( eax >> extendedFamilyShift ) & 0xff
931911 // 19:16 Extended Model ID
932- extendedModel := byte (( eax >> extendedModelShift ) & 0xf )
912+ extendedModel := ( eax >> extendedModelShift ) & 0xf
933913 // 15:14 reserved
934914 // 11:8 Family ID
935- familyID := byte ((eax >> familyShift ) & 0xf )
936- // 7:4 Model
937- modelID := byte ((eax >> modelShift ) & 0xf )
915+ family := (eax >> familyShift ) & 0xf
938916 // 3:0 Stepping
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 )
917+ stepping := eax & 0xf
948918 // Ah, Fh, {0h,1h} values from the KDS specification,
949919 // section "Determining the Product Name".
950920 var productName pb.SevProduct_SevProductName
951921 // Product information specified by processor programming reference publications.
952- if family == zen3zen4Family {
953- switch model {
954- case milanModel :
922+ if extendedFamily == sevExtendedFamily && family == sevFamily {
923+ switch extendedModel {
924+ case milanExtendedModel :
955925 productName = pb .SevProduct_SEV_PRODUCT_MILAN
956- case genoaModel :
926+ case genoaExtendedModel :
957927 productName = pb .SevProduct_SEV_PRODUCT_GENOA
958928 default :
959929 productName = pb .SevProduct_SEV_PRODUCT_UNKNOWN
@@ -962,7 +932,7 @@ func SevProductFromCpuid1Eax(eax uint32) *pb.SevProduct {
962932 }
963933 return & pb.SevProduct {
964934 Name : productName ,
965- MachineStepping : & wrapperspb.UInt32Value {Value : uint32 ( stepping ) },
935+ MachineStepping : & wrapperspb.UInt32Value {Value : stepping },
966936 }
967937}
968938
@@ -973,15 +943,15 @@ func MaskedCpuid1EaxFromSevProduct(product *pb.SevProduct) uint32 {
973943 if product .MachineStepping != nil {
974944 stepping = product .MachineStepping .Value & 0xf
975945 }
976- extendedFamily := uint32 (zen3zen4Family - 0xf ) << extendedFamilyShift
977- family := uint32 (0xf ) << familyShift
946+ extendedFamily := uint32 (sevExtendedFamily ) << extendedFamilyShift
947+ family := uint32 (sevFamily ) << familyShift
978948
979949 var extendedModel uint32
980950 switch product .Name {
981951 case pb .SevProduct_SEV_PRODUCT_MILAN :
982- extendedModel = milanModel
952+ extendedModel = milanExtendedModel
983953 case pb .SevProduct_SEV_PRODUCT_GENOA :
984- extendedModel = genoaModel
954+ extendedModel = genoaExtendedModel
985955 default :
986956 return 0
987957 }
0 commit comments