Skip to content

Commit 97a5518

Browse files
authored
Merge pull request #143 from deeglaze/v3
Change FMS fields to a single CPUID_1_EAX formatted field.
2 parents f3a6537 + b43f889 commit 97a5518

File tree

6 files changed

+128
-117
lines changed

6 files changed

+128
-117
lines changed

abi/abi.go

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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
904904
var 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
}

abi/abi_test.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,7 @@ var (
6161
author_key_digest: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
6262
report_id: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
6363
report_id_ma: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
64-
cpuid_fam_id: '\x00\x00'
65-
cpuid_mod_id: '\x00\x00'
66-
cpuid_step: '\x00\x00'
64+
cpuid1eax_fms: 0
6765
chip_id: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
6866
signature: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
6967
`
@@ -362,28 +360,28 @@ func TestSevProduct(t *testing.T) {
362360
want *spb.SevProduct
363361
}{
364362
{
365-
eax: 0x00a00f10,
363+
eax: 0x00a00f00,
366364
want: &spb.SevProduct{
367365
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
368366
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
369367
},
370368
},
371369
{
372-
eax: 0x00a00f11,
370+
eax: 0x00a00f01,
373371
want: &spb.SevProduct{
374372
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
375373
MachineStepping: &wrapperspb.UInt32Value{Value: 1},
376374
},
377375
},
378376
{
379-
eax: 0x00a10f10,
377+
eax: 0x00a10f00,
380378
want: &spb.SevProduct{
381379
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
382380
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
383381
},
384382
},
385383
{
386-
eax: 0x00a10f12,
384+
eax: 0x00a10f02,
387385
want: &spb.SevProduct{
388386
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
389387
MachineStepping: &wrapperspb.UInt32Value{Value: 2},
@@ -446,8 +444,8 @@ func TestExtendedPlatformCertTable(t *testing.T) {
446444
eax uint32
447445
stepping uint32
448446
}{
449-
{name: "Genoa-B2 cruft", pname: spb.SevProduct_SEV_PRODUCT_GENOA, eax: 0x00a10f12, stepping: 2},
450-
{name: "Milan-B1 cruft", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f11, stepping: 1},
447+
{name: "Genoa-B2", pname: spb.SevProduct_SEV_PRODUCT_GENOA, eax: 0x00a10f02, stepping: 2},
448+
{name: "Milan-B1", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f01, stepping: 1},
451449
{name: "Milan-B0", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f00, stepping: 0},
452450
}
453451
for _, tc := range tcs {

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/google/go-sev-guest
33
go 1.19
44

55
require (
6+
github.com/golang/protobuf v1.5.0
67
github.com/google/go-cmp v0.5.7
78
github.com/google/go-configfs-tsm v0.2.2
89
github.com/google/logger v1.1.1

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
3+
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
4+
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
25
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
36
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
47
github.com/google/go-configfs-tsm v0.2.2 h1:YnJ9rXIOj5BYD7/0DNnzs8AOp7UcvjfTvt215EWcs98=
@@ -18,6 +21,7 @@ golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
1821
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1922
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
2023
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
24+
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
2125
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
2226
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
2327
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

proto/sevsnp.proto

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ message Report {
5656
uint64 launch_tcb = 27;
5757
bytes signature = 28; // Should be 512 bytes long
5858

59-
bytes cpuid_fam_id = 29; // 1 byte combined Extended Family ID and Family ID
60-
bytes cpuid_mod_id = 30; // 1 byte combined Extended Model and Model fields
61-
bytes cpuid_step = 31; // 1 byte Stepping
59+
uint32 cpuid1eax_fms = 29; // The cpuid(1).eax & 0x0fff0fff representation of family/model/stepping
6260
}
6361

6462
message CertificateChain {

0 commit comments

Comments
 (0)