From patchwork Wed Oct 19 17:35:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dionna Amalie Glaze X-Patchwork-Id: 5795 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp452853wrs; Wed, 19 Oct 2022 10:40:03 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7+a2/6M2tLfcqHBJHv99205AgTz+BYCEZ0HCj30v7eoMteaoPlrs3faVUvUQfrcua2/uOJ X-Received: by 2002:a17:906:5d04:b0:722:f46c:b891 with SMTP id g4-20020a1709065d0400b00722f46cb891mr7722996ejt.4.1666201192622; Wed, 19 Oct 2022 10:39:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666201192; cv=none; d=google.com; s=arc-20160816; b=PtkCXc9HqLtu6bwnENf+pmgUaY9K1qKedxMVJWcpvv0pTYMo19DPFJo0Inwb9pamv8 UQlK5roIArYO6wmArg+lZpqR/1FodhwJjU+fDzX9uBZzkRbd6/OekRryIB7MVyBNUxU+ oxFRISC7LpKSzaLcs1nxVlh+GEPVF9ltofUwMB9/40/MmrtMiMoEaT09QkcZIeoF0fth mMKuipx9cgsyi7acCnx+luCV4yMhqoEOv0gvR8lUb1zQvXPiHCsrwRQR3rVtDe6kyNSE ikXkDtEbN9ULrXJ+Vz8L5JNXrXpcudjWb112eUtiY16QoPCCexE/PzRsYHfoiTWe64KN j/CA== 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:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=0oEUha9Ig0lUbuggvj/VkuyhzVDYkc+4vZ7LkSZEK1Y=; b=A62E51PNGH4pXabpa6Tm0etV/VMlc4mnDbEt+V3Ud5NUEvaSqTwDuW49g3L7zKK1gc 1XaEQbOGOqpHm1Lzzq0Mei7BApJGuCq38Wgur3E6rWyWxdNT5mIF7DaLA4u0s34FoIBE lExZ1AQjoOcmPK2+wb0BDObDPp3YvFWRD58oXsFVLZLIlcrZ+YKuh2q1qMIUXyEFQJNr TVO3WjUPU2hZcALBkGzR9ygZ3WUW6Hmvxb7ZY/K4SQVjwdLndMkEqcM7kGmFo7jtGmf3 zqhdO0+DZldL8+pivf/Rm903kvwsP8dSrU67hKgV5mjZ12liN9sRpGBYSWmKVpgy7OSW WIOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Opn0BKSu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id sg35-20020a170907a42300b0078234266a78si15269098ejc.894.2022.10.19.10.39.28; Wed, 19 Oct 2022 10:39:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Opn0BKSu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231478AbiJSRhT (ORCPT + 99 others); Wed, 19 Oct 2022 13:37:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231397AbiJSRg5 (ORCPT ); Wed, 19 Oct 2022 13:36:57 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 65184108DCD for ; Wed, 19 Oct 2022 10:36:01 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id q12-20020a170902dacc00b00184ba4faf1cso12353656plx.23 for ; Wed, 19 Oct 2022 10:36:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=0oEUha9Ig0lUbuggvj/VkuyhzVDYkc+4vZ7LkSZEK1Y=; b=Opn0BKSunXq6+cLFdcH+VElXoQhwG3Y/XFfn3ORbnxERBOC82DazlrCoUG61rYDfrH 6Kqxu4I0pvSp/uMXawAxDo4XDhWjjvQiyhrPtuaMue4qRi5Yt6HUlb1qLoTFKh7nM4Ki in76KqD3Fx/9nUUvz9MJ9AG2iQiuF5htfQfblDaeVg+2KvsJJeLwgkyofdyHAuiZ5gyn eVHoY5YJWCQt1oGEgSpIBwLEjN5PnAoe0wmGHqFNla9Sql/tAVo29BCNwL1mgS18ibXH yRRdWOkE6yVV75ugIdZfADVs0Nozdd1G1v8WvRmmZm2rZqaZZJ0DUBblOWM/XaJ/M+Wn uHBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0oEUha9Ig0lUbuggvj/VkuyhzVDYkc+4vZ7LkSZEK1Y=; b=pijPTNA1N5+7mOKL/3HwgxRHUx1LgIYcdr0HU9zBOz4DuIp7wDzeHectph+o7faYDu RAaNtSWsejmp8dL7KgVd8WA4HnXa6nWBR8rfHB2OwWzMSpb1z1xHKOVVZXB9ztwSpdSz UchbwR2o2aLQkb+3tlgQgb0YLvxkyNI71hFL6m7ie6pKHOS8bNg07w1T9jg6hq7wzNX2 8j7EMno7elupdivi4keOQeXE69VRdMkfKh7EtReKvf0l/8sD1ozdNRCd/QhkSh5FiqdQ RnsTWQu8i2+xegp5/qDYWJs+ztR7Ii5RTJGSD+oUaOYIQF8taWhO4a6mSpidaPKlWFax CcMQ== X-Gm-Message-State: ACrzQf26G+n5iWFaC4Eapp3nt+IidpnfQBDx6uNqxp9XPnuiRaj0PpW+ WEXcvMo/Zt28YjwVhZCcYs3OPbokcppNRWc9og== X-Received: from dionnaglaze.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2ee6]) (user=dionnaglaze job=sendgmr) by 2002:a17:903:32c1:b0:185:5398:8c66 with SMTP id i1-20020a17090332c100b0018553988c66mr9642944plr.135.1666200951940; Wed, 19 Oct 2022 10:35:51 -0700 (PDT) Date: Wed, 19 Oct 2022 17:35:36 +0000 In-Reply-To: <20221019173537.1238121-1-dionnaglaze@google.com> Mime-Version: 1.0 References: <20221019173537.1238121-1-dionnaglaze@google.com> X-Mailer: git-send-email 2.38.0.413.g74048e4d9e-goog Message-ID: <20221019173537.1238121-2-dionnaglaze@google.com> Subject: [PATCH v2 1/2] x86/sev: Rename snp_guest_issue_request's fw_err From: Dionna Glaze To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Dionna Glaze , Tom Lendacky , Paolo Bonzini , Joerg Roedel , Peter Gonda , Thomas Gleixner , Dave Hansen X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747138581829426955?= X-GMAIL-MSGID: =?utf-8?q?1747138581829426955?= The GHCB specification declares that the firmware error value for a guest request will be stored in the lower 32 bits of EXIT_INFO_2. The upper 32 bits are for the VMM's own error code. The fw_err argument is thus a misnomer, and callers will need access to all 64 bits. Cc: Tom Lendacky Cc: Paolo Bonzini Cc: Joerg Roedel Cc: Peter Gonda Cc: Thomas Gleixner Cc: Dave Hansen Signed-off-by: Dionna Glaze --- arch/x86/include/asm/sev.h | 4 ++-- arch/x86/kernel/sev.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index ebc271bb6d8e..4312d6be129f 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -196,7 +196,7 @@ void snp_set_memory_private(unsigned long vaddr, unsigned int npages); void snp_set_wakeup_secondary_cpu(void); bool snp_init(struct boot_params *bp); void __init __noreturn snp_abort(void); -int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned long *fw_err); +int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned long *exitinfo2); #else static inline void sev_es_ist_enter(struct pt_regs *regs) { } static inline void sev_es_ist_exit(void) { } @@ -217,7 +217,7 @@ static inline void snp_set_wakeup_secondary_cpu(void) { } static inline bool snp_init(struct boot_params *bp) { return false; } static inline void snp_abort(void) { } static inline int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, - unsigned long *fw_err) + unsigned long *exitinfo2) { return -ENOTTY; } diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index a428c62330d3..a4eca63e8b90 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -2175,7 +2175,7 @@ static int __init init_sev_config(char *str) } __setup("sev=", init_sev_config); -int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned long *fw_err) +int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned long *exitinfo2) { struct ghcb_state state; struct es_em_ctxt ctxt; @@ -2186,7 +2186,7 @@ int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) return -ENODEV; - if (!fw_err) + if (!exitinfo2) return -EINVAL; /* @@ -2218,7 +2218,7 @@ int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned ghcb->save.sw_exit_info_2 == SNP_GUEST_REQ_INVALID_LEN) input->data_npages = ghcb_get_rbx(ghcb); - *fw_err = ghcb->save.sw_exit_info_2; + *exitinfo2 = ghcb->save.sw_exit_info_2; ret = -EIO; } From patchwork Wed Oct 19 17:35:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dionna Amalie Glaze X-Patchwork-Id: 5796 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp453245wrs; Wed, 19 Oct 2022 10:40:59 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5utUS34fUIWVP7RgbQUjAE9irCBld92zaf+Z1XyskRKqYyxenlxqL9NhNLd0SFSxsIvLlW X-Received: by 2002:a05:6402:d58:b0:458:5eca:a2c9 with SMTP id ec24-20020a0564020d5800b004585ecaa2c9mr8730723edb.306.1666201259086; Wed, 19 Oct 2022 10:40:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666201259; cv=none; d=google.com; s=arc-20160816; b=NyLusWVaJ42D5D+CW3t6DmVEeaYQhxc90XMYQqfA5ZJCL+vRBgb5x0Kjd+K3hzCDO+ Rh0QY2y1TbycHnAzPj5x+3iQXdRX8m6aRgT6xZexR/WwyGQuZVgozFtkhG1vnGyuWgF1 QQs6fd5jmDVu0e7L8IYIaVPiwwIRZoGHw3anubwzLrRkpRnk06r73lUqAsI486wmJ2Lx bPQtJY4POSJSIXn8yEZAjAket3OB35oQmlQiN/yI/mGreHN/V1J6oTxNZ8M3XNbmWOGr UmI1b97EkFb+CidSXk+8e/iXsp+SL7Fd0f0Tw2Wjv4kmCA4eU+928nhgSG8JFu5qipHB AaPg== 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:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=tLaLNkKmG/1utgb0WiIE0QyU+j9hCmDIJ227bpIhia4=; b=PMXhltcxfiXI6kkmAIzMFZ6KTD3om2pXyi9+zpijbcapiDEO7nBBE64Ayvo/jY6AMC fQhI1L1rkVqfrZZEFkOHaH2EgPhVK7vg8C+LHsbRPjjBeiaXRS6nc9fORm8YCuiT2a3q XUIvQXG4iuPkE3bv3BMH6lLT1TWwkAMux8nWmYbbPoYKAYSKhHx4dEJSePw3UQA8D6pt s2QYe9qwvC5ZINkeBSyde7OPBQkceGB1dK0pt9adcg0jCw7imUuZzxHX/Qexv+3b79ld BRY9RxKd1Fr7dAnqKBlrhAoGrYp2XkwKjjcStIPvpM2Ebk98JiFc40kYDKkOMsxvSUfz SGBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Ub6rQCcb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z9-20020a1709063a0900b00769d94690fesi13026865eje.326.2022.10.19.10.40.31; Wed, 19 Oct 2022 10:40:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Ub6rQCcb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231518AbiJSRhZ (ORCPT + 99 others); Wed, 19 Oct 2022 13:37:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41224 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230063AbiJSRhJ (ORCPT ); Wed, 19 Oct 2022 13:37:09 -0400 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4B0F5B3B34 for ; Wed, 19 Oct 2022 10:36:04 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id mq15-20020a17090b380f00b0020ad26fa5edso347639pjb.7 for ; Wed, 19 Oct 2022 10:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tLaLNkKmG/1utgb0WiIE0QyU+j9hCmDIJ227bpIhia4=; b=Ub6rQCcbus1BbzkgOJX0EnV7UHoQYyZMJdgk2/L1vp7vX7h755ujNOeYxMN68bGkDi y1NVtx5x4CtEj5THLSpLcHalFRD/G7Iq3t82eqxCTGLJDVOKnvGuCkuzX7Eqmxpafu/H gxS3n42agtbrjiwKHROTFIEMYBuTNPSE6OAMFH7179SqkEMiwLG5CehFkjL9QunjIwng rOjYdW4tyGbbOLXSym6g8XX7GeWnb2g72rG7b/9hGb1SB1tO5RGwXrj74gBEqSQHpeG9 xzLrICMwr6lLX02OOe0ANJCDTVxQeMGdvXuP16a2oPKr2lXN/Jlc19CpQ8vxJUu1nb6e jJQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tLaLNkKmG/1utgb0WiIE0QyU+j9hCmDIJ227bpIhia4=; b=3nr1ZDRhGszqi+ggfAKNGFlg0QDn6YoWsB/+kTD7PNRAWSyt+gGcT/XEdK14QEotDw 3fJemQOUd7VSS0h0hEEM3Giz9xTW8e1yU08NpnTI0SiYAGqWBy5MjgPqQG++CJGlZJm6 0Q2ZTr4SaHV/77DnzFp9ELTYPOF5bIme43tp5vHiDGslsYS8PqrrF8EE0nseQVMuwvlR DvB77zNCCfK8l6Kox/iVKNEW88rLMvlUvOrygfr+QsrsuQDuJ3Puj6wSyDmW4i0r+TPL njN4tW3r76wSEpkEeim1MLun0+tS9zQ4MesH4JK4122KKdTXinodJO8ZSGg7r5WlTkcC BNng== X-Gm-Message-State: ACrzQf1zdikSyG70D8w84lnjRBKzk+viRenk1Fss9aJrob9wqBCRthMs HzV98fZ4kFKLiAJDq4079FawhOMtEF2T56Vfeg== X-Received: from dionnaglaze.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2ee6]) (user=dionnaglaze job=sendgmr) by 2002:a17:902:edc3:b0:172:8ae3:9778 with SMTP id q3-20020a170902edc300b001728ae39778mr9683806plk.72.1666200953483; Wed, 19 Oct 2022 10:35:53 -0700 (PDT) Date: Wed, 19 Oct 2022 17:35:37 +0000 In-Reply-To: <20221019173537.1238121-1-dionnaglaze@google.com> Mime-Version: 1.0 References: <20221019173537.1238121-1-dionnaglaze@google.com> X-Mailer: git-send-email 2.38.0.413.g74048e4d9e-goog Message-ID: <20221019173537.1238121-3-dionnaglaze@google.com> Subject: [PATCH v2 2/2] virt/coco/sev-guest: interpret VMM errors from guest request From: Dionna Glaze To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Dionna Glaze , Tom Lendacky , Paolo Bonzini , Joerg Roedel , Peter Gonda , Thomas Gleixner , Dave Hansen X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747138651774512504?= X-GMAIL-MSGID: =?utf-8?q?1747138651774512504?= The GHCB specification states that the upper 32 bits of exitinfo2 are for the VMM's error codes. The sev-guest ABI has already locked in that the fw_err status of the input will be 64 bits, and that BIT_ULL(32) means that the extended guest request's data buffer was too small, so we have to keep that ABI. This patch deprecates the fw_err field name in the request to exitinfo2. We can still interpret the upper 32 bits of exitinfo2 for the user anyway in case the request gets throttled. That makes the interface more user-friendly. The error code 2 is the next available for VMM errors (upper 32 bits) in the GHCB specification, so we claim it for throttling. Cc: Tom Lendacky Cc: Paolo Bonzini Cc: Joerg Roedel Cc: Peter Gonda Cc: Thomas Gleixner Cc: Dave Hansen Signed-off-by: Dionna Glaze --- drivers/virt/coco/sev-guest/sev-guest.c | 34 +++++++++++++++++-------- include/uapi/linux/sev-guest.h | 16 ++++++++++-- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c index f422f9c58ba7..8bc435cbd7e3 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -303,9 +303,10 @@ static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int version, u8 static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, int msg_ver, u8 type, void *req_buf, size_t req_sz, void *resp_buf, - u32 resp_sz, __u64 *fw_err) + u32 resp_sz, __u64 *exitinfo2) { - unsigned long err; + unsigned long _exitinfo2 = 0; + unsigned int vmm_err; u64 seqno; int rc; @@ -322,9 +323,20 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in return rc; /* Call firmware to process the request */ - rc = snp_issue_guest_request(exit_code, &snp_dev->input, &err); - if (fw_err) - *fw_err = err; + rc = snp_issue_guest_request(exit_code, &snp_dev->input, &_exitinfo2); + if (exitinfo2) + *exitinfo2 = _exitinfo2; + + vmm_err = _exitinfo2 >> SNP_GUEST_VMM_ERR_SHIFT; + /* The host may return EBUSY if the request has been throttled. */ + if (vmm_err == SNP_GUEST_VMM_ERR_BUSY) + return -EAGAIN; + + if (vmm_err && vmm_err != SNP_GUEST_VMM_ERR_INVALID_LEN) { + pr_err("sev-guest: host returned unknown error code: %d\n", + vmm_err); + return -EINVAL; + } if (rc) return rc; @@ -378,7 +390,7 @@ static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_request_io rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg->msg_version, SNP_MSG_REPORT_REQ, &req, sizeof(req), resp->data, - resp_len, &arg->fw_err); + resp_len, &arg->exitinfo2); if (rc) goto e_free; @@ -418,7 +430,7 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg->msg_version, SNP_MSG_KEY_REQ, &req, sizeof(req), buf, resp_len, - &arg->fw_err); + &arg->exitinfo2); if (rc) return rc; @@ -480,10 +492,10 @@ static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_reques snp_dev->input.data_npages = npages; ret = handle_guest_request(snp_dev, SVM_VMGEXIT_EXT_GUEST_REQUEST, arg->msg_version, SNP_MSG_REPORT_REQ, &req.data, - sizeof(req.data), resp->data, resp_len, &arg->fw_err); + sizeof(req.data), resp->data, resp_len, &arg->exitinfo2); /* If certs length is invalid then copy the returned length */ - if (arg->fw_err == SNP_GUEST_REQ_INVALID_LEN) { + if (arg->vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN) { req.certs_len = snp_dev->input.data_npages << PAGE_SHIFT; if (copy_to_user((void __user *)arg->req_data, &req, sizeof(req))) @@ -518,7 +530,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long if (copy_from_user(&input, argp, sizeof(input))) return -EFAULT; - input.fw_err = 0xff; + input.exitinfo2 = 0xff; /* Message version must be non-zero */ if (!input.msg_version) @@ -549,7 +561,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long mutex_unlock(&snp_cmd_mutex); - if (input.fw_err && copy_to_user(argp, &input, sizeof(input))) + if (input.exitinfo2 && copy_to_user(argp, &input, sizeof(input))) return -EFAULT; return ret; diff --git a/include/uapi/linux/sev-guest.h b/include/uapi/linux/sev-guest.h index 256aaeff7e65..974fcff29c6a 100644 --- a/include/uapi/linux/sev-guest.h +++ b/include/uapi/linux/sev-guest.h @@ -52,8 +52,15 @@ struct snp_guest_request_ioctl { __u64 req_data; __u64 resp_data; - /* firmware error code on failure (see psp-sev.h) */ - __u64 fw_err; + /* bits[63:32]: VMM error code, bits[31:0] firmware error code (see psp-sev.h) */ + union { + __u64 exitinfo2; + __u64 fw_err; /* Name deprecated in favor of others */ + struct { + __u32 fw_error; + __u32 vmm_error; + }; + }; }; struct snp_ext_report_req { @@ -77,4 +84,9 @@ struct snp_ext_report_req { /* Get SNP extended report as defined in the GHCB specification version 2. */ #define SNP_GET_EXT_REPORT _IOWR(SNP_GUEST_REQ_IOC_TYPE, 0x2, struct snp_guest_request_ioctl) + +#define SNP_GUEST_VMM_ERR_SHIFT 32 +#define SNP_GUEST_VMM_ERR_INVALID_LEN 1 +#define SNP_GUEST_VMM_ERR_BUSY 2 + #endif /* __UAPI_LINUX_SEV_GUEST_H_ */