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 B7052C54E41 for ; Thu, 29 Feb 2024 13:21:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E1A116B009D; Thu, 29 Feb 2024 08:21:01 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id DCA096B009E; Thu, 29 Feb 2024 08:21:01 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C91DC6B009F; Thu, 29 Feb 2024 08:21:01 -0500 (EST) 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 B9B236B009D for ; Thu, 29 Feb 2024 08:21:01 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 7EE5040FFA for ; Thu, 29 Feb 2024 13:21:01 +0000 (UTC) X-FDA: 81844901922.16.64828D6 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by imf17.hostedemail.com (Postfix) with ESMTP id A6AC24001C for ; Thu, 29 Feb 2024 13:20:58 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=QVQH5uBv; dmarc=pass (policy=none) header.from=intel.com; spf=none (imf17.hostedemail.com: domain of binbin.wu@linux.intel.com has no SPF policy when checking 198.175.65.17) smtp.mailfrom=binbin.wu@linux.intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1709212859; 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=2EUwX8v1OraEOIOiUxQ5b6QgTDOVYKDgK+VY1D7JrDk=; b=NQgL3VkVyUkANxL8xRj51xWO3JFvcqHT0o2FmU4txCZkRuoQd+qzRakwqaipT0lJgX3TDV QM6roCKS2pihFAUN8ShLPRcpJewfcsmkQRFnP8Xhj90LI0U/WoSRFQrgzUC3eFqDCqLn0b 5fpFfcLYdgJcakwv07UKPKsjYdB47uI= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=QVQH5uBv; dmarc=pass (policy=none) header.from=intel.com; spf=none (imf17.hostedemail.com: domain of binbin.wu@linux.intel.com has no SPF policy when checking 198.175.65.17) smtp.mailfrom=binbin.wu@linux.intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1709212859; a=rsa-sha256; cv=none; b=ZuGAeDcHLlSyll/J3GlgI5RVGtTOswuT9KX+b09D3bL4vEPhrVNe5UkrDHCea19nynEeFa x6WfjpCAiFbwIV6ABJc3N2ZPMMRK7nQDl4LfN19AmVZCAllqBZ9onXnAE0VTQLOcDWmZ8H x7zTusUmkJWaimhiDSC8DYP/pRrQ9KU= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1709212859; x=1740748859; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=tTL87iMGZEk33vzaUvdAz+e1baooBztQzpXVo3p2Pbg=; b=QVQH5uBv0dMyK0fbE+OiNLjY+A2czNQ0GLpRd5C23xU5igu2NzyuSRre 0a40CpF7//K8Tnd8cL6pZhsqXF/WSOAdkH3EhU1EIQfBPHT+nZj9ek23e YOm/PBElEYISPGTvwqfGyxXyPFJzC45moFZc+O+esia9f+4hkKMjovszk 9sULJfpyC+F7eHjFKmRHi2vro4WUzCE06+bnO5lRHaBnGdMmJiyzDGZp0 +lrtg8bDXOUdOhdQDVP3GuFCdybQq3OLMMesUiRhcVDAwRiyIdB2sdX56 k1EjfFg6p9Ri1RfeG4f/vQW2B1Xp94JbGMSCuEaRh8zJyheKuh8bdFw+q g==; X-IronPort-AV: E=McAfee;i="6600,9927,10998"; a="3845281" X-IronPort-AV: E=Sophos;i="6.06,194,1705392000"; d="scan'208";a="3845281" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Feb 2024 05:20:57 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.06,194,1705392000"; d="scan'208";a="12437975" Received: from binbinwu-mobl.ccr.corp.intel.com (HELO [10.124.225.159]) ([10.124.225.159]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Feb 2024 05:20:50 -0800 Message-ID: <1334f23c-2d9d-4d89-8b8e-98cf8d712daf@linux.intel.com> Date: Thu, 29 Feb 2024 21:20:48 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v5 10/29] KVM: selftests: TDX: Adding test case for TDX port IO To: Sagi Shahar Cc: linux-kselftest@vger.kernel.org, Ackerley Tng , Ryan Afranji , Erdem Aktas , Isaku Yamahata , 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-11-sagis@google.com> From: Binbin Wu In-Reply-To: <20231212204647.2170650-11-sagis@google.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: A6AC24001C X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: t3qudm1dkjynkf4z47mf9yu5knzdihqe X-HE-Tag: 1709212858-375545 X-HE-Meta: U2FsdGVkX19YDfjdKyuwcVW2NIAsjD5CnIUPDroV9FLLixMcWzuPmmpe63PfNcDIi9CygLtbGWAWEQ9Gua1n9F06JXSZ8MW2IhNCj4PL4WyGyMSY4mQN7p5WxAomem62bvr7VITeIVpVr+D5e8gEs4JrXzW9PACcyCifQuETFvOpurXmJ9DTeqsmvcFb/Z1Y29ylNg0Yb2ZzPjsIhpeufIRxsN1gXcdTPm7NjUzqoU+f0/5BZx7tpUxClUgKIrEipIe/RLU353TnY9Ej6emfO9HIIItCDt6rY3z2uUs5uxJVIQbkfDlHEid2bnMBK8Z63wVzXq+PG8034flUvdxgN1X3GIH0pXgjpj/ybWu07wPxQeDAlCaOF3uyVvWUcWzlLIw1KikmGUnXwUXO7jYwKhwCA2o18f+YEs0rpvfTLrTpr1Ke3UmsbJ8Az2z5iaqi3dtExF+bwyhlJiwcyPdAe31vCCMkW5B5ysyIO62cZFsjab6ZcCaCDad2o5Exo8iNo0VsMoCI27+GIrEQoDECKUWLt8Olk/+z4NY8LAS13XAw2caZifp2z9ebsLNQVsM6t2F2JX8yj8gqlPA8hDUnWQgmoWgDGibtXKguFf5wWRflysm+zO8dsZI/QkNyNOlSTdgG51EetTLJKA9/RvFyRM7DC8ZS3X+5uFUhpctT6/d3VpEJRKyWNTwqndkd99BuX2gzvhAuk4hoGHm4oyHrAeX6zJusyBRvoHGkNs1M1YTL+jq04EGRWz6LV0Vk7qdcBGkh+ZXRJprGzHuJcq+NiYFYMUuUmgzq16j42DU2kX65Tv0YYESmCjoCTOJXRAlk3ApZEDMykCBoSCYL6CE1jwoUXg+GzzA1Re5njeZHbh0WLU5HKiELI44vlZ67TJ5nTcM83lx6kc9FoOsobkCXzXVX1XIZ2Y6SHnUpNNbYzgCvtBiXMu/pwGaLb6UYFmCQivcuwSG3nb/+9eBesIi SAQAMRXS UxTY26mSFLiRA03/ce87UqPpOFQRfJC/vwrJTJItE+STevvT8NxNfC8VXpGIkHci0+r7qpPyrkOoGbK8TYt528X4W1NiwF4upbzF0/dEZg9V6/ckl3sOVjEGWyeuvgmYxaf+KpBGE7s48LDPR6vXbAd6MGLvVlThA8i/svZBjlFU3x77rqlaqVvWaWk4ue6TfpO+PM41AewUGUmrb0It9MYwb4p4P37Qu1HOxCiC8ynNmQIc= 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/13/2023 4:46 AM, Sagi Shahar wrote: > From: Erdem Aktas > > Verifies TDVMCALL READ and WRITE operations. > > Signed-off-by: Erdem Aktas > Signed-off-by: Sagi Shahar > Signed-off-by: Ackerley Tng > Signed-off-by: Ryan Afranji > --- > .../kvm/include/x86_64/tdx/test_util.h | 34 ++++++++ > .../selftests/kvm/x86_64/tdx_vm_tests.c | 82 +++++++++++++++++++ > 2 files changed, 116 insertions(+) One nit comment below. Reviewed-by: Binbin Wu > > 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 6d69921136bd..95a5d5be7f0b 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 > @@ -9,6 +9,40 @@ > #define TDX_TEST_SUCCESS_PORT 0x30 > #define TDX_TEST_SUCCESS_SIZE 4 > > +/** > + * Assert that some IO operation involving tdg_vp_vmcall_instruction_io() was > + * called in the guest. > + */ > +#define TDX_TEST_ASSERT_IO(VCPU, PORT, SIZE, DIR) \ > + do { \ > + TEST_ASSERT((VCPU)->run->exit_reason == KVM_EXIT_IO, \ > + "Got exit_reason other than KVM_EXIT_IO: %u (%s)\n", \ > + (VCPU)->run->exit_reason, \ > + exit_reason_str((VCPU)->run->exit_reason)); \ > + \ > + TEST_ASSERT(((VCPU)->run->exit_reason == KVM_EXIT_IO) && \ > + ((VCPU)->run->io.port == (PORT)) && \ > + ((VCPU)->run->io.size == (SIZE)) && \ > + ((VCPU)->run->io.direction == (DIR)), \ > + "Got unexpected IO exit values: %u (%s) %d %d %d\n", \ > + (VCPU)->run->exit_reason, \ > + exit_reason_str((VCPU)->run->exit_reason), \ > + (VCPU)->run->io.port, (VCPU)->run->io.size, \ > + (VCPU)->run->io.direction); \ > + } 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. > + */ > +#define TDX_TEST_CHECK_GUEST_FAILURE(VCPU) \ > + do { \ > + if ((VCPU)->run->exit_reason == KVM_EXIT_SYSTEM_EVENT) \ > + TEST_FAIL("Guest reported error. error code: %lld (0x%llx)\n", \ > + (VCPU)->run->system_event.data[1], \ > + (VCPU)->run->system_event.data[1]); \ > + } while (0) > + > /** > * Assert that tdx_test_success() was called in the guest. > */ > 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 8638c7bbedaa..75467c407ca7 100644 > --- a/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c > +++ b/tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c > @@ -2,6 +2,7 @@ > > #include > #include "kvm_util_base.h" > +#include "tdx/tdcall.h" > #include "tdx/tdx.h" > #include "tdx/tdx_util.h" > #include "tdx/test_util.h" > @@ -74,6 +75,86 @@ void verify_report_fatal_error(void) > printf("\t ... PASSED\n"); > } > > +#define TDX_IOEXIT_TEST_PORT 0x50 > + > +/* > + * Verifies IO functionality by writing a |value| to a predefined port. > + * Verifies that the read value is |value| + 1 from the same port. > + * If all the tests are passed then write a value to port TDX_TEST_PORT > + */ > +void guest_ioexit(void) > +{ > + uint64_t data_out, data_in, delta; > + uint64_t ret; > + > + data_out = 0xAB; > + ret = tdg_vp_vmcall_instruction_io(TDX_IOEXIT_TEST_PORT, 1, > + TDG_VP_VMCALL_INSTRUCTION_IO_WRITE, > + &data_out); > + if (ret) > + tdx_test_fatal(ret); > + > + ret = tdg_vp_vmcall_instruction_io(TDX_IOEXIT_TEST_PORT, 1, > + TDG_VP_VMCALL_INSTRUCTION_IO_READ, > + &data_in); > + if (ret) > + tdx_test_fatal(ret); > + > + delta = data_in - data_out; > + if (delta != 1) Nit: Is it more direct to compare data_in with 0xAC? > + tdx_test_fatal(ret); > + > + tdx_test_success(); > +} > + > +void verify_td_ioexit(void) > +{ > + struct kvm_vm *vm; > + struct kvm_vcpu *vcpu; > + > + uint32_t port_data; > + > + vm = td_create(); > + td_initialize(vm, VM_MEM_SRC_ANONYMOUS, 0); > + vcpu = td_vcpu_add(vm, 0, guest_ioexit); > + td_finalize(vm); > + > + printf("Verifying TD IO Exit:\n"); > + > + /* Wait for guest to do a IO write */ > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_IO(vcpu, TDX_IOEXIT_TEST_PORT, 1, > + TDG_VP_VMCALL_INSTRUCTION_IO_WRITE); > + port_data = *(uint8_t *)((void *)vcpu->run + vcpu->run->io.data_offset); > + > + printf("\t ... IO WRITE: OK\n"); > + > + /* > + * Wait for the guest to do a IO read. Provide the previous written data > + * + 1 back to the guest > + */ > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_IO(vcpu, TDX_IOEXIT_TEST_PORT, 1, > + TDG_VP_VMCALL_INSTRUCTION_IO_READ); > + *(uint8_t *)((void *)vcpu->run + vcpu->run->io.data_offset) = port_data + 1; > + > + printf("\t ... IO READ: OK\n"); > + > + /* > + * Wait for the guest to complete execution successfully. The read > + * value is checked within the guest. > + */ > + td_vcpu_run(vcpu); > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > + TDX_TEST_ASSERT_SUCCESS(vcpu); > + > + printf("\t ... IO verify read/write values: OK\n"); > + kvm_vm_free(vm); > + printf("\t ... PASSED\n"); > +} > + > int main(int argc, char **argv) > { > setbuf(stdout, NULL); > @@ -85,6 +166,7 @@ int main(int argc, char **argv) > > run_in_new_process(&verify_td_lifecycle); > run_in_new_process(&verify_report_fatal_error); > + run_in_new_process(&verify_td_ioexit); > > return 0; > }