On Fri Aug 23, 2024 at 10:02 AM CEST, Janosch Frank wrote:
On 8/19/24 6:03 PM, Christoph Schlameuss wrote:
On Fri Aug 16, 2024 at 4:29 PM CEST, Janosch Frank wrote:
On 8/15/24 5:45 PM, Christoph Schlameuss wrote:
Add a test case verifying basic running and interaction of ucontrol VMs. Fill the segment and page tables for allocated memory and map memory on first access.
- uc_map_unmap Store and load data to mapped and unmapped memory and use pic segment translation handling to map memory on access.
Signed-off-by: Christoph Schlameuss schlameuss@linux.ibm.com
.../selftests/kvm/s390x/ucontrol_test.c | 120 +++++++++++++++++- 1 file changed, 119 insertions(+), 1 deletion(-)
+static void uc_handle_exit_ucontrol(FIXTURE_DATA(uc_kvm) * self) +{
- struct kvm_run *run = self->run;
- TEST_ASSERT_EQ(KVM_EXIT_S390_UCONTROL, run->exit_reason);
- switch (run->s390_ucontrol.pgm_code) {
- case PGM_SEGMENT_TRANSLATION:
pr_info("ucontrol pic segment translation 0x%llx\n",
run->s390_ucontrol.trans_exc_code);
/* map / make additional memory available */
struct kvm_s390_ucas_mapping map2 = {
.user_addr = (u64)gpa2hva(self, run->s390_ucontrol.trans_exc_code),
.vcpu_addr = run->s390_ucontrol.trans_exc_code,
.length = VM_MEM_EXT_SIZE,
};
pr_info("ucas map %p %p 0x%llx\n",
(void *)map2.user_addr, (void *)map2.vcpu_addr, map2.length);
TEST_ASSERT_EQ(0, ioctl(self->vcpu_fd, KVM_S390_UCAS_MAP, &map2));
break;
Why is this necessary if you fix up the mapping in the test?
This is also used within the uc_skey test to make sure the remap does work after the unmap.
Maybe I'm blind because I'm still recovering but where exactly?
It is literally used in the last line of the test case. Calling uc_handle_exit() again re-maps previously unmapped memory.
I can try to make that a little bit more obvious.
+ /* unmap and run loop again */ + TH_LOG("ucas unmap %p %p 0x%llx", + (void *)map2.user_addr, (void *)map2.vcpu_addr, map2.length); + rc = ioctl(self->vcpu_fd, KVM_S390_UCAS_UNMAP, &map2); + ASSERT_EQ(0, rc) + TH_LOG("ucas map result %d not expected, %s", rc, strerror(errno)); + ASSERT_EQ(0, uc_run_once(self)); + ASSERT_EQ(3, sync_regs->gprs[0]); + ASSERT_EQ(KVM_EXIT_S390_UCONTROL, run->exit_reason); + ASSERT_EQ(true, uc_handle_exit(self)); // <--- HERE +}