Skip to content

Commit 64cd695

Browse files
authored
Merge pull request #144 from google/revert-143-v3
Revert "Change FMS fields to a single CPUID_1_EAX formatted field."
2 parents 97a5518 + 21132f0 commit 64cd695

File tree

6 files changed

+117
-128
lines changed

6 files changed

+117
-128
lines changed

abi/abi.go

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

abi/abi_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ 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-
cpuid1eax_fms: 0
64+
cpuid_fam_id: '\x00\x00'
65+
cpuid_mod_id: '\x00\x00'
66+
cpuid_step: '\x00\x00'
6567
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'
6668
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'
6769
`
@@ -360,28 +362,28 @@ func TestSevProduct(t *testing.T) {
360362
want *spb.SevProduct
361363
}{
362364
{
363-
eax: 0x00a00f00,
365+
eax: 0x00a00f10,
364366
want: &spb.SevProduct{
365367
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
366368
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
367369
},
368370
},
369371
{
370-
eax: 0x00a00f01,
372+
eax: 0x00a00f11,
371373
want: &spb.SevProduct{
372374
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
373375
MachineStepping: &wrapperspb.UInt32Value{Value: 1},
374376
},
375377
},
376378
{
377-
eax: 0x00a10f00,
379+
eax: 0x00a10f10,
378380
want: &spb.SevProduct{
379381
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
380382
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
381383
},
382384
},
383385
{
384-
eax: 0x00a10f02,
386+
eax: 0x00a10f12,
385387
want: &spb.SevProduct{
386388
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
387389
MachineStepping: &wrapperspb.UInt32Value{Value: 2},
@@ -444,8 +446,8 @@ func TestExtendedPlatformCertTable(t *testing.T) {
444446
eax uint32
445447
stepping uint32
446448
}{
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},
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},
449451
{name: "Milan-B0", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f00, stepping: 0},
450452
}
451453
for _, tc := range tcs {

go.mod

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

55
require (
6-
github.com/golang/protobuf v1.5.0
76
github.com/google/go-cmp v0.5.7
87
github.com/google/go-configfs-tsm v0.2.2
98
github.com/google/logger v1.1.1

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
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=
52
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
63
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
74
github.com/google/go-configfs-tsm v0.2.2 h1:YnJ9rXIOj5BYD7/0DNnzs8AOp7UcvjfTvt215EWcs98=
@@ -21,7 +18,6 @@ golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
2118
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
2219
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
2320
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=
2521
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
2622
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
2723
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

proto/sevsnp.proto

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

59-
uint32 cpuid1eax_fms = 29; // The cpuid(1).eax & 0x0fff0fff representation of family/model/stepping
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
6062
}
6163

6264
message CertificateChain {

0 commit comments

Comments
 (0)