Files
Zach KoopmansandgVisor bot 7125a7da39 [SMT] Refactor runsc mititgate
Refactor mitigate to use /sys/devices/system/cpu/smt/control instead
of individual CPU control files.

PiperOrigin-RevId: 389215975
2021-08-06 11:10:54 -07:00

146 lines
3.9 KiB
Go

// Copyright 2021 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mitigate
import "strings"
// MockCPU represents data from CPUs that will be mitigated.
type MockCPU struct {
Name string
VendorID string
Family int64
Model int64
ModelName string
Bugs string
PhysicalCores int64
Cores int64
ThreadsPerCore int64
}
// CascadeLake2 is a two core Intel CascadeLake machine.
var CascadeLake2 = MockCPU{
Name: "CascadeLake",
VendorID: "GenuineIntel",
Family: 6,
Model: 85,
ModelName: "Intel(R) Xeon(R) CPU",
Bugs: "spectre_v1 spectre_v2 spec_store_bypass mds swapgs taa",
PhysicalCores: 1,
Cores: 1,
ThreadsPerCore: 2,
}
// CascadeLake4 is a four core Intel CascadeLake machine.
var CascadeLake4 = MockCPU{
Name: "CascadeLake",
VendorID: "GenuineIntel",
Family: 6,
Model: 85,
ModelName: "Intel(R) Xeon(R) CPU",
Bugs: "spectre_v1 spectre_v2 spec_store_bypass mds swapgs taa",
PhysicalCores: 1,
Cores: 2,
ThreadsPerCore: 2,
}
// Haswell2 is a two core Intel Haswell machine.
var Haswell2 = MockCPU{
Name: "Haswell",
VendorID: "GenuineIntel",
Family: 6,
Model: 63,
ModelName: "Intel(R) Xeon(R) CPU",
Bugs: "cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs",
PhysicalCores: 1,
Cores: 1,
ThreadsPerCore: 2,
}
// Haswell2core is a 2 core Intel Haswell machine with no hyperthread pairs.
var Haswell2core = MockCPU{
Name: "Haswell2Physical",
VendorID: "GenuineIntel",
Family: 6,
Model: 63,
ModelName: "Intel(R) Xeon(R) CPU",
Bugs: "cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs",
PhysicalCores: 2,
Cores: 1,
ThreadsPerCore: 1,
}
// AMD2 is an two core AMD machine.
var AMD2 = MockCPU{
Name: "AMD",
VendorID: "AuthenticAMD",
Family: 23,
Model: 49,
ModelName: "AMD EPYC 7B12",
Bugs: "sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass",
PhysicalCores: 1,
Cores: 1,
ThreadsPerCore: 2,
}
// AMD8 is an eight core AMD machine.
var AMD8 = MockCPU{
Name: "AMD",
VendorID: "AuthenticAMD",
Family: 23,
Model: 49,
ModelName: "AMD EPYC 7B12",
Bugs: "sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass",
PhysicalCores: 4,
Cores: 1,
ThreadsPerCore: 2,
}
// Empty is an empty CPU set.
var Empty = MockCPU{
Name: "Empty",
}
// MakeCPUSet makes a cpuSet from a MockCPU.
func (tc MockCPU) MakeCPUSet() CPUSet {
bugs := make(map[string]struct{})
for _, bug := range strings.Split(tc.Bugs, " ") {
bugs[bug] = struct{}{}
}
var cpus CPUSet = []*CPU{}
for i := int64(0); i < tc.PhysicalCores; i++ {
for j := int64(0); j < tc.Cores; j++ {
for k := int64(0); k < tc.ThreadsPerCore; k++ {
processorNum := (i*tc.Cores+j)*tc.ThreadsPerCore + k
cpu := &CPU{
processorNumber: processorNum,
vendorID: tc.VendorID,
cpuFamily: tc.Family,
model: tc.Model,
physicalID: i,
coreID: j,
bugs: bugs,
}
cpus = append(cpus, cpu)
}
}
}
return cpus
}
// NumCPUs returns the number of CPUs for this CPU.
func (tc MockCPU) NumCPUs() int {
return int(tc.PhysicalCores * tc.Cores * tc.ThreadsPerCore)
}