tools/testing/selftests/kvm/system_counter_offset_test.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/kvm/system_counter_offset_test.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/kvm/system_counter_offset_test.c- Extension
.c- Size
- 2626 bytes
- Lines
- 128
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
asm/kvm_para.hstdint.hstring.hsys/stat.htime.htest_util.hkvm_util.hprocessor.h
Detected Declarations
struct test_casefunction check_preconditionsfunction setup_system_counterfunction guest_read_system_counterfunction host_read_guest_system_counterfunction GUEST_SYNC_ARGSfunction handle_syncfunction handle_abortfunction enter_guestfunction main
Annotated Snippet
struct test_case {
u64 tsc_offset;
};
static struct test_case test_cases[] = {
{ 0 },
{ 180 * NSEC_PER_SEC },
{ -180 * NSEC_PER_SEC },
};
static void check_preconditions(struct kvm_vcpu *vcpu)
{
__TEST_REQUIRE(!__vcpu_has_device_attr(vcpu, KVM_VCPU_TSC_CTRL,
KVM_VCPU_TSC_OFFSET),
"KVM_VCPU_TSC_OFFSET not supported; skipping test");
}
static void setup_system_counter(struct kvm_vcpu *vcpu, struct test_case *test)
{
vcpu_device_attr_set(vcpu, KVM_VCPU_TSC_CTRL, KVM_VCPU_TSC_OFFSET,
&test->tsc_offset);
}
static u64 guest_read_system_counter(struct test_case *test)
{
return rdtsc();
}
static u64 host_read_guest_system_counter(struct test_case *test)
{
return rdtsc() + test->tsc_offset;
}
#else /* __x86_64__ */
#error test not implemented for this architecture!
#endif
#define GUEST_SYNC_CLOCK(__stage, __val) \
GUEST_SYNC_ARGS(__stage, __val, 0, 0, 0)
static void guest_main(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
struct test_case *test = &test_cases[i];
GUEST_SYNC_CLOCK(i, guest_read_system_counter(test));
}
}
static void handle_sync(struct ucall *uc, u64 start, u64 end)
{
u64 obs = uc->args[2];
TEST_ASSERT(start <= obs && obs <= end,
"unexpected system counter value: %"PRIu64" expected range: [%"PRIu64", %"PRIu64"]",
obs, start, end);
pr_info("system counter value: %"PRIu64" expected range [%"PRIu64", %"PRIu64"]\n",
obs, start, end);
}
static void handle_abort(struct ucall *uc)
{
REPORT_GUEST_ASSERT(*uc);
}
static void enter_guest(struct kvm_vcpu *vcpu)
{
u64 start, end;
struct ucall uc;
int i;
for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
struct test_case *test = &test_cases[i];
setup_system_counter(vcpu, test);
start = host_read_guest_system_counter(test);
vcpu_run(vcpu);
end = host_read_guest_system_counter(test);
switch (get_ucall(vcpu, &uc)) {
case UCALL_SYNC:
handle_sync(&uc, start, end);
break;
case UCALL_ABORT:
handle_abort(&uc);
Annotation
- Immediate include surface: `asm/kvm_para.h`, `stdint.h`, `string.h`, `sys/stat.h`, `time.h`, `test_util.h`, `kvm_util.h`, `processor.h`.
- Detected declarations: `struct test_case`, `function check_preconditions`, `function setup_system_counter`, `function guest_read_system_counter`, `function host_read_guest_system_counter`, `function GUEST_SYNC_ARGS`, `function handle_sync`, `function handle_abort`, `function enter_guest`, `function main`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.