diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-04-21 23:31:46 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-04-21 23:31:46 +0000 |
commit | 7f4a20ac7f137ed07e91fef5cae3aded15b05275 (patch) | |
tree | f5337c83509ad29ae3f42b7ee2d920691a41d12e /pkg/sentry/platform | |
parent | 588e13090d9f4555342a34c4b552265337a8e47c (diff) | |
parent | 6f9db949d89000d920da5c97adad470cf97b1c6c (diff) |
Merge release-20210419.0-17-g6f9db949d (automated)
Diffstat (limited to 'pkg/sentry/platform')
-rw-r--r-- | pkg/sentry/platform/kvm/kvm_const.go | 1 | ||||
-rw-r--r-- | pkg/sentry/platform/kvm/machine.go | 8 | ||||
-rw-r--r-- | pkg/sentry/platform/kvm/machine_amd64.go | 5 |
3 files changed, 14 insertions, 0 deletions
diff --git a/pkg/sentry/platform/kvm/kvm_const.go b/pkg/sentry/platform/kvm/kvm_const.go index 2492d57be..eb2dcccac 100644 --- a/pkg/sentry/platform/kvm/kvm_const.go +++ b/pkg/sentry/platform/kvm/kvm_const.go @@ -66,6 +66,7 @@ const ( _KVM_CAP_ARM_VM_IPA_SIZE = 0xa5 _KVM_CAP_VCPU_EVENTS = 0x29 _KVM_CAP_ARM_INJECT_SERROR_ESR = 0x9e + _KVM_CAP_TSC_CONTROL = 0x3c ) // KVM limits. diff --git a/pkg/sentry/platform/kvm/machine.go b/pkg/sentry/platform/kvm/machine.go index b3d4188a3..99f036bba 100644 --- a/pkg/sentry/platform/kvm/machine.go +++ b/pkg/sentry/platform/kvm/machine.go @@ -67,6 +67,9 @@ type machine struct { // maxSlots is the maximum number of memory slots supported by the machine. maxSlots int + // tscControl checks whether cpu supports TSC scaling + tscControl bool + // usedSlots is the set of used physical addresses (sorted). usedSlots []uintptr @@ -214,6 +217,11 @@ func newMachine(vm int) (*machine, error) { log.Debugf("The maximum number of slots is %d.", m.maxSlots) m.usedSlots = make([]uintptr, m.maxSlots) + // Check TSC Scaling + hasTSCControl, _, errno := unix.RawSyscall(unix.SYS_IOCTL, uintptr(m.fd), _KVM_CHECK_EXTENSION, _KVM_CAP_TSC_CONTROL) + m.tscControl = errno == 0 && hasTSCControl == 1 + log.Debugf("TSC scaling support: %t.", m.tscControl) + // Create the upper shared pagetables and kernel(sentry) pagetables. m.upperSharedPageTables = pagetables.New(newAllocator()) m.mapUpperHalf(m.upperSharedPageTables) diff --git a/pkg/sentry/platform/kvm/machine_amd64.go b/pkg/sentry/platform/kvm/machine_amd64.go index e8e209249..d7abfefb4 100644 --- a/pkg/sentry/platform/kvm/machine_amd64.go +++ b/pkg/sentry/platform/kvm/machine_amd64.go @@ -213,6 +213,11 @@ func (c *vCPU) setSystemTime() error { // capabilities as it is emulated in KVM. We don't actually use this // capability, but it means that this method should be robust to // different hardware configurations. + + // if tsc scaling is not supported, fallback to legacy mode + if !c.machine.tscControl { + return c.setSystemTimeLegacy() + } rawFreq, err := c.getTSCFreq() if err != nil { return c.setSystemTimeLegacy() |