1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Test for s390x CMMA migration
4 *
5 * Copyright IBM Corp. 2023
6 *
7 * Authors:
8 *  Nico Boehr <nrb@linux.ibm.com>
9 */
10
11#define _GNU_SOURCE /* for program_invocation_short_name */
12#include <fcntl.h>
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <sys/ioctl.h>
17
18#include "test_util.h"
19#include "kvm_util.h"
20#include "kselftest.h"
21
22#define MAIN_PAGE_COUNT 512
23
24#define TEST_DATA_PAGE_COUNT 512
25#define TEST_DATA_MEMSLOT 1
26#define TEST_DATA_START_GFN 4096
27
28#define TEST_DATA_TWO_PAGE_COUNT 256
29#define TEST_DATA_TWO_MEMSLOT 2
30#define TEST_DATA_TWO_START_GFN 8192
31
32static char cmma_value_buf[MAIN_PAGE_COUNT + TEST_DATA_PAGE_COUNT];
33
34/**
35 * Dirty CMMA attributes of exactly one page in the TEST_DATA memslot,
36 * so use_cmma goes on and the CMMA related ioctls do something.
37 */
38static void guest_do_one_essa(void)
39{
40	asm volatile(
41		/* load TEST_DATA_START_GFN into r1 */
42		"	llilf 1,%[start_gfn]\n"
43		/* calculate the address from the gfn */
44		"	sllg 1,1,12(0)\n"
45		/* set the first page in TEST_DATA memslot to STABLE */
46		"	.insn rrf,0xb9ab0000,2,1,1,0\n"
47		/* hypercall */
48		"	diag 0,0,0x501\n"
49		"0:	j 0b"
50		:
51		: [start_gfn] "L"(TEST_DATA_START_GFN)
52		: "r1", "r2", "memory", "cc"
53	);
54}
55
56/**
57 * Touch CMMA attributes of all pages in TEST_DATA memslot. Set them to stable
58 * state.
59 */
60static void guest_dirty_test_data(void)
61{
62	asm volatile(
63		/* r1 = TEST_DATA_START_GFN */
64		"	xgr 1,1\n"
65		"	llilf 1,%[start_gfn]\n"
66		/* r5 = TEST_DATA_PAGE_COUNT */
67		"	lghi 5,%[page_count]\n"
68		/* r5 += r1 */
69		"2:	agfr 5,1\n"
70		/* r2 = r1 << 12 */
71		"1:	sllg 2,1,12(0)\n"
72		/* essa(r4, r2, SET_STABLE) */
73		"	.insn rrf,0xb9ab0000,4,2,1,0\n"
74		/* i++ */
75		"	agfi 1,1\n"
76		/* if r1 < r5 goto 1 */
77		"	cgrjl 1,5,1b\n"
78		/* hypercall */
79		"	diag 0,0,0x501\n"
80		"0:	j 0b"
81		:
82		: [start_gfn] "L"(TEST_DATA_START_GFN),
83		  [page_count] "L"(TEST_DATA_PAGE_COUNT)
84		:
85			/* the counter in our loop over the pages */
86			"r1",
87			/* the calculated page physical address */
88			"r2",
89			/* ESSA output register */
90			"r4",
91			/* last page */
92			"r5",
93			"cc", "memory"
94	);
95}
96
97static struct kvm_vm *create_vm(void)
98{
99	return ____vm_create(VM_MODE_DEFAULT);
100}
101
102static void create_main_memslot(struct kvm_vm *vm)
103{
104	int i;
105
106	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, MAIN_PAGE_COUNT, 0);
107	/* set the array of memslots to zero like __vm_create does */
108	for (i = 0; i < NR_MEM_REGIONS; i++)
109		vm->memslots[i] = 0;
110}
111
112static void create_test_memslot(struct kvm_vm *vm)
113{
114	vm_userspace_mem_region_add(vm,
115				    VM_MEM_SRC_ANONYMOUS,
116				    TEST_DATA_START_GFN << vm->page_shift,
117				    TEST_DATA_MEMSLOT,
118				    TEST_DATA_PAGE_COUNT,
119				    0
120				   );
121	vm->memslots[MEM_REGION_TEST_DATA] = TEST_DATA_MEMSLOT;
122}
123
124static void create_memslots(struct kvm_vm *vm)
125{
126	/*
127	 * Our VM has the following memory layout:
128	 * +------+---------------------------+
129	 * | GFN  | Memslot                   |
130	 * +------+---------------------------+
131	 * | 0    |                           |
132	 * | ...  | MAIN (Code, Stack, ...)   |
133	 * | 511  |                           |
134	 * +------+---------------------------+
135	 * | 4096 |                           |
136	 * | ...  | TEST_DATA                 |
137	 * | 4607 |                           |
138	 * +------+---------------------------+
139	 */
140	create_main_memslot(vm);
141	create_test_memslot(vm);
142}
143
144static void finish_vm_setup(struct kvm_vm *vm)
145{
146	struct userspace_mem_region *slot0;
147
148	kvm_vm_elf_load(vm, program_invocation_name);
149
150	slot0 = memslot2region(vm, 0);
151	ucall_init(vm, slot0->region.guest_phys_addr + slot0->region.memory_size);
152
153	kvm_arch_vm_post_create(vm);
154}
155
156static struct kvm_vm *create_vm_two_memslots(void)
157{
158	struct kvm_vm *vm;
159
160	vm = create_vm();
161
162	create_memslots(vm);
163
164	finish_vm_setup(vm);
165
166	return vm;
167}
168
169static void enable_cmma(struct kvm_vm *vm)
170{
171	int r;
172
173	r = __kvm_device_attr_set(vm->fd, KVM_S390_VM_MEM_CTRL, KVM_S390_VM_MEM_ENABLE_CMMA, NULL);
174	TEST_ASSERT(!r, "enabling cmma failed r=%d errno=%d", r, errno);
175}
176
177static void enable_dirty_tracking(struct kvm_vm *vm)
178{
179	vm_mem_region_set_flags(vm, 0, KVM_MEM_LOG_DIRTY_PAGES);
180	vm_mem_region_set_flags(vm, TEST_DATA_MEMSLOT, KVM_MEM_LOG_DIRTY_PAGES);
181}
182
183static int __enable_migration_mode(struct kvm_vm *vm)
184{
185	return __kvm_device_attr_set(vm->fd,
186				     KVM_S390_VM_MIGRATION,
187				     KVM_S390_VM_MIGRATION_START,
188				     NULL
189				    );
190}
191
192static void enable_migration_mode(struct kvm_vm *vm)
193{
194	int r = __enable_migration_mode(vm);
195
196	TEST_ASSERT(!r, "enabling migration mode failed r=%d errno=%d", r, errno);
197}
198
199static bool is_migration_mode_on(struct kvm_vm *vm)
200{
201	u64 out;
202	int r;
203
204	r = __kvm_device_attr_get(vm->fd,
205				  KVM_S390_VM_MIGRATION,
206				  KVM_S390_VM_MIGRATION_STATUS,
207				  &out
208				 );
209	TEST_ASSERT(!r, "getting migration mode status failed r=%d errno=%d", r, errno);
210	return out;
211}
212
213static int vm_get_cmma_bits(struct kvm_vm *vm, u64 flags, int *errno_out)
214{
215	struct kvm_s390_cmma_log args;
216	int rc;
217
218	errno = 0;
219
220	args = (struct kvm_s390_cmma_log){
221		.start_gfn = 0,
222		.count = sizeof(cmma_value_buf),
223		.flags = flags,
224		.values = (__u64)&cmma_value_buf[0]
225	};
226	rc = __vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, &args);
227
228	*errno_out = errno;
229	return rc;
230}
231
232static void test_get_cmma_basic(void)
233{
234	struct kvm_vm *vm = create_vm_two_memslots();
235	struct kvm_vcpu *vcpu;
236	int rc, errno_out;
237
238	/* GET_CMMA_BITS without CMMA enabled should fail */
239	rc = vm_get_cmma_bits(vm, 0, &errno_out);
240	TEST_ASSERT_EQ(rc, -1);
241	TEST_ASSERT_EQ(errno_out, ENXIO);
242
243	enable_cmma(vm);
244	vcpu = vm_vcpu_add(vm, 1, guest_do_one_essa);
245
246	vcpu_run(vcpu);
247
248	/* GET_CMMA_BITS without migration mode and without peeking should fail */
249	rc = vm_get_cmma_bits(vm, 0, &errno_out);
250	TEST_ASSERT_EQ(rc, -1);
251	TEST_ASSERT_EQ(errno_out, EINVAL);
252
253	/* GET_CMMA_BITS without migration mode and with peeking should work */
254	rc = vm_get_cmma_bits(vm, KVM_S390_CMMA_PEEK, &errno_out);
255	TEST_ASSERT_EQ(rc, 0);
256	TEST_ASSERT_EQ(errno_out, 0);
257
258	enable_dirty_tracking(vm);
259	enable_migration_mode(vm);
260
261	/* GET_CMMA_BITS with invalid flags */
262	rc = vm_get_cmma_bits(vm, 0xfeedc0fe, &errno_out);
263	TEST_ASSERT_EQ(rc, -1);
264	TEST_ASSERT_EQ(errno_out, EINVAL);
265
266	kvm_vm_free(vm);
267}
268
269static void assert_exit_was_hypercall(struct kvm_vcpu *vcpu)
270{
271	TEST_ASSERT_EQ(vcpu->run->exit_reason, 13);
272	TEST_ASSERT_EQ(vcpu->run->s390_sieic.icptcode, 4);
273	TEST_ASSERT_EQ(vcpu->run->s390_sieic.ipa, 0x8300);
274	TEST_ASSERT_EQ(vcpu->run->s390_sieic.ipb, 0x5010000);
275}
276
277static void test_migration_mode(void)
278{
279	struct kvm_vm *vm = create_vm();
280	struct kvm_vcpu *vcpu;
281	u64 orig_psw;
282	int rc;
283
284	/* enabling migration mode on a VM without memory should fail */
285	rc = __enable_migration_mode(vm);
286	TEST_ASSERT_EQ(rc, -1);
287	TEST_ASSERT_EQ(errno, EINVAL);
288	TEST_ASSERT(!is_migration_mode_on(vm), "migration mode should still be off");
289	errno = 0;
290
291	create_memslots(vm);
292	finish_vm_setup(vm);
293
294	enable_cmma(vm);
295	vcpu = vm_vcpu_add(vm, 1, guest_do_one_essa);
296	orig_psw = vcpu->run->psw_addr;
297
298	/*
299	 * Execute one essa instruction in the guest. Otherwise the guest will
300	 * not have use_cmm enabled and GET_CMMA_BITS will return no pages.
301	 */
302	vcpu_run(vcpu);
303	assert_exit_was_hypercall(vcpu);
304
305	/* migration mode when memslots have dirty tracking off should fail */
306	rc = __enable_migration_mode(vm);
307	TEST_ASSERT_EQ(rc, -1);
308	TEST_ASSERT_EQ(errno, EINVAL);
309	TEST_ASSERT(!is_migration_mode_on(vm), "migration mode should still be off");
310	errno = 0;
311
312	/* enable dirty tracking */
313	enable_dirty_tracking(vm);
314
315	/* enabling migration mode should work now */
316	rc = __enable_migration_mode(vm);
317	TEST_ASSERT_EQ(rc, 0);
318	TEST_ASSERT(is_migration_mode_on(vm), "migration mode should be on");
319	errno = 0;
320
321	/* execute another ESSA instruction to see this goes fine */
322	vcpu->run->psw_addr = orig_psw;
323	vcpu_run(vcpu);
324	assert_exit_was_hypercall(vcpu);
325
326	/*
327	 * With migration mode on, create a new memslot with dirty tracking off.
328	 * This should turn off migration mode.
329	 */
330	TEST_ASSERT(is_migration_mode_on(vm), "migration mode should be on");
331	vm_userspace_mem_region_add(vm,
332				    VM_MEM_SRC_ANONYMOUS,
333				    TEST_DATA_TWO_START_GFN << vm->page_shift,
334				    TEST_DATA_TWO_MEMSLOT,
335				    TEST_DATA_TWO_PAGE_COUNT,
336				    0
337				   );
338	TEST_ASSERT(!is_migration_mode_on(vm),
339		    "creating memslot without dirty tracking turns off migration mode"
340		   );
341
342	/* ESSA instructions should still execute fine */
343	vcpu->run->psw_addr = orig_psw;
344	vcpu_run(vcpu);
345	assert_exit_was_hypercall(vcpu);
346
347	/*
348	 * Turn on dirty tracking on the new memslot.
349	 * It should be possible to turn migration mode back on again.
350	 */
351	vm_mem_region_set_flags(vm, TEST_DATA_TWO_MEMSLOT, KVM_MEM_LOG_DIRTY_PAGES);
352	rc = __enable_migration_mode(vm);
353	TEST_ASSERT_EQ(rc, 0);
354	TEST_ASSERT(is_migration_mode_on(vm), "migration mode should be on");
355	errno = 0;
356
357	/*
358	 * Turn off dirty tracking again, this time with just a flag change.
359	 * Again, migration mode should turn off.
360	 */
361	TEST_ASSERT(is_migration_mode_on(vm), "migration mode should be on");
362	vm_mem_region_set_flags(vm, TEST_DATA_TWO_MEMSLOT, 0);
363	TEST_ASSERT(!is_migration_mode_on(vm),
364		    "disabling dirty tracking should turn off migration mode"
365		   );
366
367	/* ESSA instructions should still execute fine */
368	vcpu->run->psw_addr = orig_psw;
369	vcpu_run(vcpu);
370	assert_exit_was_hypercall(vcpu);
371
372	kvm_vm_free(vm);
373}
374
375/**
376 * Given a VM with the MAIN and TEST_DATA memslot, assert that both slots have
377 * CMMA attributes of all pages in both memslots and nothing more dirty.
378 * This has the useful side effect of ensuring nothing is CMMA dirty after this
379 * function.
380 */
381static void assert_all_slots_cmma_dirty(struct kvm_vm *vm)
382{
383	struct kvm_s390_cmma_log args;
384
385	/*
386	 * First iteration - everything should be dirty.
387	 * Start at the main memslot...
388	 */
389	args = (struct kvm_s390_cmma_log){
390		.start_gfn = 0,
391		.count = sizeof(cmma_value_buf),
392		.flags = 0,
393		.values = (__u64)&cmma_value_buf[0]
394	};
395	memset(cmma_value_buf, 0xff, sizeof(cmma_value_buf));
396	vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, &args);
397	TEST_ASSERT_EQ(args.count, MAIN_PAGE_COUNT);
398	TEST_ASSERT_EQ(args.remaining, TEST_DATA_PAGE_COUNT);
399	TEST_ASSERT_EQ(args.start_gfn, 0);
400
401	/* ...and then - after a hole - the TEST_DATA memslot should follow */
402	args = (struct kvm_s390_cmma_log){
403		.start_gfn = MAIN_PAGE_COUNT,
404		.count = sizeof(cmma_value_buf),
405		.flags = 0,
406		.values = (__u64)&cmma_value_buf[0]
407	};
408	memset(cmma_value_buf, 0xff, sizeof(cmma_value_buf));
409	vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, &args);
410	TEST_ASSERT_EQ(args.count, TEST_DATA_PAGE_COUNT);
411	TEST_ASSERT_EQ(args.start_gfn, TEST_DATA_START_GFN);
412	TEST_ASSERT_EQ(args.remaining, 0);
413
414	/* ...and nothing else should be there */
415	args = (struct kvm_s390_cmma_log){
416		.start_gfn = TEST_DATA_START_GFN + TEST_DATA_PAGE_COUNT,
417		.count = sizeof(cmma_value_buf),
418		.flags = 0,
419		.values = (__u64)&cmma_value_buf[0]
420	};
421	memset(cmma_value_buf, 0xff, sizeof(cmma_value_buf));
422	vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, &args);
423	TEST_ASSERT_EQ(args.count, 0);
424	TEST_ASSERT_EQ(args.start_gfn, 0);
425	TEST_ASSERT_EQ(args.remaining, 0);
426}
427
428/**
429 * Given a VM, assert no pages are CMMA dirty.
430 */
431static void assert_no_pages_cmma_dirty(struct kvm_vm *vm)
432{
433	struct kvm_s390_cmma_log args;
434
435	/* If we start from GFN 0 again, nothing should be dirty. */
436	args = (struct kvm_s390_cmma_log){
437		.start_gfn = 0,
438		.count = sizeof(cmma_value_buf),
439		.flags = 0,
440		.values = (__u64)&cmma_value_buf[0]
441	};
442	memset(cmma_value_buf, 0xff, sizeof(cmma_value_buf));
443	vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, &args);
444	if (args.count || args.remaining || args.start_gfn)
445		TEST_FAIL("pages are still dirty start_gfn=0x%llx count=%u remaining=%llu",
446			  args.start_gfn,
447			  args.count,
448			  args.remaining
449			 );
450}
451
452static void test_get_inital_dirty(void)
453{
454	struct kvm_vm *vm = create_vm_two_memslots();
455	struct kvm_vcpu *vcpu;
456
457	enable_cmma(vm);
458	vcpu = vm_vcpu_add(vm, 1, guest_do_one_essa);
459
460	/*
461	 * Execute one essa instruction in the guest. Otherwise the guest will
462	 * not have use_cmm enabled and GET_CMMA_BITS will return no pages.
463	 */
464	vcpu_run(vcpu);
465	assert_exit_was_hypercall(vcpu);
466
467	enable_dirty_tracking(vm);
468	enable_migration_mode(vm);
469
470	assert_all_slots_cmma_dirty(vm);
471
472	/* Start from the beginning again and make sure nothing else is dirty */
473	assert_no_pages_cmma_dirty(vm);
474
475	kvm_vm_free(vm);
476}
477
478static void query_cmma_range(struct kvm_vm *vm,
479			     u64 start_gfn, u64 gfn_count,
480			     struct kvm_s390_cmma_log *res_out)
481{
482	*res_out = (struct kvm_s390_cmma_log){
483		.start_gfn = start_gfn,
484		.count = gfn_count,
485		.flags = 0,
486		.values = (__u64)&cmma_value_buf[0]
487	};
488	memset(cmma_value_buf, 0xff, sizeof(cmma_value_buf));
489	vm_ioctl(vm, KVM_S390_GET_CMMA_BITS, res_out);
490}
491
492/**
493 * Assert the given cmma_log struct that was executed by query_cmma_range()
494 * indicates the first dirty gfn is at first_dirty_gfn and contains exactly
495 * dirty_gfn_count CMMA values.
496 */
497static void assert_cmma_dirty(u64 first_dirty_gfn,
498			      u64 dirty_gfn_count,
499			      const struct kvm_s390_cmma_log *res)
500{
501	TEST_ASSERT_EQ(res->start_gfn, first_dirty_gfn);
502	TEST_ASSERT_EQ(res->count, dirty_gfn_count);
503	for (size_t i = 0; i < dirty_gfn_count; i++)
504		TEST_ASSERT_EQ(cmma_value_buf[0], 0x0); /* stable state */
505	TEST_ASSERT_EQ(cmma_value_buf[dirty_gfn_count], 0xff); /* not touched */
506}
507
508static void test_get_skip_holes(void)
509{
510	size_t gfn_offset;
511	struct kvm_vm *vm = create_vm_two_memslots();
512	struct kvm_s390_cmma_log log;
513	struct kvm_vcpu *vcpu;
514	u64 orig_psw;
515
516	enable_cmma(vm);
517	vcpu = vm_vcpu_add(vm, 1, guest_dirty_test_data);
518
519	orig_psw = vcpu->run->psw_addr;
520
521	/*
522	 * Execute some essa instructions in the guest. Otherwise the guest will
523	 * not have use_cmm enabled and GET_CMMA_BITS will return no pages.
524	 */
525	vcpu_run(vcpu);
526	assert_exit_was_hypercall(vcpu);
527
528	enable_dirty_tracking(vm);
529	enable_migration_mode(vm);
530
531	/* un-dirty all pages */
532	assert_all_slots_cmma_dirty(vm);
533
534	/* Then, dirty just the TEST_DATA memslot */
535	vcpu->run->psw_addr = orig_psw;
536	vcpu_run(vcpu);
537
538	gfn_offset = TEST_DATA_START_GFN;
539	/**
540	 * Query CMMA attributes of one page, starting at page 0. Since the
541	 * main memslot was not touched by the VM, this should yield the first
542	 * page of the TEST_DATA memslot.
543	 * The dirty bitmap should now look like this:
544	 * 0: not dirty
545	 * [0x1, 0x200): dirty
546	 */
547	query_cmma_range(vm, 0, 1, &log);
548	assert_cmma_dirty(gfn_offset, 1, &log);
549	gfn_offset++;
550
551	/**
552	 * Query CMMA attributes of 32 (0x20) pages past the end of the TEST_DATA
553	 * memslot. This should wrap back to the beginning of the TEST_DATA
554	 * memslot, page 1.
555	 * The dirty bitmap should now look like this:
556	 * [0, 0x21): not dirty
557	 * [0x21, 0x200): dirty
558	 */
559	query_cmma_range(vm, TEST_DATA_START_GFN + TEST_DATA_PAGE_COUNT, 0x20, &log);
560	assert_cmma_dirty(gfn_offset, 0x20, &log);
561	gfn_offset += 0x20;
562
563	/* Skip 32 pages */
564	gfn_offset += 0x20;
565
566	/**
567	 * After skipping 32 pages, query the next 32 (0x20) pages.
568	 * The dirty bitmap should now look like this:
569	 * [0, 0x21): not dirty
570	 * [0x21, 0x41): dirty
571	 * [0x41, 0x61): not dirty
572	 * [0x61, 0x200): dirty
573	 */
574	query_cmma_range(vm, gfn_offset, 0x20, &log);
575	assert_cmma_dirty(gfn_offset, 0x20, &log);
576	gfn_offset += 0x20;
577
578	/**
579	 * Query 1 page from the beginning of the TEST_DATA memslot. This should
580	 * yield page 0x21.
581	 * The dirty bitmap should now look like this:
582	 * [0, 0x22): not dirty
583	 * [0x22, 0x41): dirty
584	 * [0x41, 0x61): not dirty
585	 * [0x61, 0x200): dirty
586	 */
587	query_cmma_range(vm, TEST_DATA_START_GFN, 1, &log);
588	assert_cmma_dirty(TEST_DATA_START_GFN + 0x21, 1, &log);
589	gfn_offset++;
590
591	/**
592	 * Query 15 (0xF) pages from page 0x23 in TEST_DATA memslot.
593	 * This should yield pages [0x23, 0x33).
594	 * The dirty bitmap should now look like this:
595	 * [0, 0x22): not dirty
596	 * 0x22: dirty
597	 * [0x23, 0x33): not dirty
598	 * [0x33, 0x41): dirty
599	 * [0x41, 0x61): not dirty
600	 * [0x61, 0x200): dirty
601	 */
602	gfn_offset = TEST_DATA_START_GFN + 0x23;
603	query_cmma_range(vm, gfn_offset, 15, &log);
604	assert_cmma_dirty(gfn_offset, 15, &log);
605
606	/**
607	 * Query 17 (0x11) pages from page 0x22 in TEST_DATA memslot.
608	 * This should yield page [0x22, 0x33)
609	 * The dirty bitmap should now look like this:
610	 * [0, 0x33): not dirty
611	 * [0x33, 0x41): dirty
612	 * [0x41, 0x61): not dirty
613	 * [0x61, 0x200): dirty
614	 */
615	gfn_offset = TEST_DATA_START_GFN + 0x22;
616	query_cmma_range(vm, gfn_offset, 17, &log);
617	assert_cmma_dirty(gfn_offset, 17, &log);
618
619	/**
620	 * Query 25 (0x19) pages from page 0x40 in TEST_DATA memslot.
621	 * This should yield page 0x40 and nothing more, since there are more
622	 * than 16 non-dirty pages after page 0x40.
623	 * The dirty bitmap should now look like this:
624	 * [0, 0x33): not dirty
625	 * [0x33, 0x40): dirty
626	 * [0x40, 0x61): not dirty
627	 * [0x61, 0x200): dirty
628	 */
629	gfn_offset = TEST_DATA_START_GFN + 0x40;
630	query_cmma_range(vm, gfn_offset, 25, &log);
631	assert_cmma_dirty(gfn_offset, 1, &log);
632
633	/**
634	 * Query pages [0x33, 0x40).
635	 * The dirty bitmap should now look like this:
636	 * [0, 0x61): not dirty
637	 * [0x61, 0x200): dirty
638	 */
639	gfn_offset = TEST_DATA_START_GFN + 0x33;
640	query_cmma_range(vm, gfn_offset, 0x40 - 0x33, &log);
641	assert_cmma_dirty(gfn_offset, 0x40 - 0x33, &log);
642
643	/**
644	 * Query the remaining pages [0x61, 0x200).
645	 */
646	gfn_offset = TEST_DATA_START_GFN;
647	query_cmma_range(vm, gfn_offset, TEST_DATA_PAGE_COUNT - 0x61, &log);
648	assert_cmma_dirty(TEST_DATA_START_GFN + 0x61, TEST_DATA_PAGE_COUNT - 0x61, &log);
649
650	assert_no_pages_cmma_dirty(vm);
651}
652
653struct testdef {
654	const char *name;
655	void (*test)(void);
656} testlist[] = {
657	{ "migration mode and dirty tracking", test_migration_mode },
658	{ "GET_CMMA_BITS: basic calls", test_get_cmma_basic },
659	{ "GET_CMMA_BITS: all pages are dirty initally", test_get_inital_dirty },
660	{ "GET_CMMA_BITS: holes are skipped", test_get_skip_holes },
661};
662
663/**
664 * The kernel may support CMMA, but the machine may not (i.e. if running as
665 * guest-3).
666 *
667 * In this case, the CMMA capabilities are all there, but the CMMA-related
668 * ioctls fail. To find out whether the machine supports CMMA, create a
669 * temporary VM and then query the CMMA feature of the VM.
670 */
671static int machine_has_cmma(void)
672{
673	struct kvm_vm *vm = create_vm();
674	int r;
675
676	r = !__kvm_has_device_attr(vm->fd, KVM_S390_VM_MEM_CTRL, KVM_S390_VM_MEM_ENABLE_CMMA);
677	kvm_vm_free(vm);
678
679	return r;
680}
681
682int main(int argc, char *argv[])
683{
684	int idx;
685
686	TEST_REQUIRE(kvm_has_cap(KVM_CAP_SYNC_REGS));
687	TEST_REQUIRE(kvm_has_cap(KVM_CAP_S390_CMMA_MIGRATION));
688	TEST_REQUIRE(machine_has_cmma());
689
690	ksft_print_header();
691
692	ksft_set_plan(ARRAY_SIZE(testlist));
693
694	for (idx = 0; idx < ARRAY_SIZE(testlist); idx++) {
695		testlist[idx].test();
696		ksft_test_result_pass("%s\n", testlist[idx].name);
697	}
698
699	ksft_finished();	/* Print results and exit() accordingly */
700}
701