Skip to content

Commit

Permalink
Merge pull request #144 from google/revert-143-v3
Browse files Browse the repository at this point in the history
Revert "Change FMS fields to a single CPUID_1_EAX formatted field."
  • Loading branch information
deeglaze authored Nov 22, 2024
2 parents 97a5518 + 21132f0 commit 64cd695
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 128 deletions.
80 changes: 25 additions & 55 deletions abi/abi.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,10 @@ const (
extendedFamilyShift = 20
extendedModelShift = 16
familyShift = 8
modelShift = 4
// Combined extended values
zen3zen4Family = 0x19
milanModel = 0
genoaModel = 1 << 4
sevExtendedFamily = 0xA
sevFamily = 0xF
milanExtendedModel = 0
genoaExtendedModel = 1

// ReportVersion2 is set by the SNP API specification
// https://web.archive.org/web/20231222054111if_/http://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56860.pdf
Expand Down Expand Up @@ -488,7 +487,9 @@ func ReportToProto(data []uint8) (*pb.Report, error) {
mbzLo := 0x188
if r.Version == ReportVersion3 {
mbzLo = 0x18B
r.Cpuid1EaxFms = FmsToCpuid1Eax(data[0x188], data[0x189], data[0x18A])
r.CpuidFamId = []byte{data[0x188]}
r.CpuidModId = []byte{data[0x189]}
r.CpuidStep = []byte{data[0x18A]}
}

if err := mbz(data, mbzLo, 0x1A0); err != nil {
Expand Down Expand Up @@ -634,10 +635,9 @@ func ReportToAbiBytes(r *pb.Report) ([]byte, error) {

// Add CPUID information if this is a version 3 report.
if r.Version == ReportVersion3 {
family, model, stepping := FmsFromCpuid1Eax(r.Cpuid1EaxFms)
data[0x188] = family
data[0x189] = model
data[0x18A] = stepping
data[0x188] = r.CpuidFamId[0]
data[0x189] = r.CpuidModId[0]
data[0x18A] = r.CpuidStep[0]
}

copy(data[0x1A0:0x1E0], r.ChipId[:])
Expand Down Expand Up @@ -903,57 +903,27 @@ func (c *CertTable) Proto() *pb.CertificateChain {
// See assembly implementations in cpuid_*.s
var cpuid func(op uint32) (eax, ebx, ecx, edx uint32)

// FmsToCpuid1Eax returns the masked CPUID_1_EAX value that represents the given
// family, model, stepping (FMS) values.
func FmsToCpuid1Eax(family, model, stepping byte) uint32 {
var extendedFamily byte

familyID := family
if family >= 0xf {
extendedFamily = family - 0xf
familyID = 0xf
}
extendedModel := model >> 4
modelID := model & 0xf
return (uint32(extendedFamily) << extendedFamilyShift) |
(uint32(extendedModel) << extendedModelShift) |
(uint32(familyID) << familyShift) |
(uint32(modelID) << modelShift) |
(uint32(stepping & 0xf))
}

// FmsFromCpuid1Eax returns the family, model, stepping (FMS) values extracted from a
// CPUID_1_EAX value.
func FmsFromCpuid1Eax(eax uint32) (byte, byte, byte) {
// SevProductFromCpuid1Eax returns the SevProduct that is represented by cpuid(1).eax.
func SevProductFromCpuid1Eax(eax uint32) *pb.SevProduct {
// 31:28 reserved
// 27:20 Extended Family ID
extendedFamily := byte((eax >> extendedFamilyShift) & 0xff)
extendedFamily := (eax >> extendedFamilyShift) & 0xff
// 19:16 Extended Model ID
extendedModel := byte((eax >> extendedModelShift) & 0xf)
extendedModel := (eax >> extendedModelShift) & 0xf
// 15:14 reserved
// 11:8 Family ID
familyID := byte((eax >> familyShift) & 0xf)
// 7:4 Model
modelID := byte((eax >> modelShift) & 0xf)
family := (eax >> familyShift) & 0xf
// 3:0 Stepping
family := extendedFamily + familyID
model := (extendedModel << 4) | modelID
stepping := byte(eax & 0xf)
return family, model, stepping
}

// SevProductFromCpuid1Eax returns the SevProduct that is represented by cpuid(1).eax.
func SevProductFromCpuid1Eax(eax uint32) *pb.SevProduct {
family, model, stepping := FmsFromCpuid1Eax(eax)
stepping := eax & 0xf
// Ah, Fh, {0h,1h} values from the KDS specification,
// section "Determining the Product Name".
var productName pb.SevProduct_SevProductName
// Product information specified by processor programming reference publications.
if family == zen3zen4Family {
switch model {
case milanModel:
if extendedFamily == sevExtendedFamily && family == sevFamily {
switch extendedModel {
case milanExtendedModel:
productName = pb.SevProduct_SEV_PRODUCT_MILAN
case genoaModel:
case genoaExtendedModel:
productName = pb.SevProduct_SEV_PRODUCT_GENOA
default:
productName = pb.SevProduct_SEV_PRODUCT_UNKNOWN
Expand All @@ -962,7 +932,7 @@ func SevProductFromCpuid1Eax(eax uint32) *pb.SevProduct {
}
return &pb.SevProduct{
Name: productName,
MachineStepping: &wrapperspb.UInt32Value{Value: uint32(stepping)},
MachineStepping: &wrapperspb.UInt32Value{Value: stepping},
}
}

Expand All @@ -973,15 +943,15 @@ func MaskedCpuid1EaxFromSevProduct(product *pb.SevProduct) uint32 {
if product.MachineStepping != nil {
stepping = product.MachineStepping.Value & 0xf
}
extendedFamily := uint32(zen3zen4Family-0xf) << extendedFamilyShift
family := uint32(0xf) << familyShift
extendedFamily := uint32(sevExtendedFamily) << extendedFamilyShift
family := uint32(sevFamily) << familyShift

var extendedModel uint32
switch product.Name {
case pb.SevProduct_SEV_PRODUCT_MILAN:
extendedModel = milanModel
extendedModel = milanExtendedModel
case pb.SevProduct_SEV_PRODUCT_GENOA:
extendedModel = genoaModel
extendedModel = genoaExtendedModel
default:
return 0
}
Expand Down
16 changes: 9 additions & 7 deletions abi/abi_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ var (
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'
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'
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'
cpuid1eax_fms: 0
cpuid_fam_id: '\x00\x00'
cpuid_mod_id: '\x00\x00'
cpuid_step: '\x00\x00'
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'
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'
`
Expand Down Expand Up @@ -360,28 +362,28 @@ func TestSevProduct(t *testing.T) {
want *spb.SevProduct
}{
{
eax: 0x00a00f00,
eax: 0x00a00f10,
want: &spb.SevProduct{
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
},
},
{
eax: 0x00a00f01,
eax: 0x00a00f11,
want: &spb.SevProduct{
Name: spb.SevProduct_SEV_PRODUCT_MILAN,
MachineStepping: &wrapperspb.UInt32Value{Value: 1},
},
},
{
eax: 0x00a10f00,
eax: 0x00a10f10,
want: &spb.SevProduct{
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
MachineStepping: &wrapperspb.UInt32Value{Value: 0},
},
},
{
eax: 0x00a10f02,
eax: 0x00a10f12,
want: &spb.SevProduct{
Name: spb.SevProduct_SEV_PRODUCT_GENOA,
MachineStepping: &wrapperspb.UInt32Value{Value: 2},
Expand Down Expand Up @@ -444,8 +446,8 @@ func TestExtendedPlatformCertTable(t *testing.T) {
eax uint32
stepping uint32
}{
{name: "Genoa-B2", pname: spb.SevProduct_SEV_PRODUCT_GENOA, eax: 0x00a10f02, stepping: 2},
{name: "Milan-B1", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f01, stepping: 1},
{name: "Genoa-B2 cruft", pname: spb.SevProduct_SEV_PRODUCT_GENOA, eax: 0x00a10f12, stepping: 2},
{name: "Milan-B1 cruft", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f11, stepping: 1},
{name: "Milan-B0", pname: spb.SevProduct_SEV_PRODUCT_MILAN, eax: 0x00a00f00, stepping: 0},
}
for _, tc := range tcs {
Expand Down
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ module github.com/google/go-sev-guest
go 1.19

require (
github.com/golang/protobuf v1.5.0
github.com/google/go-cmp v0.5.7
github.com/google/go-configfs-tsm v0.2.2
github.com/google/logger v1.1.1
Expand Down
4 changes: 0 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-configfs-tsm v0.2.2 h1:YnJ9rXIOj5BYD7/0DNnzs8AOp7UcvjfTvt215EWcs98=
Expand All @@ -21,7 +18,6 @@ golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
4 changes: 3 additions & 1 deletion proto/sevsnp.proto
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ message Report {
uint64 launch_tcb = 27;
bytes signature = 28; // Should be 512 bytes long

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

message CertificateChain {
Expand Down
Loading

0 comments on commit 64cd695

Please sign in to comment.