Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: KVM: s390: check for registers to NOT change on reset

Normal reset and initial CPU reset do not clear all registers. Add a
test that those registers are NOT changed.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Christian Borntraeger and committed by
Paolo Bonzini
3203a017 b0435a12

+53 -2
+53 -2
tools/testing/selftests/kvm/s390x/resets.c
··· 40 40 " lctlg 8,8,%1\n" 41 41 " lctlg 10,10,%2\n" 42 42 " lctlg 11,11,%3\n" 43 - : : "m" (cr2_59), "m" (cr8_63), "m" (cr10), "m" (cr11) : "2"); 44 - GUEST_SYNC(0); 43 + /* now clobber some general purpose regs */ 44 + " llihh 0,0xffff\n" 45 + " llihl 1,0x5555\n" 46 + " llilh 2,0xaaaa\n" 47 + " llill 3,0x0000\n" 48 + /* now clobber a floating point reg */ 49 + " lghi 4,0x1\n" 50 + " cdgbr 0,4\n" 51 + /* now clobber an access reg */ 52 + " sar 9,4\n" 53 + /* We embed diag 501 here to control register content */ 54 + " diag 0,0,0x501\n" 55 + : 56 + : "m" (cr2_59), "m" (cr8_63), "m" (cr10), "m" (cr11) 57 + /* no clobber list as this should not return */ 58 + ); 45 59 } 46 60 47 61 static void test_one_reg(uint64_t id, uint64_t value) ··· 112 98 "vrs0-15 == 0 (sync_regs)"); 113 99 } 114 100 101 + static void assert_initial_noclear(void) 102 + { 103 + TEST_ASSERT(sync_regs->gprs[0] == 0xffff000000000000UL, 104 + "gpr0 == 0xffff000000000000 (sync_regs)"); 105 + TEST_ASSERT(sync_regs->gprs[1] == 0x0000555500000000UL, 106 + "gpr1 == 0x0000555500000000 (sync_regs)"); 107 + TEST_ASSERT(sync_regs->gprs[2] == 0x00000000aaaa0000UL, 108 + "gpr2 == 0x00000000aaaa0000 (sync_regs)"); 109 + TEST_ASSERT(sync_regs->gprs[3] == 0x0000000000000000UL, 110 + "gpr3 == 0x0000000000000000 (sync_regs)"); 111 + TEST_ASSERT(sync_regs->fprs[0] == 0x3ff0000000000000UL, 112 + "fpr0 == 0f1 (sync_regs)"); 113 + TEST_ASSERT(sync_regs->acrs[9] == 1, "ar9 == 1 (sync_regs)"); 114 + } 115 + 115 116 static void assert_initial(void) 116 117 { 117 118 struct kvm_sregs sregs; ··· 169 140 test_one_reg(KVM_REG_S390_CLOCK_COMP, 0); 170 141 } 171 142 143 + static void assert_normal_noclear(void) 144 + { 145 + TEST_ASSERT(sync_regs->crs[2] == 0x10, "cr2 == 10 (sync_regs)"); 146 + TEST_ASSERT(sync_regs->crs[8] == 1, "cr10 == 1 (sync_regs)"); 147 + TEST_ASSERT(sync_regs->crs[10] == 1, "cr10 == 1 (sync_regs)"); 148 + TEST_ASSERT(sync_regs->crs[11] == -1, "cr11 == -1 (sync_regs)"); 149 + } 150 + 172 151 static void assert_normal(void) 173 152 { 174 153 test_one_reg(KVM_REG_S390_PFTOKEN, KVM_S390_PFAULT_TOKEN_INVALID); ··· 213 176 inject_irq(VCPU_ID); 214 177 215 178 vcpu_ioctl(vm, VCPU_ID, KVM_S390_NORMAL_RESET, 0); 179 + 180 + /* must clears */ 216 181 assert_normal(); 182 + /* must not clears */ 183 + assert_normal_noclear(); 184 + assert_initial_noclear(); 185 + 217 186 kvm_vm_free(vm); 218 187 } 219 188 ··· 235 192 inject_irq(VCPU_ID); 236 193 237 194 vcpu_ioctl(vm, VCPU_ID, KVM_S390_INITIAL_RESET, 0); 195 + 196 + /* must clears */ 238 197 assert_normal(); 239 198 assert_initial(); 199 + /* must not clears */ 200 + assert_initial_noclear(); 201 + 240 202 kvm_vm_free(vm); 241 203 } 242 204 ··· 257 209 inject_irq(VCPU_ID); 258 210 259 211 vcpu_ioctl(vm, VCPU_ID, KVM_S390_CLEAR_RESET, 0); 212 + 213 + /* must clears */ 260 214 assert_normal(); 261 215 assert_initial(); 262 216 assert_clear(); 217 + 263 218 kvm_vm_free(vm); 264 219 } 265 220