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 2B090C3DA49 for ; Thu, 25 Jul 2024 22:35:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A16106B0096; Thu, 25 Jul 2024 18:35:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9C5196B0098; Thu, 25 Jul 2024 18:35:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 88C5A6B0099; Thu, 25 Jul 2024 18:35:54 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 6BE016B0096 for ; Thu, 25 Jul 2024 18:35:54 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 03F388056C for ; Thu, 25 Jul 2024 22:35:53 +0000 (UTC) X-FDA: 82379733828.05.82E64DB Received: from mail-yb1-f171.google.com (mail-yb1-f171.google.com [209.85.219.171]) by imf06.hostedemail.com (Postfix) with ESMTP id 37E03180014 for ; Thu, 25 Jul 2024 22:35:51 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=TjhUBlNB; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of sagis@google.com designates 209.85.219.171 as permitted sender) smtp.mailfrom=sagis@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1721946914; a=rsa-sha256; cv=none; b=4dLkk+Dw8iFfYi8UpyNWLfmKQymFPwF6MMNEoxOkvgzOvxjE7BBA6AeV2Cyv3p2puSjDCI L/agM4lLYgDjtVSWS/Iw5aaYqQJ3wbutCRTIj+CI1aZkPkEDMYHinkzEPYRTXW8uk3i/TW PSslc6PhrgFeTRo3lrQYDCaDEJLoi5U= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=TjhUBlNB; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of sagis@google.com designates 209.85.219.171 as permitted sender) smtp.mailfrom=sagis@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1721946914; 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=YpVjP0KtbEWV6Tn7/HiYJHCVy9nNHdlo2E773Pd3yBk=; b=ujuaZ3tEDet2rnphX/SsUOVGFBRPY6HP+UvjGhJY8gMe7JEvjiB4smAe7Pa20oY4U/FoaW aCxqIIu/HSu0bN3N/f2e4fJ22gBbrWwNbR4SouzfLFSXqcQjUqxn6c3mlDIx/ygfT729uJ +uMfYU36GdQ3OyiKEID1gSduqXtv8Ac= Received: by mail-yb1-f171.google.com with SMTP id 3f1490d57ef6-e05e94a979eso1970868276.0 for ; Thu, 25 Jul 2024 15:35:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721946950; x=1722551750; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=YpVjP0KtbEWV6Tn7/HiYJHCVy9nNHdlo2E773Pd3yBk=; b=TjhUBlNBkK+azgzrqHfuYkdC5z7nKNut40iry4LKQyJcQN1Z91FujDZARfka1uVnf4 jcQuRM+WdfrG/Zi9KDJ4mu+UHpM4C2QGK/O+F9tp5FWw7h+DK5UFSDfJlsBmU4AuBrQ2 zVD7d0QCs2qOIMSP/nP0RwFygREx8hTcD0uXODi+nJl9LuDky45Afh7Za05q5RUGrQfY gaaW1UEJjC5FByo0yBqCVufTFWsB1FQSgupvw2TzGr8gjY9yO7HIHMT8J3BRBg0i87ny bAZNlMCWLM6JWpJXmg/C83I6n6q7T/2L+v5CO7LKgIOTxW921YX1n1AqDNMsZwdgmlEC HKXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721946950; x=1722551750; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YpVjP0KtbEWV6Tn7/HiYJHCVy9nNHdlo2E773Pd3yBk=; b=RDOsRZtqHEvQFAiKJtctSXsIMv7b5CMY4hNOdM9+MVm0dWbcJX5vM757kTxclO67Li uIzprDjM2j7rEQEuOM3fWp+37XhvdnffQk4E2nGXv6748V2ZjlKTyYygK323zDzV5kxe FzPJ6pH9flDwxI4qgi7W2FjD3u4ndif5zfS3jUdhpEwKGrYYOs1KpZVhhotyWm7P4yMa SlrOeQHUxUEa63kWPB/76sioyA5hQC7lO+JWP+dV+/LV/1wyZx0sNZkXEyrUApUcQF7H DMlQlrj54Lf7qgV0qnoskTMTCQuk0vhVJ2MZFZ1uvVDlV8Pa9Vc5eMz3uDRB3AkQ/jDZ hFeA== X-Forwarded-Encrypted: i=1; AJvYcCU40AN2XN2SQ2GRBHaCr2egbYQ2fr73y9nyS+KCxHF9l7uxlV9fUUtkqyjMqQTenuVcbrE8WCpMy6Bq6//CmLUMPGM= X-Gm-Message-State: AOJu0Yyxuw5t1pRy6bW68zQhKTZKJSmjm27keW3Q8/5wHEP+OpE5X2SH nChKssxV8GBohkVh9F3bDSG2nG2yeeQHPIAu+q8B10pyKz1WM6zTuuMMf4UODHJxPz/Vhdthy3L tcfM3+dWU1Zx9nY3X3jEYPU9tLBWdM91WVOPO X-Google-Smtp-Source: AGHT+IGmr4MPiaJyIpCo/BhgUoawx8fTUxSzitSrLmVUuttLQqaBuq66PsrBs3kKIRVwyyzZ1yf+Z6/bPBLBsogIgSI= X-Received: by 2002:a5b:60a:0:b0:e05:e410:d166 with SMTP id 3f1490d57ef6-e0b117aae60mr5820777276.18.1721946949830; Thu, 25 Jul 2024 15:35:49 -0700 (PDT) MIME-Version: 1.0 References: <20231212204647.2170650-1-sagis@google.com> <20231212204647.2170650-11-sagis@google.com> In-Reply-To: From: Sagi Shahar Date: Thu, 25 Jul 2024 17:35:37 -0500 Message-ID: Subject: Re: [RFC PATCH v5 10/29] KVM: selftests: TDX: Adding test case for TDX port IO To: Yan Zhao 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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 37E03180014 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: qwit1hbuxnu7ep94g164x6deo9g47ngs X-HE-Tag: 1721946951-115765 X-HE-Meta: U2FsdGVkX18LFRWvBtiZ6maUzep3dIi5II0mwmamJyZ+MutYDh0lNudZzlLgq5BvIZcgIilJ2Zd9erkvN++sIiiS8GN82h3ext0TQ9B7IqIQqebPA/ZeNB6pZBnWJei1bO23end3KMvMJxmHs7w6lRPceg9aqWYr8DqS3GIJ5hO3P6wEXf7sV5mXrat194syFnrX5EU/t7uI9sRhJqW7ZmIBYI6ugtgI2DKDzx6KmIY+IQjZROk//qwiP09IKTq7lgotDlihyesw7PV930dBKUlZIcYNMnClDTmrHSkrsGBlaPlrk4kfn1/WSwzhxushYcWm/8GvmfrW9ll4MAKIyHVJddWt2vwnYh4uQzMDhgE1Vv4+hEPFkuqIM9Ad5R3COxJ/6wJME4rLGdhXlI7zO7oZm7GUIvhFnfjo7Ms+sEMmNBwrs3AHY7rrgLIMIdd6W8ylNDwzDIX3dTAURJHMbqLWNmWJR9hsllnH+i3qcg+MKBG+Jz9LTWcCNXywtnVk7JKjMbCTtDd896SAZ02mHEYkdZe4eQ0+tIT4CpvlvVw5C9VJhOfC8ohDxseidkctnK8bU50Y/b7Gv1MAWj9mGgQ5V+lQl9IqEv4Pkz/3cNYIg/T2nPQ6voKzKCF6q7YRmLDvMBIEHFPTWt72FSA10wueDDUS9B50k0AHKbJ5NUugMPl1KfzrY95Vqpx0ty7Z0w2wKdKR2H8DDYgUyCpN5uZnrSKnRq63zXxodWROFxumR6wrsoj8cpvfJ/OCpdO/oPOJDGh7gKCiPvhdcgS/550Vkq7DTJTyaNovpQSVDGo3ajfrqf9EM2tviJQxOjORMvpAViTzDRlacmXPSo8VwbCTKC7shS7g70bK6ggDUxg9eSUl5JA+xKpVYoVTVqSC5bsqEmctfTBM9ApvVmT5ltc20vysB/23Hqu2TeZd+LONAG5ECNrjEcoiJHiCYpNcJgJMh9Pw1xyu/Ja/lfp 2loWPY6N A7obhs0q8vu34qMikS21Q6viQPtVBlxwYTqX3xXC6gItRoeqqz9yux95coE76I9Hc6exUJQsKU0DRz7IPU7lO1t+Ki8/6wQcCmULsS2sQ+vE3unDzZ7zECCwZCnRMiy6SwXOw/pG9iVjHXiYufqSaqXHnkQVOcneiC0vn45cVoKMKmPFAPbiBTzkJ2+CXaTkAK0bx4lwI7VBw2hX6HVfEuxF73ecxXoRJLFjcZyEGWX/8K9D2GYACqAoxGA== 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 Sun, Mar 3, 2024 at 8:49=E2=80=AFPM Yan Zhao wrot= e: > > On Tue, Dec 12, 2023 at 12:46:25PM -0800, 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(+) > > > > 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_i= o() was > > + * called in the guest. > > + */ > > +#define TDX_TEST_ASSERT_IO(VCPU, PORT, SIZE, DIR) \ > > + do { \ > > + TEST_ASSERT((VCPU)->run->exit_reason =3D=3D 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 =3D=3D KVM_EXIT_IO)= && \ > > + ((VCPU)->run->io.port =3D=3D (PORT)) && = \ > > + ((VCPU)->run->io.size =3D=3D (SIZE)) && = \ > > + ((VCPU)->run->io.direction =3D=3D (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 =3D=3D 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_POR= T > > + */ > > +void guest_ioexit(void) > > +{ > > + uint64_t data_out, data_in, delta; > > + uint64_t ret; > > + > > + data_out =3D 0xAB; > > + ret =3D tdg_vp_vmcall_instruction_io(TDX_IOEXIT_TEST_PORT, 1, > > + TDG_VP_VMCALL_INSTRUCTION_IO_WRIT= E, > > + &data_out); > > + if (ret) > > + tdx_test_fatal(ret); > > + > > + ret =3D 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 =3D data_in - data_out; > > + if (delta !=3D 1) > > + 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 =3D td_create(); > > + td_initialize(vm, VM_MEM_SRC_ANONYMOUS, 0); > > + vcpu =3D 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); > This check is a vain, because the first VMExit from vcpu run is always > KVM_EXIT_IO caused by tdg_vp_vmcall_instruction_io(). > > > > + TDX_TEST_ASSERT_IO(vcpu, TDX_IOEXIT_TEST_PORT, 1, > > + TDG_VP_VMCALL_INSTRUCTION_IO_WRITE); > > + port_data =3D *(uint8_t *)((void *)vcpu->run + vcpu->run->io.data= _offset); > > + > > + printf("\t ... IO WRITE: OK\n"); > So, even if there's an error in emulating writing of TDX_IOEXIT_TEST_POR= T, > and guest would then find a failure and trigger tdx_test_fatal(), this li= ne > will still print "IO WRITE: OK", which is not right. Changed this to "IO WRITE: DONE". This is a useful for understanding errors if they happen so I don't want to remove this log entirely. > > > + > > + /* > > + * Wait for the guest to do a IO read. Provide the previous writt= en data > > + * + 1 back to the guest > > + */ > > + td_vcpu_run(vcpu); > > + TDX_TEST_CHECK_GUEST_FAILURE(vcpu); > This check is a vain, too, as in write case. There's no harm in adding this check and it helps debugging issues if something unexpected happens. Since this check always come together with td_vcpu_run I'm going to simplify the code and introduce a TDX_RUN macro that simply runs the CPU and checks for reported guest failures which is going to replace the td_vcpu_run/TDX_TEST_CHECK_GUEST_FAILURE combo. > > > + 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) =3D p= ort_data + 1; > > + > > + printf("\t ... IO READ: OK\n"); > Same as in write case, this line should not be printed until after guest > finishing checking return code. > > > + > > + /* > > + * Wait for the guest to complete execution successfully. The rea= d > > + * 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; > > } > > -- > > 2.43.0.472.g3155946c3a-goog > > > > >