From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39B11C6FD1F for ; Thu, 21 Mar 2024 23:45:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B4C7B6B0089; Thu, 21 Mar 2024 19:45:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B064C6B008A; Thu, 21 Mar 2024 19:45:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9C3A16B008C; Thu, 21 Mar 2024 19:45:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 8C42C6B0089 for ; Thu, 21 Mar 2024 19:45:48 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 50E4E803F3 for ; Thu, 21 Mar 2024 23:45:48 +0000 (UTC) X-FDA: 81922681176.17.EA114F6 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) by imf27.hostedemail.com (Postfix) with ESMTP id E956140016 for ; Thu, 21 Mar 2024 23:45:45 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=llYLRQSD; spf=pass (imf27.hostedemail.com: domain of dongsheng.x.zhang@intel.com designates 198.175.65.13 as permitted sender) smtp.mailfrom=dongsheng.x.zhang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711064746; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ks+zYNB8kcB0CY6lu/WoF1VT07LS0TrIC25+O4Df9+o=; b=xPPuheWFUJk+BZ8V2k9Gkb3ks7U3/VIo5agO2luEkzxHlLIRolN01A/3UhfR7F7pdhWEnR JSV+AqRijhtraKTNTRtBWoraM1XfSZOBBqUqvl+xv+zuYJ1Ax5xxO8xkv7F7F9gpkcy/b/ jX6O0JuxUc+HPkioujZXmWLqHTkV4aE= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711064746; a=rsa-sha256; cv=none; b=npZlNi8bEEi0yCMQo9t55jiBMppGDYCeC8bEdu6HUVZcAn2Hn4RynXbDrA+JAlE5AxcG1g JIEEcgcYY4RLrxumjBGLqn//q0+VAK5TmRHe/EikI2nWxVtF1rQJYFicofKh4OYf5DxcSI CE298+zbYwuPTLOhFuJ4OK5EzP/zfZ8= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=llYLRQSD; spf=pass (imf27.hostedemail.com: domain of dongsheng.x.zhang@intel.com designates 198.175.65.13 as permitted sender) smtp.mailfrom=dongsheng.x.zhang@intel.com; dmarc=pass (policy=none) header.from=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711064746; x=1742600746; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=jW38JzanhRNpu03oZcnIFmEukYYO360wk+qtFn4vZEQ=; b=llYLRQSDKk/YAb4z4flXTpRw3ydE1AIMJVB2zu03BFyGC5BjUuZAwPjj BJQNmiLblWm3G9Mqueeadveu8JcQV7PLAR/lAGxaFihRUZJXCwOGKVqjQ 788mmsKA7DzkCSZ6TupL2YcxUQoFPDZjhEnmHuuiVav6jQOC84VRr2B6M vi/pDblGf134Uzdw+pdQzPjl0JpXF0ohioOZMsOBfqnl+3FLeFsRJrkEr RSp/s64kFwfVU3Y0qd0Jb4/R4pkOSGYXQijDxzkATVypacKm9QsI1k3Y/ RD9ED/GMLGYcYd7VrBee5J3YoaV0saU1GQmtpCh46ADCG5gI7TBqP1cyM w==; X-IronPort-AV: E=McAfee;i="6600,9927,11020"; a="17246016" X-IronPort-AV: E=Sophos;i="6.07,144,1708416000"; d="scan'208";a="17246016" Received: from orviesa006.jf.intel.com ([10.64.159.146]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2024 16:45:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,144,1708416000"; d="scan'208";a="15106951" Received: from dongshen-mobl1.amr.corp.intel.com (HELO [10.212.116.150]) ([10.212.116.150]) by orviesa006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2024 16:45:44 -0700 Message-ID: Date: Thu, 21 Mar 2024 16:45:43 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v5 17/29] KVM: selftests: TDX: Add TDX MMIO reads test To: Sagi Shahar , linux-kselftest@vger.kernel.org, Ackerley Tng , Ryan Afranji , Erdem Aktas , Isaku Yamahata Cc: Sean Christopherson , Paolo Bonzini , Shuah Khan , Peter Gonda , Haibo Xu , Chao Peng , Vishal Annapurve , Roger Wang , Vipin Sharma , jmattson@google.com, dmatlack@google.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org References: <20231212204647.2170650-1-sagis@google.com> <20231212204647.2170650-18-sagis@google.com> Content-Language: en-US From: "Zhang, Dongsheng X" In-Reply-To: <20231212204647.2170650-18-sagis@google.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: E956140016 X-Rspam-User: X-Stat-Signature: gbncon8mxwpiicx6b7gmbwsuj5cjrzxz X-Rspamd-Server: rspam03 X-HE-Tag: 1711064745-935204 X-HE-Meta: U2FsdGVkX19+wLaROuveq7JJR4IKHURP2bmQkXBZiRABTN0sciNiitfyGlgGuyIIqGHCZ3YSPEpXkiogZrf7KD+lMn8/U3t7u/2QOjLKKY61aDz1Du1qaQIhlEbNS/dGzAst/HmlVSZpOoioEOHZPfOwfk2DHZvQL2LuEW7xFFVMa1oy6M9W/y062UiqFrgO4QroFxYZ8p+7MmQIF32uR5LQHBX1DyNQnxDpL8zOTx8Zr1d1pxlYZnyAlgn/BKlhrCT+9E8wGLORdbt0JW+M7oFzwCx0yzuCA2tfTvcmgaP4seGaiQDpjJh81jb6lY/IM9oC27/LiAEVDY3rcMx3htUuIpYi1LG3Ag593r5RcbakKeMkJlLSxMf/4DDwFAL4+tInhecdJ2NKSeeKnfvF3nrcfrMk2+G9eNt3knLQDkI2Lybadb4juE2ArWEHGiYuytCoVF8AP7OwXahevtvS3QP/9RSf5GrSDBdI5m41U2HisN0vh1MLvjNlGeEXrCQskCf0Os3ywaUqrPgGkXG9Z3/85I27xe5j1/HEZpkLpgycTfDHqtXT43r+Jm0IsPVR2Q0Gxz1TJZdGv+zykEw9j3iEtUepE9C+FTy6FotmJZq7avl12UdyNZq1j6X1mOS+vaeqUre4gUbrNvmyTcmSkbX4gyJAyfVQkwBdMZjiCtngkzb4U/SpWz+vlFTZzij80xlbFAHMNqpS/XBUB9SkzhR8yZlHEDhbP3fSlhOAR4hdn5MBSLe6TRG/w5meFt/BNBH2Z5tuHhJL7wrd3BT0EwYRmQJdXXJqac1AaiK3QC3dSH4eM88AhvlQfXrQ0p3V4NhePAsBZOuMNttsT6na6H6ZFKAVFYOiVrMBCUwkAxh68dkQUTYBX16Dd1DDG+aRcIABsncMzpA+acf4HuFWZHZowVQVMKUQTPRuiNz33bgFQuIJCRI0yAhzfQAjsgXV3Ne7bnEig3W0H2ZZDh+ qLl5DA4l 5zzKbWF/zXn0Qfg4sKGluVXnuH1o34s6xemLawSXI071I8gaabS1csooJIZJnpICqXnTy6LoQ7nwHu8FZ4kMiweoe8bOnePGp6jo9q8UGYreCLGciK1LATf+WxrmPMe8ARRmu65k4AO+vBQkxqYUFvGf6Wt+Zm8L3MBgo/c53H6OzocVWqcC5Vj2K7rydZhEts6UeAtXnq3kMgWk= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On 12/12/2023 12:46 PM, Sagi Shahar wrote: > The test verifies MMIO reads of various sizes from the host to the guest. > > Signed-off-by: Sagi Shahar > Signed-off-by: Ackerley Tng > Signed-off-by: Ryan Afranji > --- > .../selftests/kvm/include/x86_64/tdx/tdcall.h | 2 + > .../selftests/kvm/include/x86_64/tdx/tdx.h | 3 + > .../kvm/include/x86_64/tdx/test_util.h | 23 +++++ > .../selftests/kvm/lib/x86_64/tdx/tdx.c | 19 ++++ > .../selftests/kvm/x86_64/tdx_vm_tests.c | 87 +++++++++++++++++++ > 5 files changed, 134 insertions(+) > > diff --git a/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h b/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h > index b5e94b7c48fa..95fcdbd8404e 100644 > --- a/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h > +++ b/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h > @@ -9,6 +9,8 @@ > > #define TDG_VP_VMCALL_INSTRUCTION_IO_READ 0 > #define TDG_VP_VMCALL_INSTRUCTION_IO_WRITE 1 > +#define TDG_VP_VMCALL_VE_REQUEST_MMIO_READ 0 > +#define TDG_VP_VMCALL_VE_REQUEST_MMIO_WRITE 1 > > #define TDG_VP_VMCALL_SUCCESS 0x0000000000000000 > #define TDG_VP_VMCALL_INVALID_OPERAND 0x8000000000000000 > diff --git a/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h b/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h > index b18e39d20498..13ce60df5684 100644 > --- a/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h > +++ b/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h > @@ -12,6 +12,7 @@ > #define TDG_VP_VMCALL_INSTRUCTION_IO 30 > #define TDG_VP_VMCALL_INSTRUCTION_RDMSR 31 > #define TDG_VP_VMCALL_INSTRUCTION_WRMSR 32 > +#define TDG_VP_VMCALL_VE_REQUEST_MMIO 48 > > void handle_userspace_tdg_vp_vmcall_exit(struct kvm_vcpu *vcpu); > uint64_t tdg_vp_vmcall_instruction_io(uint64_t port, uint64_t size, > @@ -22,5 +23,7 @@ uint64_t tdg_vp_vmcall_get_td_vmcall_info(uint64_t *r11, uint64_t *r12, > uint64_t tdg_vp_vmcall_instruction_rdmsr(uint64_t index, uint64_t *ret_value); > uint64_t tdg_vp_vmcall_instruction_wrmsr(uint64_t index, uint64_t value); > uint64_t tdg_vp_vmcall_instruction_hlt(uint64_t interrupt_blocked_flag); > +uint64_t tdg_vp_vmcall_ve_request_mmio_read(uint64_t address, uint64_t size, > + uint64_t *data_out); > > #endif // SELFTEST_TDX_TDX_H > diff --git a/tools/testing/selftests/kvm/include/x86_64/tdx/test_util.h b/tools/testing/selftests/kvm/include/x86_64/tdx/test_util.h > index 8a9b6a1bec3e..af412b764604 100644 > --- a/tools/testing/selftests/kvm/include/x86_64/tdx/test_util.h > +++ b/tools/testing/selftests/kvm/include/x86_64/tdx/test_util.h > @@ -35,6 +35,29 @@ > (VCPU)->run->io.direction); \ > } while (0) > > + > +/** > + * Assert that some MMIO operation involving TDG.VP.VMCALL <#VERequestMMIO> was > + * called in the guest. > + */ > +#define TDX_TEST_ASSERT_MMIO(VCPU, ADDR, SIZE, DIR) \ > + do { \ > + TEST_ASSERT((VCPU)->run->exit_reason == KVM_EXIT_MMIO, \ > + "Got exit_reason other than KVM_EXIT_MMIO: %u (%s)\n", \ > + (VCPU)->run->exit_reason, \ > + exit_reason_str((VCPU)->run->exit_reason)); \ > + \ > + TEST_ASSERT(((VCPU)->run->exit_reason == KVM_EXIT_MMIO) && \ > + ((VCPU)->run->mmio.phys_addr == (ADDR)) && \ > + ((VCPU)->run->mmio.len == (SIZE)) && \ > + ((VCPU)->run->mmio.is_write == (DIR)), \ > + "Got an unexpected MMIO exit values: %u (%s) %llu %d %d\n", \ > + (VCPU)->run->exit_reason, \ > + exit_reason_str((VCPU)->run->exit_reason), \ > + (VCPU)->run->mmio.phys_addr, (VCPU)->run->mmio.len, \ > + (VCPU)->run->mmio.is_write); \ > + } while (0) > + > /** > * Check and report if there was some failure in the guest, either an exception > * like a triple fault, or if a tdx_test_fatal() was hit. > diff --git a/tools/testing/selftests/kvm/lib/x86_64/tdx/tdx.c b/tools/testing/selftests/kvm/lib/x86_64/tdx/tdx.c > index 9485bafedc38..b19f07ebc0e7 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/tdx/tdx.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/tdx/tdx.c > @@ -124,3 +124,22 @@ uint64_t tdg_vp_vmcall_instruction_hlt(uint64_t interrupt_blocked_flag) > > return __tdx_hypercall(&args, 0); > } > + > +uint64_t tdg_vp_vmcall_ve_request_mmio_read(uint64_t address, uint64_t size, > + uint64_t *data_out) > +{ > + uint64_t ret; > + struct tdx_hypercall_args args = { > + .r11 = TDG_VP_VMCALL_VE_REQUEST_MMIO, > + .r12 = size, > + .r13 = TDG_VP_VMCALL_VE_REQUEST_MMIO_READ, > + .r14 = address, > + }; > + > + ret = __tdx_hypercall(&args, TDX_HCALL_HAS_OUTPUT); > + > + if (data_out) > + *data_out = args.r11; > + > + return ret; > +} > diff --git a/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c b/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c > index 5fae4c6e5f95..48902b69d13e 100644 > --- a/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c > +++ b/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c > @@ -799,6 +799,92 @@ void verify_guest_hlt(void) > _verify_guest_hlt(0); > } > > +/* Pick any address that was not mapped into the guest to test MMIO */ > +#define TDX_MMIO_TEST_ADDR 0x200000000 > + > +void guest_mmio_reads(void) > +{ > + uint64_t data; > + uint64_t ret; > + > + ret = tdg_vp_vmcall_ve_request_mmio_read(TDX_MMIO_TEST_ADDR, 1, &data); > + if (ret) > + tdx_test_fatal(ret); > + if (data != 0x12) > + tdx_test_fatal(1); > + > + ret = tdg_vp_vmcall_ve_request_mmio_read(TDX_MMIO_TEST_ADDR, 2, &data); > + if (ret) > + tdx_test_fatal(ret); > + if (data != 0x1234) > + tdx_test_fatal(2); > + > + ret = tdg_vp_vmcall_ve_request_mmio_read(TDX_MMIO_TEST_ADDR, 4, &data); > + if (ret) > + tdx_test_fatal(ret); > + if (data != 0x12345678) > + tdx_test_fatal(4); > + > + ret = tdg_vp_vmcall_ve_request_mmio_read(TDX_MMIO_TEST_ADDR, 8, &data); > + if (ret) > + tdx_test_fatal(ret); > + if (data != 0x1234567890ABCDEF) > + tdx_test_fatal(8); > + > + // Read an invalid number of bytes. > + ret = tdg_vp_vmcall_ve_request_mmio_read(TDX_MMIO_TEST_ADDR, 10, &data); > + if (ret) > + tdx_test_fatal(ret); > + > + tdx_test_success(); > +} > + > +/* > + * Varifies guest MMIO reads. Nit: typo? Varifies ==> Verifies > + */ > +void verify_mmio_reads(void) > +{ > + struct kvm_vm *vm; > + struct kvm_vcpu *vcpu; > + > + vm = td_create(); > + td_initialize(vm, VM_MEM_SRC_ANONYMOUS, 0); > + vcpu = td_vcpu_add(vm, 0, guest_mmio_reads); > + td_finalize(vm); > + > + printf("Verifying TD MMIO reads:\n"); > + > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_MMIO(vcpu, TDX_MMIO_TEST_ADDR, 1, TDG_VP_VMCALL_VE_REQUEST_MMIO_READ); > + *(uint8_t *)vcpu->run->mmio.data = 0x12; > + > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_MMIO(vcpu, TDX_MMIO_TEST_ADDR, 2, TDG_VP_VMCALL_VE_REQUEST_MMIO_READ); > + *(uint16_t *)vcpu->run->mmio.data = 0x1234; > + > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_MMIO(vcpu, TDX_MMIO_TEST_ADDR, 4, TDG_VP_VMCALL_VE_REQUEST_MMIO_READ); > + *(uint32_t *)vcpu->run->mmio.data = 0x12345678; > + > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_MMIO(vcpu, TDX_MMIO_TEST_ADDR, 8, TDG_VP_VMCALL_VE_REQUEST_MMIO_READ); > + *(uint64_t *)vcpu->run->mmio.data = 0x1234567890ABCDEF; > + > + td_vcpu_run(vcpu); > + TEST_ASSERT_EQ(vcpu->run->exit_reason, KVM_EXIT_SYSTEM_EVENT); > + TEST_ASSERT_EQ(vcpu->run->system_event.data[1], TDG_VP_VMCALL_INVALID_OPERAND); > + > + td_vcpu_run(vcpu); > + TDX_TEST_ASSERT_SUCCESS(vcpu); > + > + kvm_vm_free(vm); > + printf("\t ... PASSED\n"); > +} > + > int main(int argc, char **argv) > { > setbuf(stdout, NULL); > @@ -818,6 +904,7 @@ int main(int argc, char **argv) > run_in_new_process(&verify_guest_msr_writes); > run_in_new_process(&verify_guest_msr_reads); > run_in_new_process(&verify_guest_hlt); > + run_in_new_process(&verify_mmio_reads); > > return 0; > }