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 4E7A1C4345F for ; Fri, 12 Apr 2024 04:42:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D68FC6B0088; Fri, 12 Apr 2024 00:42:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D16F76B0089; Fri, 12 Apr 2024 00:42:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BDFC56B008A; Fri, 12 Apr 2024 00:42:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 9F72E6B0088 for ; Fri, 12 Apr 2024 00:42:28 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 374C1120B6E for ; Fri, 12 Apr 2024 04:42:28 +0000 (UTC) X-FDA: 81999633576.17.BB50E7F Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf10.hostedemail.com (Postfix) with ESMTP id 85FA9C0006 for ; Fri, 12 Apr 2024 04:42:26 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=CWYgmkAO; spf=pass (imf10.hostedemail.com: domain of 3sbsYZgsKCMIiksmztm61voowwotm.kwutqv25-uus3iks.wzo@flex--ackerleytng.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3sbsYZgsKCMIiksmztm61voowwotm.kwutqv25-uus3iks.wzo@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1712896946; 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: in-reply-to:in-reply-to:references:dkim-signature; bh=CNKCkNsot/Do8CE0Y5PRYhfWnEd0oPU98R4yomeMOBg=; b=ft868CLdOlT4Yy2sEZnPxWgKcd4J76Mcbg+aiONH2YztNn6rIIF4TajCYAhY047hrx5Y4w eDBwOlcx+7LzjT3M1B9ZKiCVvyQ8Fe1l2oeb/EQt7B319hI5eaQ3ddSKuPR3kbhfiY0C8H D7vMk2la3NZkFEeAWl1IDNoDlsHrEwg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1712896946; a=rsa-sha256; cv=none; b=SRZeJA/dsbBTcgTVlA8uhLO8LcHDlZTFv2guOn9PHj+n7p5OY8BasiVuxWrjfIEWrUOmzB vvk0FzePunIfz4qBCHFctU7cR+TGrj0nWZrVnIn3vT4IOoCawJf9SS0m6EAOrDfrKui0dt vo0FDOTttdECutazD5rDdGc3rkencoY= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=CWYgmkAO; spf=pass (imf10.hostedemail.com: domain of 3sbsYZgsKCMIiksmztm61voowwotm.kwutqv25-uus3iks.wzo@flex--ackerleytng.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3sbsYZgsKCMIiksmztm61voowwotm.kwutqv25-uus3iks.wzo@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dce775fa8adso993280276.1 for ; Thu, 11 Apr 2024 21:42:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712896945; x=1713501745; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:in-reply-to:date:from:to :cc:subject:date:message-id:reply-to; bh=CNKCkNsot/Do8CE0Y5PRYhfWnEd0oPU98R4yomeMOBg=; b=CWYgmkAOcQoJ8cL3QfiB5wddubTazWfAeEpKncagJmHV5oEh3Qq0b97zwIT6ou3jnG lAmuD/jQGAF1nklewm+x7oCJsxfWwvHUPbilut+0Z6wLI8nRbE+v++4GGYmirFQMiMMl dtC4nveFHgAdQiKgHaZ3t6L568exyvEF+C1SxTVS3GC7lzTWD7R/iz2ISkw9Vu+Att9u EwnuaGFt9o1IZibcICyj5tAxpDa3AE1FFB5elAsRE43Hpmot9yUW/cX/iO0Hle17a0Sw AnVk6vIYuRJjLzc2HEsUy3VIZVm2nwjfJULYx7QqkEd6ghrQo+nkBDj043Dglh1ptphx S7kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712896945; x=1713501745; h=cc:to:from:subject:message-id:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CNKCkNsot/Do8CE0Y5PRYhfWnEd0oPU98R4yomeMOBg=; b=SadxOnhpPYhZvhjEQAGVDLq7TWUVVPOhGBHRW8qwVeYwEyOScis39scSP8qqJpLqDu w1AacYfizWxU1ND5cCkQRBkhbtcupobhLtZoKrgfvJA8QLicSchlfDTDy16xB/QfhKw7 SoJXsYM8broLqy1+WhDQsHB9U+QzriyKSZX2WX7LLPG/fC2+nhiII67hc6lrJ+H7UAOu h1e6d20vkV0SXCAnCjjb7c2nTItSWZaNm82bu7m5jg2UTF1tx2z21t40u5xwD4JCflYD wZpQk/z9G+KWy3ot1S2Mkm5aFT0XyFayA422IgfhU1zB8QQjcHeyMUYKl+3OKpIGZWu2 fufw== X-Forwarded-Encrypted: i=1; AJvYcCViyGM56vq8PEHvEBYUfMOAU65/Bk5F8XgcltBsCcCePSe3fHABbLd577QtJgeWZKUZQR6unNpHJaO0Vx0Z5isJJxw= X-Gm-Message-State: AOJu0YyKoh0Uod+Duaf4mjdmDANO/48CiIvV1l2asKw29li2mYf7yZ9t sMZhfngcVRCBfJ/NIR1PtSMeWhg1HTzkus4yVtsIb48YrcuOVZxIoY/unu4YGcykeCT4DgUm4nl AsicUncJXh8Pi+rS++xSLFQ== X-Google-Smtp-Source: AGHT+IEsfuiZZhvEJhEk4hpJZ3tcDHr2XUVgWTfEcekqoXuE6gxc30NQGBAMRLukncKNx2Memz3jUMFF4Ph6YCHTNA== X-Received: from ctop-sg.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:1223]) (user=ackerleytng job=sendgmr) by 2002:a05:6902:150d:b0:dc6:cafd:dce5 with SMTP id q13-20020a056902150d00b00dc6cafddce5mr477459ybu.12.1712896945446; Thu, 11 Apr 2024 21:42:25 -0700 (PDT) Date: Fri, 12 Apr 2024 04:42:21 +0000 In-Reply-To: <75fde3c3-17a1-466f-a920-30769730808c@intel.com> (dongsheng.x.zhang@intel.com) Mime-Version: 1.0 Message-ID: Subject: Re: [RFC PATCH v5 08/29] KVM: selftests: TDX: Add TDX lifecycle test From: Ackerley Tng To: dongsheng.x.zhang@intel.com Cc: sagis@google.com, linux-kselftest@vger.kernel.org, afranji@google.com, erdemaktas@google.com, isaku.yamahata@intel.com, seanjc@google.com, pbonzini@redhat.com, shuah@kernel.org, pgonda@google.com, haibo1.xu@intel.com, chao.p.peng@linux.intel.com, vannapurve@google.com, runanwang@google.com, vipinsh@google.com, 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" X-Stat-Signature: r4m479ednzzb6xx8cyc45epb3w3znaam X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 85FA9C0006 X-Rspam-User: X-HE-Tag: 1712896946-455890 X-HE-Meta: U2FsdGVkX1/gcRLNxoonuGn3zTgJV7//hNGDUge26v/x7/MLMy8+v/N8cpNjt+D5c3q9ivTlwx4m8rL4D+vDNsGJ3lZ9TPidMjiw/3X6EKvZrlqeJjm1F+nvCek2tGHosKEyQntBbAqMiNRaYOSqgZkovZhD0a5qWubT/NVet7gBlOZuOJcSPzJvkLmWiJK7bl0KyF5KfD+WOqFzn5qANJO8vttsiBigpxSwRVxnrR1vV7walksWvp1YKr8BxgE75Y2zo0jNy8FcjyEtKu6mc19SB3e/EvY1bs1xzfY08vwJUQXSxS22ecngWjneh33uTxVSrKoTGKvPGeObhJW9mxit8Uiy5Q39iVoCgFADzO8VEu2f7uHebjxlX3qq5zKbYRyb2d8aE8ws6+MmNqiO7MOwYUwL2EBd6wVBin54alMue73YykMtJy4OZlY4x3xZCkdpnnE54J3iWmoZLByho73Uir7pjOWcebK/wUge5fzUYKExaw7q30r4v++y8JIVhvMqHw4KJuPPqQUWoyjvBkIIs059vmt8r2zKchV1kEYeikduq1pV9HUGG/Hw2UYERcmIv0mPYkcQrce75zbQlmAQCF29fK06Yr3Y/bs+2l1IqNCYv1mYpsIWkmkqohfPBsvco9OsrRcU+Y8U09I0Oo6INXsZdpokvuFLpc/bYpqIS2lvH+HeRv2WRAHEfAXXXQGmRrkJ/w1fseUT7tVuAAqb/peOmMc4ZfR4MSRtZTRkvUZZWD7oU62iKjJy1c36D1DjDKJQNBXQ6JBm3aHntuE5yj+XZZwHBfmAzAGksP+vw/H0Pce/guEhvjE59lgZ57gASO0I76JjFL00N/vsiuOwrROqQnuW6ZZKwPXy3JLXCo7lMxa7XYHvBQt2UY50MXZMZt/eXTxOgFlzIfg3XB9KseFN5lljl4kKIwI+LZO4FJtoq/mV1atNkU4zNS3BUBnKMLg13i1JHJUR8F1 SvNlG6Wt KWIWBwjAb/RFl8Z1M5YBZN8lh5yLTpLhZP4poKcBYQpCYpcUN14nsz2GMb8iRjm8SsguHbtHeDAJIBN+UkU1Fiw1lwkg5+YWCOFcRFQCFLyf5qDX8wdf6hSb/s7FiIVa4BABwa0oAtRZaN8a52sFALiS5Du9G8UrVrg+LXQXngQtghE9Dwi74uBd5Vkb6NU1v9x1LYP3hcZcehLs+jYsfhvZTwYC63+6ErCHM29mHg4WMobcef/8OlmTT76c98W9n+DUonoOmUoTkUYpAQreQ7WjbOP31eZdvYtjKeRqAxxPelMZ9EeRB54/oXpbLHWq15YoPaZpvHcL//oaewN6dSjTqa1xxrv1ySZ6z/1ATADQLxuwDFHTOrG71qdsmNK0GHr5oJaJhWlhkcyFFBZymSpSppxff2dHKX+FfNNQEsqJAZtkSYhWXponLvAlg9Cd1iLDf2mJL/muWgQYYDVtksa17o//1BUfiVzn77wSstbzWnmswXGQ4Argj+LzLus+0gSLTdN82du1oSa60KPhCp4/Im5QnYFXEpjPIKd6SSf5F8Fr0VpioCHHCSJjod0wKYbHU/qbBigPLKvGzJxPkdIxSOESI0fNnWuc2n5XCq6s8zWBmrbnFCosPQw== 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: "Zhang, Dongsheng X" writes: > On 12/12/2023 12:46 PM, Sagi Shahar wrote: >> From: Erdem Aktas >> >> Adding a test to verify TDX lifecycle by creating a TD and running a >> dummy TDG.VP.VMCALL inside it. >> >> Signed-off-by: Erdem Aktas >> Signed-off-by: Ryan Afranji >> Signed-off-by: Sagi Shahar >> Co-developed-by: Ackerley Tng >> Signed-off-by: Ackerley Tng >> --- >> tools/testing/selftests/kvm/Makefile | 4 + >> .../selftests/kvm/include/x86_64/tdx/tdcall.h | 35 ++++++++ >> .../selftests/kvm/include/x86_64/tdx/tdx.h | 12 +++ >> .../kvm/include/x86_64/tdx/test_util.h | 52 +++++++++++ >> .../selftests/kvm/lib/x86_64/tdx/tdcall.S | 90 +++++++++++++++++++ >> .../selftests/kvm/lib/x86_64/tdx/tdx.c | 27 ++++++ >> .../selftests/kvm/lib/x86_64/tdx/tdx_util.c | 1 + >> .../selftests/kvm/lib/x86_64/tdx/test_util.c | 34 +++++++ >> .../selftests/kvm/x86_64/tdx_vm_tests.c | 45 ++++++++++ >> 9 files changed, 300 insertions(+) >> create mode 100644 tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h >> create mode 100644 tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h >> create mode 100644 tools/testing/selftests/kvm/include/x86_64/tdx/test_util.h >> create mode 100644 tools/testing/selftests/kvm/lib/x86_64/tdx/tdcall.S >> create mode 100644 tools/testing/selftests/kvm/lib/x86_64/tdx/tdx.c >> create mode 100644 tools/testing/selftests/kvm/lib/x86_64/tdx/test_util.c >> create mode 100644 tools/testing/selftests/kvm/x86_64/tdx_vm_tests.c >> >> diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile >> index a35150ab855f..80d4a50eeb9f 100644 >> --- a/tools/testing/selftests/kvm/Makefile >> +++ b/tools/testing/selftests/kvm/Makefile >> @@ -52,6 +52,9 @@ LIBKVM_x86_64 += lib/x86_64/vmx.c >> LIBKVM_x86_64 += lib/x86_64/sev.c >> LIBKVM_x86_64 += lib/x86_64/tdx/tdx_util.c >> LIBKVM_x86_64 += lib/x86_64/tdx/td_boot.S >> +LIBKVM_x86_64 += lib/x86_64/tdx/tdcall.S >> +LIBKVM_x86_64 += lib/x86_64/tdx/tdx.c >> +LIBKVM_x86_64 += lib/x86_64/tdx/test_util.c >> >> LIBKVM_aarch64 += lib/aarch64/gic.c >> LIBKVM_aarch64 += lib/aarch64/gic_v3.c >> @@ -152,6 +155,7 @@ TEST_GEN_PROGS_x86_64 += set_memory_region_test >> TEST_GEN_PROGS_x86_64 += steal_time >> TEST_GEN_PROGS_x86_64 += kvm_binary_stats_test >> TEST_GEN_PROGS_x86_64 += system_counter_offset_test >> +TEST_GEN_PROGS_x86_64 += x86_64/tdx_vm_tests >> >> # Compiled outputs used by test targets >> TEST_GEN_PROGS_EXTENDED_x86_64 += x86_64/nx_huge_pages_test >> diff --git a/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h b/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h >> new file mode 100644 >> index 000000000000..78001bfec9c8 >> --- /dev/null >> +++ b/tools/testing/selftests/kvm/include/x86_64/tdx/tdcall.h >> @@ -0,0 +1,35 @@ >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> +/* Adapted from arch/x86/include/asm/shared/tdx.h */ >> + >> +#ifndef SELFTESTS_TDX_TDCALL_H >> +#define SELFTESTS_TDX_TDCALL_H >> + >> +#include >> +#include >> + >> +#define TDG_VP_VMCALL_INSTRUCTION_IO_READ 0 >> +#define TDG_VP_VMCALL_INSTRUCTION_IO_WRITE 1 > > Nit: > Probably we can define the following instead in test_util.c? > /* Port I/O direction */ > #define PORT_READ 0 > #define PORT_WRITE 1 > > Then use them in place of TDG_VP_VMCALL_INSTRUCTION_IO_READ/TDG_VP_VMCALL_INSTRUCTION_IO_WRITE? > which are too long > I was actually thinking to align all the macro definitions with the definitions in the Intel GHCI Spec, so 3.9 TDG.VP.VMCALL becomes TDG_VP_VMCALL_INSTRUCTION_IO and then add suffixes READ and WRITE for the directions. PORT_READ and PORT_WRITE seem a little too unspecific, but I agree that TDG_VP_VMCALL_INSTRUCTION_IO_READ/TDG_VP_VMCALL_INSTRUCTION_IO_WRITE are long. >> + >> +#define TDX_HCALL_HAS_OUTPUT BIT(0) >> + >> +#define TDX_HYPERCALL_STANDARD 0 >> + >> +/* >> + * Used in __tdx_hypercall() to pass down and get back registers' values of >> + * the TDCALL instruction when requesting services from the VMM. >> + * >> + * This is a software only structure and not part of the TDX module/VMM ABI. >> + */ >> +struct tdx_hypercall_args { >> + u64 r10; >> + u64 r11; >> + u64 r12; >> + u64 r13; >> + u64 r14; >> + u64 r15; >> +}; >> + >> +/* Used to request services from the VMM */ >> +u64 __tdx_hypercall(struct tdx_hypercall_args *args, unsigned long flags); >> + >> +#endif // SELFTESTS_TDX_TDCALL_H >> diff --git a/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h b/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h >> new file mode 100644 >> index 000000000000..a7161efe4ee2 >> --- /dev/null >> +++ b/tools/testing/selftests/kvm/include/x86_64/tdx/tdx.h >> @@ -0,0 +1,12 @@ >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> +#ifndef SELFTEST_TDX_TDX_H >> +#define SELFTEST_TDX_TDX_H >> + >> +#include >> + >> +#define TDG_VP_VMCALL_INSTRUCTION_IO 30 > > Nit: > arch/x86/include/uapi/asm/vmx.h already exports the following define: > #define EXIT_REASON_IO_INSTRUCTION 30 > > Linux kernel example (arch/x86/coco/tdx/tdx.c): > static bool handle_in(struct pt_regs *regs, int size, int port) > { > struct tdx_module_args args = { > .r10 = TDX_HYPERCALL_STANDARD, > .r11 = hcall_func(EXIT_REASON_IO_INSTRUCTION), > .r12 = size, > .r13 = PORT_READ, > .r14 = port, > }; > > So just like the kernel, here we can also use EXIT_REASON_IO_INSTRUCTION in place of TDG_VP_VMCALL_INSTRUCTION_IO, > just need to do a '#include "vmx.h"' or '#include ' to bring in the define > I think aligning macro definitions with the spec is better in this case. It seems odd to be calling an EXIT_REASON_* when making a hypercall. Later on in this patch series this macro is added #define TDG_VP_VMCALL_VE_REQUEST_MMIO 48 which matches 3.7 TDG.VP.VMCALL<#VE.RequestMMIO> in the Intel GHCI Spec. The equivalent EXIT_REASON is EXIT_REASON_EPT_VIOLATION, which I feel doesn't carry the same meaning as an explicit request for MMIO, as in TDG_VP_VMCALL_VE_REQUEST_MMIO. So I think even though the numbers are the same, they don't carry the same meaning and it's probably better to have different macro definitions. Or we could define one in terms of the other? Later on in this patch series other macros are also added, specific to TDX #define TDG_VP_VMCALL_GET_TD_VM_CALL_INFO 0x10000 #define TDG_VP_VMCALL_MAP_GPA 0x10001 #define TDG_VP_VMCALL_REPORT_FATAL_ERROR 0x10003 which matches 3.1 TDG.VP.VMCALL 3.2 TDG.VP.VMCALL 3.4 TDG.VP.VMCALL in the Intel GHCI Spec. It's nice to have the naming convention for all the VMCALLs line up. :) >> + >> +uint64_t tdg_vp_vmcall_instruction_io(uint64_t port, uint64_t size, >> + uint64_t write, uint64_t *data); >> + >> >> +void verify_td_lifecycle(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_code_lifecycle); >> + td_finalize(vm); >> + >> + printf("Verifying TD lifecycle:\n"); >> + >> + vcpu_run(vcpu); >> + TDX_TEST_ASSERT_SUCCESS(vcpu); >> + >> + kvm_vm_free(vm); >> + printf("\t ... PASSED\n"); >> +} > > Nit: > All the functions used locally inside tdx_vm_tests.c can be declared static: > static void guest_code_lifecycle(void) > static void verify_td_lifecycle(void) > Will fix this, thanks! >> + >> +int main(int argc, char **argv) >> +{ >> + setbuf(stdout, NULL); >> + >> + if (!is_tdx_enabled()) { >> + print_skip("TDX is not supported by the KVM"); >> + exit(KSFT_SKIP); >> + } >> + >> + run_in_new_process(&verify_td_lifecycle); >> + >> + return 0; >> +}