From patchwork Wed Apr 19 22:17:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Atish Kumar Patra X-Patchwork-Id: 13217515 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 93974C6FD18 for ; Wed, 19 Apr 2023 22:19:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 63705900025; Wed, 19 Apr 2023 18:18:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5E818900003; Wed, 19 Apr 2023 18:18:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3EA65900025; Wed, 19 Apr 2023 18:18:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 2DD5A900003 for ; Wed, 19 Apr 2023 18:18:52 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id DF3B640448 for ; Wed, 19 Apr 2023 22:18:51 +0000 (UTC) X-FDA: 80699556462.14.8E2F34E Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) by imf29.hostedemail.com (Postfix) with ESMTP id 0C31D120010 for ; Wed, 19 Apr 2023 22:18:49 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=QfXuULt6; spf=pass (imf29.hostedemail.com: domain of atishp@rivosinc.com designates 209.85.214.178 as permitted sender) smtp.mailfrom=atishp@rivosinc.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1681942730; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=XK5xUw/rzaPgA4jO4a/YwH8Byrp1ajuQRNW8VnU2lnI=; b=agBnKCTIPEiA7ywdDNB76NT9KDfpC57Vp2L2HAsLi+McT3chKlVp4N5kK9ikLBJyrioIy6 0B98miCyUnMZm9p2iT3Xcz/B54/Kh66VlnqHB/IFs/G63oMGWOzbiBeg45Ej2nKuqSF0Aj Pdw0QGx8i7adH8IiiNkfsZBpAgQ63Uk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1681942730; a=rsa-sha256; cv=none; b=TLbni87OiJLZf2F55PIbZLOp5GGWXvtdDyxVkIXW0fdUffX1xIdFrz6O5Rt7cjfuwrAB0l FSicjs5TnjHHZZoUS2tuF2tmkFKWRRbwQknms6qKfH79/pc5s0OW1HfigTUQdFgoBr/ff8 GrSciQ1RfZw6eMpIPqvh6iNlHnOh8+w= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=QfXuULt6; spf=pass (imf29.hostedemail.com: domain of atishp@rivosinc.com designates 209.85.214.178 as permitted sender) smtp.mailfrom=atishp@rivosinc.com; dmarc=none Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1a645fd0c6dso4319845ad.1 for ; Wed, 19 Apr 2023 15:18:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20221208.gappssmtp.com; s=20221208; t=1681942729; x=1684534729; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XK5xUw/rzaPgA4jO4a/YwH8Byrp1ajuQRNW8VnU2lnI=; b=QfXuULt6GKdZ0yIYOBu58cROq1xtd+AwU5tA9tWSYcP8puXwvEN9RX3lXVuV60tyoW 4Q0CSfUoxv6NDjypNOuOT4ywNhU7IYB+qeWNkXwN91wiD9TQD3HOmit1hlHNqFbWVtNJ ziwh+QBq1N6MeIyCvSv5s6RR13cXyHzSqXBQKCnCZR2rrQanp3QhB3VbRYZ2jQSTPE6d Vpg87adIN6SFou4dfOJ3ZLRcLAQq2ZlEUcDyGi0vckdKvSSc1nPlKdGfKGwb9h5rUo3e rLKhVd1kgYj7FOEo7g+ojtFs7lAxzBaXut+YFsbxt/trii3p8w9AEE1pM3je3JF/e5ut 1yXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681942729; x=1684534729; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XK5xUw/rzaPgA4jO4a/YwH8Byrp1ajuQRNW8VnU2lnI=; b=bXjvjrFwLUPzNoMGYhSRzcepLow80GUE/aODusqNTml1ShtuoQTMabP5AxeaNDgFgd FsQe+3JNdrYDe0wcqsJqsbuWZWNHS6Uac/I1KuoGDl9MKCmICNOzJHX+laNnEEFeqHRL RV306EK/y1uEzPwIl4je5Kg00a8mdnhFAuQsFJKkeHlWNE9UAe7vbItU6cPivwEPBoTV ArKWYgFCIwFslpgCNQuk3+UuEdF7hZDcqOyXNyfuNoXzFrW3Tzj4B2tSklAJQu21+XTj nriXlD38NhdDetnt6xc2Q70MMUyp7s3JVV97XNc1EHJjcqlyCYl3Irk0InfcGV7dm4If SWrA== X-Gm-Message-State: AAQBX9emYAMtvUsFXSGU3kBhlXI8jwZdCIkMVyUctFvnQPpRSJ6e/+hd OqakMR9owXr4tPPYVdmAMwR25A== X-Google-Smtp-Source: AKy350baQTNt4Vs4HHjBbXvyObvJ3IXFGZptf7h2H+OASSZVy5+7QV7+crZBWOtRSKw2ldJwBUdMWw== X-Received: by 2002:a17:903:784:b0:1a2:9183:a499 with SMTP id kn4-20020a170903078400b001a29183a499mr5853196plb.34.1681942729515; Wed, 19 Apr 2023 15:18:49 -0700 (PDT) Received: from atishp.ba.rivosinc.com ([66.220.2.162]) by smtp.gmail.com with ESMTPSA id jn11-20020a170903050b00b00196807b5189sm11619190plb.292.2023.04.19.15.18.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Apr 2023 15:18:49 -0700 (PDT) From: Atish Patra To: linux-kernel@vger.kernel.org Cc: Rajnesh Kanwal , Atish Patra , Alexandre Ghiti , Andrew Jones , Andrew Morton , Anup Patel , Atish Patra , =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= , Suzuki K Poulose , Will Deacon , Marc Zyngier , Sean Christopherson , linux-coco@lists.linux.dev, Dylan Reid , abrestic@rivosinc.com, Samuel Ortiz , Christoph Hellwig , Conor Dooley , Greg Kroah-Hartman , Guo Ren , Heiko Stuebner , Jiri Slaby , kvm-riscv@lists.infradead.org, kvm@vger.kernel.org, linux-mm@kvack.org, linux-riscv@lists.infradead.org, Mayuresh Chitale , Palmer Dabbelt , Paolo Bonzini , Paul Walmsley , Uladzislau Rezki Subject: [RFC 36/48] RISC-V: KVM: Read/write gprs from/to shmem in case of TVM VCPU. Date: Wed, 19 Apr 2023 15:17:04 -0700 Message-Id: <20230419221716.3603068-37-atishp@rivosinc.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230419221716.3603068-1-atishp@rivosinc.com> References: <20230419221716.3603068-1-atishp@rivosinc.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 0C31D120010 X-Rspamd-Server: rspam09 X-Stat-Signature: o97yudifz9kc8rfm7msx367hp1jb4skt X-HE-Tag: 1681942729-485760 X-HE-Meta: U2FsdGVkX19m4thV+AECa0NsOa0sS4YmUhaxj1abHDEyhkOCz4eZWRjJePCM6lEVmR2XH/ptKgbcWI8g4bA1F37ccsQnDV6llKMykqE6gncvAe67lpBbU9+1V6oOtOqyEzEr09Nyw8ePMl1hRz5qHaBXQQ+mSn5MBY45OalvjGXFJj9asTHxLe3cQFA1YSUaJb1t1NgdhEIe6GLD6A5XiuGJX/KapQuA30E4716LPMH44sC0OfQKk0CFpoMbSQNBxv9spmZ2/dJec3aANaH4Ld1K8VZHvTBFqAE7o/WKfeXdJJeSvTyynH34mTJ3vVPkAKaIfXnLL5iI7FLeopK8b1yC22yPjvcGjeN6hLr4FSjuj1yEir6VcogCDIJVg3W2iJjFDi6RB5LfFsvBP3updB5PVWEvsupWo+qSnUT7dO+99gS3Wbczquknse+8whEczXD8aFqlMlwiW5OTXMfVQUbR7FlTRDLO8xR/bu8+XT3nIsMp8VWZXUgVpLg1wbxcSXreJa/ZAgDnb7OVf8m73rUN8yZzLuylcvS4JUIWn6+0fFTkCgi3/Y1NZuK0y1bzs92r7g8Kxg3gY78hmH/iYpbpsg7zbzooJcyvTagnss2J95ncEnzx3Y6E+RVj8A2ui/EWo1MDbHn1IcbgoAyuGVGYIuBpIinJwKPBvPUSty1dHkckHQW1/tJSB9LBAwwsH5L/dXUOZCfZ5nQKaF8WczkYg5dh860H9rXOYNXO2/wUgODUTXjdr4t6YXx58Slvn2roUZq5azKIUhNh3wHxoGdTbg92XvlYhfKJ8a+iqsEiRlZdsp1BoB4cqCNi6s3D57daVkY8PlROWJ/niw8aSbSJ3a5RB7d7rhDRVg4EHbLXagST8UoSjFOB1XA1PLYa+3D2vCxlrEUCoAst9yndp8+BNmhmKK6qMpCf0bGU3ZG0akWTVAfkjJrzT6V3QPON2eeLmd4xVAeMhdbLRBH ZervqHZn LShmPNb6idU8n9ZGIXEeunccU8rXFpTVXhIa5+duoFN+zPbPtduj6XX74/tHsQIjAagjgHA1s7Nk8v6JvFCy+ktG0vK1rMbiLkuPmoyEeNa13D1XhnZ1I9sJiqorDeOCCGGb8HY/cEjc3K2P5FxtCXUgofMf9YA+r/pfP1oDezM8JGnj9vVvSckqpqqKKQqi8fUdz5ATxa0KRDrRKFI0ZAP0UQRpUBBcvs29heINI0+vQvEzlT5WYnD8J5nO0dJb+jgX4+L80Q8yK0CLNAvNsr93dvuja/e9CCm6A/IGmRe4gpo0LHVTx2t62phh02KV6a67EGcf21txiS21OADB239mKknatLo9Ph9GzA8/RBP6pqH42lPdS2h3wnouk3nbr6KURcBX5jICHiJk2BxfyT1y75aaxhv7kmNZFPuLD+Ep6knYc+KD94bpdkTCwxlXcsLoTsRmQ7W998cHBqHvKR9CWYA== 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: From: Rajnesh Kanwal For TVM vcpus, TSM uses shared memory to exposes gprs for the trusted VCPU. This change makes sure we use shmem when doing mmio emulation for trusted VMs. Signed-off-by: Rajnesh Kanwal Signed-off-by: Atish Patra --- arch/riscv/kvm/vcpu_insn.c | 98 +++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 13 deletions(-) diff --git a/arch/riscv/kvm/vcpu_insn.c b/arch/riscv/kvm/vcpu_insn.c index 331489f..56eeb86 100644 --- a/arch/riscv/kvm/vcpu_insn.c +++ b/arch/riscv/kvm/vcpu_insn.c @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #define INSN_OPCODE_MASK 0x007c #define INSN_OPCODE_SHIFT 2 @@ -116,6 +119,10 @@ #define REG_OFFSET(insn, pos) \ (SHIFT_RIGHT((insn), (pos) - LOG_REGBYTES) & REG_MASK) +#define REG_INDEX(insn, pos) \ + ((SHIFT_RIGHT((insn), (pos)-LOG_REGBYTES) & REG_MASK) / \ + (__riscv_xlen / 8)) + #define REG_PTR(insn, pos, regs) \ ((ulong *)((ulong)(regs) + REG_OFFSET(insn, pos))) @@ -600,6 +607,7 @@ int kvm_riscv_vcpu_mmio_store(struct kvm_vcpu *vcpu, struct kvm_run *run, int len = 0, insn_len = 0; struct kvm_cpu_trap utrap = { 0 }; struct kvm_cpu_context *ct = &vcpu->arch.guest_context; + void *nshmem; /* Determine trapped instruction */ if (htinst & 0x1) { @@ -627,7 +635,15 @@ int kvm_riscv_vcpu_mmio_store(struct kvm_vcpu *vcpu, struct kvm_run *run, insn_len = INSN_LEN(insn); } - data = GET_RS2(insn, &vcpu->arch.guest_context); + if (is_cove_vcpu(vcpu)) { + nshmem = nacl_shmem(); + data = nacl_shmem_gpr_read_cove(nshmem, + REG_INDEX(insn, SH_RS2) * 8 + + KVM_ARCH_GUEST_ZERO); + } else { + data = GET_RS2(insn, &vcpu->arch.guest_context); + } + data8 = data16 = data32 = data64 = data; if ((insn & INSN_MASK_SW) == INSN_MATCH_SW) { @@ -643,19 +659,43 @@ int kvm_riscv_vcpu_mmio_store(struct kvm_vcpu *vcpu, struct kvm_run *run, #ifdef CONFIG_64BIT } else if ((insn & INSN_MASK_C_SD) == INSN_MATCH_C_SD) { len = 8; - data64 = GET_RS2S(insn, &vcpu->arch.guest_context); + if (is_cove_vcpu(vcpu)) { + data64 = nacl_shmem_gpr_read_cove( + nshmem, + RVC_RS2S(insn) * 8 + KVM_ARCH_GUEST_ZERO); + } else { + data64 = GET_RS2S(insn, &vcpu->arch.guest_context); + } } else if ((insn & INSN_MASK_C_SDSP) == INSN_MATCH_C_SDSP && ((insn >> SH_RD) & 0x1f)) { len = 8; - data64 = GET_RS2C(insn, &vcpu->arch.guest_context); + if (is_cove_vcpu(vcpu)) { + data64 = nacl_shmem_gpr_read_cove( + nshmem, REG_INDEX(insn, SH_RS2C) * 8 + + KVM_ARCH_GUEST_ZERO); + } else { + data64 = GET_RS2C(insn, &vcpu->arch.guest_context); + } #endif } else if ((insn & INSN_MASK_C_SW) == INSN_MATCH_C_SW) { len = 4; - data32 = GET_RS2S(insn, &vcpu->arch.guest_context); + if (is_cove_vcpu(vcpu)) { + data32 = nacl_shmem_gpr_read_cove( + nshmem, + RVC_RS2S(insn) * 8 + KVM_ARCH_GUEST_ZERO); + } else { + data32 = GET_RS2S(insn, &vcpu->arch.guest_context); + } } else if ((insn & INSN_MASK_C_SWSP) == INSN_MATCH_C_SWSP && ((insn >> SH_RD) & 0x1f)) { len = 4; - data32 = GET_RS2C(insn, &vcpu->arch.guest_context); + if (is_cove_vcpu(vcpu)) { + data32 = nacl_shmem_gpr_read_cove( + nshmem, REG_INDEX(insn, SH_RS2C) * 8 + + KVM_ARCH_GUEST_ZERO); + } else { + data32 = GET_RS2C(insn, &vcpu->arch.guest_context); + } } else { return -EOPNOTSUPP; } @@ -725,6 +765,7 @@ int kvm_riscv_vcpu_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) u64 data64; ulong insn; int len, shift; + void *nshmem; if (vcpu->arch.mmio_decode.return_handled) return 0; @@ -738,26 +779,57 @@ int kvm_riscv_vcpu_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) len = vcpu->arch.mmio_decode.len; shift = vcpu->arch.mmio_decode.shift; + if (is_cove_vcpu(vcpu)) + nshmem = nacl_shmem(); + switch (len) { case 1: data8 = *((u8 *)run->mmio.data); - SET_RD(insn, &vcpu->arch.guest_context, - (ulong)data8 << shift >> shift); + if (is_cove_vcpu(vcpu)) { + nacl_shmem_gpr_write_cove(nshmem, + REG_INDEX(insn, SH_RD) * 8 + + KVM_ARCH_GUEST_ZERO, + (unsigned long)data8); + } else { + SET_RD(insn, &vcpu->arch.guest_context, + (ulong)data8 << shift >> shift); + } break; case 2: data16 = *((u16 *)run->mmio.data); - SET_RD(insn, &vcpu->arch.guest_context, - (ulong)data16 << shift >> shift); + if (is_cove_vcpu(vcpu)) { + nacl_shmem_gpr_write_cove(nshmem, + REG_INDEX(insn, SH_RD) * 8 + + KVM_ARCH_GUEST_ZERO, + (unsigned long)data16); + } else { + SET_RD(insn, &vcpu->arch.guest_context, + (ulong)data16 << shift >> shift); + } break; case 4: data32 = *((u32 *)run->mmio.data); - SET_RD(insn, &vcpu->arch.guest_context, - (ulong)data32 << shift >> shift); + if (is_cove_vcpu(vcpu)) { + nacl_shmem_gpr_write_cove(nshmem, + REG_INDEX(insn, SH_RD) * 8 + + KVM_ARCH_GUEST_ZERO, + (unsigned long)data32); + } else { + SET_RD(insn, &vcpu->arch.guest_context, + (ulong)data32 << shift >> shift); + } break; case 8: data64 = *((u64 *)run->mmio.data); - SET_RD(insn, &vcpu->arch.guest_context, - (ulong)data64 << shift >> shift); + if (is_cove_vcpu(vcpu)) { + nacl_shmem_gpr_write_cove(nshmem, + REG_INDEX(insn, SH_RD) * 8 + + KVM_ARCH_GUEST_ZERO, + (unsigned long)data64); + } else { + SET_RD(insn, &vcpu->arch.guest_context, + (ulong)data64 << shift >> shift); + } break; default: return -EOPNOTSUPP;