Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp68742pxy; Thu, 6 May 2021 20:46:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyV2VvgjM6McdjJ1wT0emeYTYTdiOw/+toq8XCuU6lNRfih24Ou4sHE4PZ08GMWBI0MfgoT X-Received: by 2002:a05:6402:26d1:: with SMTP id x17mr8935476edd.14.1620359168609; Thu, 06 May 2021 20:46:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620359168; cv=none; d=google.com; s=arc-20160816; b=l66DBmwGThvTphNDlLzZrxB5/SgTrLASGjXbBAIly7wN80VoqHOSgx+nLdX7B/x2Cd kwfUbtCk+WqLkJpmDYDYApgOAA8mxVjkcDcyKirf3e0o73fQGp7NsxzfoESGfEAE8WLT 4EYyi/BXDpG4UVv0wnSpnR0sWOV+KffLOUPiV6oVMpWtQhv2Ub6EnE/HANQfHZZh0IHZ PGF3HEJTnKexgPlqCbxI9rNhsM1ZBDKClHkm4Yqt9zS1XMIeRin+oPNvSeC6fQtgezIi bjtUC8lF0Y2Xv0TpFcF815XeKDmtaAxen+Ud4B7nWHdoNzTLNAzWJ3QdZph094QUYVGH vc2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:mime-version:message-id:date :reply-to:dkim-signature; bh=S0EFe95CIa83FH/uR0CK5DeEnOSiVvW2gb1ym2pZaOs=; b=zQ5wQU/mxEV51Qcl74/46f0KBvw1qDivwio4fQQvCn2IbuqmM+/KTs3gGHO4uSBJCe 6an+pQJNnxLCB49oXSlAY3kmdfEG4hZwNKj1DOay2JiQkILfp3Ne2dm1brYojYfFE9/Z pVpIp2kFwaCafc51//HUlbHzO+p4yWu9d8yYx/MzbLxuLmm6WZCmAeYmyB4UpKGGpthn jSxfdfkW5dfNfYf5nN/Je1HwpKhr5mN6HKf1I7emKJji4R45ijNG/UJbkDkgamggwcS+ C51s7yWLYJLvWlHKxGxhjyJqIzizMQvOsnBIhBZJ1+gm3UaExksJlaRmf/oxTF1w2Zge rrag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=YI8500gj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j26si4202152ejv.472.2021.05.06.20.45.43; Thu, 06 May 2021 20:46:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=YI8500gj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231283AbhEFXQr (ORCPT + 99 others); Thu, 6 May 2021 19:16:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51958 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230460AbhEFXQq (ORCPT ); Thu, 6 May 2021 19:16:46 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CE5CDC061574 for ; Thu, 6 May 2021 16:15:46 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id g21-20020ac86f150000b02901c94e794dd7so4551644qtv.7 for ; Thu, 06 May 2021 16:15:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:message-id:mime-version:subject:from:to:cc; bh=S0EFe95CIa83FH/uR0CK5DeEnOSiVvW2gb1ym2pZaOs=; b=YI8500gjXbsMPkTWeUd9d4qkOvRGR55b+Blh1YjsV7bTdx2Uu23DX43NCLrLm8jXNX 8IwQG+Bw3nBl+X9aSivNLLmVZ4aePC8vIMnLBJso7IoGPJHNUHQxR4Fo93zJ6LEqOCOV KjfjSvbBKo/0uxcH+ynv1MPrfLtpVxaY1U7WrYpsym+YZ6nZJNwptq2kobYrsamRb4WH WofcJtCp6Na3+C3ZVcnu8OhoLH0Cv8FYlYU0TO29X6W/mfqDiBXQzoOhHPFWxa0MmrVP D0WIIU3/McDobkN5q+u7omIzNr8cfySOmNoDuo4YsM5NRbUHPxabYK6uR7lVtANCaRcF y97Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:message-id:mime-version:subject :from:to:cc; bh=S0EFe95CIa83FH/uR0CK5DeEnOSiVvW2gb1ym2pZaOs=; b=o/tfg/RigvYpsVK+ObFmc0jFH7FlythVpNCrAwHF5k4t6qFvBZ/8xFUEw/vsB0fkFt tHDSh6o4eBwABB7JkLlMDzBMAafy/VFdgJ+N0beWZ12X0QlKWastFv5CGwqIQuXIwNly PGZ0N1cudKHo+rmXYwvjLtGklFNEhGFuGovJnyLYRAoquPAVhWBPyWDBh65rsBpgqUTL 5Rwa2+USobhXSn2IKTjP8zOAzngvhEtafXXXEN1rtB73wSbyWvaEAFBY7h/K3977TqqG Y3Q+3xygoq+CBTZkz+4vKIFqkA9aZWK/UJLe+5dzFrBwF9KZ3brJBC2wG/bElQ+ZwuYD 4Vew== X-Gm-Message-State: AOAM532SBJ0usgaHHCsaAoAh6Tg2DC/5rpvgJNITiA0aZWCm/wAa8/c/ BRjR+eOXfmV+xRRa0EXHunNn3KAnSx4= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:818d:5ca3:d49c:cfc8]) (user=seanjc job=sendgmr) by 2002:a05:6214:241:: with SMTP id k1mr7031611qvt.29.1620342945773; Thu, 06 May 2021 16:15:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 6 May 2021 16:15:42 -0700 Message-Id: <20210506231542.2331138-1-seanjc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.31.1.607.g51e8a6a459-goog Subject: [PATCH] KVM: SVM: Invert user pointer casting in SEV {en,de}crypt helpers From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Brijesh Singh , Tom Lendacky , Ashish Kalra Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Invert the user pointer params for SEV's helpers for encrypting and decrypting guest memory so that they take a pointer and cast to an unsigned long as necessary, as opposed to doing the opposite. Tagging a non-pointer as __user is confusing and weird since a cast of some form needs to occur to actually access the user data. This also fixes Sparse warnings triggered by directly consuming the unsigned longs, which are "noderef" due to the __user tag. Cc: Brijesh Singh Cc: Tom Lendacky Cc: Ashish Kalra Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/sev.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index a9d8d6aafdb8..bba4544fbaba 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -763,7 +763,7 @@ static int __sev_dbg_decrypt(struct kvm *kvm, unsigned long src_paddr, } static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr, - unsigned long __user dst_uaddr, + void __user *dst_uaddr, unsigned long dst_paddr, int size, int *err) { @@ -787,8 +787,7 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr, if (tpage) { offset = paddr & 15; - if (copy_to_user((void __user *)(uintptr_t)dst_uaddr, - page_address(tpage) + offset, size)) + if (copy_to_user(dst_uaddr, page_address(tpage) + offset, size)) ret = -EFAULT; } @@ -800,9 +799,9 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr, } static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr, - unsigned long __user vaddr, + void __user *vaddr, unsigned long dst_paddr, - unsigned long __user dst_vaddr, + void __user *dst_vaddr, int size, int *error) { struct page *src_tpage = NULL; @@ -810,13 +809,12 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr, int ret, len = size; /* If source buffer is not aligned then use an intermediate buffer */ - if (!IS_ALIGNED(vaddr, 16)) { + if (!IS_ALIGNED((unsigned long)vaddr, 16)) { src_tpage = alloc_page(GFP_KERNEL); if (!src_tpage) return -ENOMEM; - if (copy_from_user(page_address(src_tpage), - (void __user *)(uintptr_t)vaddr, size)) { + if (copy_from_user(page_address(src_tpage), vaddr, size)) { __free_page(src_tpage); return -EFAULT; } @@ -830,7 +828,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr, * - copy the source buffer in an intermediate buffer * - use the intermediate buffer as source buffer */ - if (!IS_ALIGNED(dst_vaddr, 16) || !IS_ALIGNED(size, 16)) { + if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) { int dst_offset; dst_tpage = alloc_page(GFP_KERNEL); @@ -855,7 +853,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr, page_address(src_tpage), size); else { if (copy_from_user(page_address(dst_tpage) + dst_offset, - (void __user *)(uintptr_t)vaddr, size)) { + vaddr, size)) { ret = -EFAULT; goto e_free; } @@ -935,15 +933,15 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) if (dec) ret = __sev_dbg_decrypt_user(kvm, __sme_page_pa(src_p[0]) + s_off, - dst_vaddr, + (void __user *)dst_vaddr, __sme_page_pa(dst_p[0]) + d_off, len, &argp->error); else ret = __sev_dbg_encrypt_user(kvm, __sme_page_pa(src_p[0]) + s_off, - vaddr, + (void __user *)vaddr, __sme_page_pa(dst_p[0]) + d_off, - dst_vaddr, + (void __user *)dst_vaddr, len, &argp->error); sev_unpin_memory(kvm, src_p, n); -- 2.31.1.607.g51e8a6a459-goog