mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Split the kvm ut test cases to correspond to different platforms
Split the kvm ut test cases to pass unit-tests on Arm64.
I will add the tls and full-context test cases for Arm64 later.
Signed-off-by: Bin Lu <bin.lu@arm.com>
This commit is contained in:
@@ -60,6 +60,7 @@ go_library(
|
||||
go_test(
|
||||
name = "kvm_test",
|
||||
srcs = [
|
||||
"kvm_amd64_test.go",
|
||||
"kvm_test.go",
|
||||
"virtual_map_test.go",
|
||||
],
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright 2020 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.
|
||||
|
||||
// +build amd64
|
||||
|
||||
package kvm
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform/kvm/testutil"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform/ring0"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform/ring0/pagetables"
|
||||
)
|
||||
|
||||
func TestSegments(t *testing.T) {
|
||||
applicationTest(t, true, testutil.TwiddleSegments, func(c *vCPU, regs *arch.Registers, pt *pagetables.PageTables) bool {
|
||||
testutil.SetTestSegments(regs)
|
||||
for {
|
||||
var si arch.SignalInfo
|
||||
if _, err := c.SwitchToUser(ring0.SwitchOpts{
|
||||
Registers: regs,
|
||||
FloatingPointState: dummyFPState,
|
||||
PageTables: pt,
|
||||
FullRestore: true,
|
||||
}, &si); err == platform.ErrContextInterrupt {
|
||||
continue // Retry.
|
||||
} else if err != nil {
|
||||
t.Errorf("application segment check with full restore got unexpected error: %v", err)
|
||||
}
|
||||
if err := testutil.CheckTestSegments(regs); err != nil {
|
||||
t.Errorf("application segment check with full restore failed: %v", err)
|
||||
}
|
||||
break // Done.
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
@@ -262,30 +262,6 @@ func TestRegistersFault(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestSegments(t *testing.T) {
|
||||
applicationTest(t, true, testutil.TwiddleSegments, func(c *vCPU, regs *arch.Registers, pt *pagetables.PageTables) bool {
|
||||
testutil.SetTestSegments(regs)
|
||||
for {
|
||||
var si arch.SignalInfo
|
||||
if _, err := c.SwitchToUser(ring0.SwitchOpts{
|
||||
Registers: regs,
|
||||
FloatingPointState: dummyFPState,
|
||||
PageTables: pt,
|
||||
FullRestore: true,
|
||||
}, &si); err == platform.ErrContextInterrupt {
|
||||
continue // Retry.
|
||||
} else if err != nil {
|
||||
t.Errorf("application segment check with full restore got unexpected error: %v", err)
|
||||
}
|
||||
if err := testutil.CheckTestSegments(regs); err != nil {
|
||||
t.Errorf("application segment check with full restore failed: %v", err)
|
||||
}
|
||||
break // Done.
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
func TestBounce(t *testing.T) {
|
||||
applicationTest(t, true, testutil.SpinLoop, func(c *vCPU, regs *arch.Registers, pt *pagetables.PageTables) bool {
|
||||
go func() {
|
||||
|
||||
@@ -104,3 +104,9 @@ TEXT ·TwiddleRegsSyscall(SB),NOSPLIT,$0
|
||||
TWIDDLE_REGS()
|
||||
SVC
|
||||
RET // never reached
|
||||
|
||||
TEXT ·TwiddleRegsFault(SB),NOSPLIT,$0
|
||||
TWIDDLE_REGS()
|
||||
// Branch to Register branches unconditionally to an address in <Rn>.
|
||||
JMP (R4) // <=> br x4, must fault
|
||||
RET // never reached
|
||||
|
||||
Reference in New Issue
Block a user