Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp9683895imu; Wed, 5 Dec 2018 08:38:34 -0800 (PST) X-Google-Smtp-Source: AFSGD/WTH0OcvWJokpi+RygCHEU8XaOPQjvqiO+xncyBhyaxcJ5UKLrHQAPt8QXlYAwH/+MJneJq X-Received: by 2002:a63:c447:: with SMTP id m7mr20982908pgg.27.1544027914090; Wed, 05 Dec 2018 08:38:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544027914; cv=none; d=google.com; s=arc-20160816; b=qZxnT+U4JdyfYxDAUd8iQymBpFVA/wj84QuaRVe84vWFfWNW705g5cyuNT4GgBtS2Q Z1CqWa4VkndUrfPNLezMTIlbnaE3lJfJnFdnzLLGpqmz1emY5utQEy8C2SslUUVlWYC6 W/HrP8lAWoO0WtQgRiQdZO9AIDILTHM07bKbvbLy2bsOl1izgjv0VD4ipH9cNSDXYX/2 YYSbI4U7A0rC4H6eOe+UC8eIPTYN7C7nJjbunGfPHW7at3m00IKMyC7KqWRIBbt1nlnf LdU2x34yrAbJEVB/UpH/xHTqHJlr1l+PVeVRF21shcxbGkh47/QTztEdwmC+dyf7dPDZ 1VPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=8u5q8OTL7OCWgerqQLFtkmzlyWg/HKANq5ea0qR1o+A=; b=H4EBhSF/2oUotaf5n99zWs+y5B8iB9fCsDgEPNhR5GWMZ6yf4m36Awak26gZiNHB3W XcX1mGjMOuUpoQC9VcMND6909HiRRJkDOftYpfhRj2ZgRlgtBxewkEZYK4M07sVLYxRu NUJ+Yq9PHfTPYJry8Pxlc04OtCM4oJhtCGEfZBBkmVmRZMJSj0lN8DprlzqQtYDeejlA 5HkEmcFVMhfPIZloiJKPzs2UGAQKOk78ln5qVxMHwb1cK+cSS/LxSD2jue5aTPRFNZ8I bu6po/dPeYRYQftA9dk0VBkiEK3m/4oDErfh2LGt8qfcBPqqhWoW89ic/nJVDGkUbEW0 mE7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e17si18461993pgj.142.2018.12.05.08.38.18; Wed, 05 Dec 2018 08:38:34 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727564AbeLEQg2 (ORCPT + 99 others); Wed, 5 Dec 2018 11:36:28 -0500 Received: from mga11.intel.com ([192.55.52.93]:23570 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727177AbeLEQg1 (ORCPT ); Wed, 5 Dec 2018 11:36:27 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Dec 2018 08:36:27 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,318,1539673200"; d="scan'208";a="281178447" Received: from sjchrist-coffee.jf.intel.com ([10.54.74.154]) by orsmga005.jf.intel.com with ESMTP; 05 Dec 2018 08:36:27 -0800 From: Sean Christopherson To: Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, Linus Torvalds , Rik van Riel , Yu-cheng Yu , Ingo Molnar Subject: [PATCH] x86/fault: Print "SUPERVISOR" and "READ" when decoding #PF oops Date: Wed, 5 Dec 2018 08:36:24 -0800 Message-Id: <20181205163624.1842-1-sean.j.christopherson@intel.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ...instead of manually handling the case where error_code=0, e.g. to display "[SUPERVISOR] [READ]" instead of "normal kernel read fault". This makes the zero case consistent with all other messages and also provides additional information for other error code combinations, e.g. error_code==1 will display "[PROT] [SUPERVISOR] [READ]" instead of simply "[PROT]". Print unique names for the negative cases as opposed to e.g. "[!USER]" to avoid mixups due to users missing a single "!" character, and to be more concise for the !INSTR && !WRITE case. Print "SUPERVISOR" in favor of "KERNEL" to reduce the likelihood that the message is misinterpreted as a generic kernel/software error and to be consistent with the SDM's nomenclature. An alternative to passing a negated error code to err_str_append() would be to expand err_str_append() to take a second string for the negative test, but that approach complicates handling the "[READ]" case, which looks for !INSTR && !WRITE, e.g. it would require an extra call to err_str_append() and logic in err_str_append() to allow null messages for both the positive and negative tests. Printing "[INSTR] [READ]" wouldn't be the end of the world, but a little bit of trickery in the kernel is a relatively small price to pay in exchange for the ability to unequivocally know the access type by reading a single word. Now that all components of the message use the [] format, explicitly state that it's the error *code* that's being printed and group the err_str_append() calls by type so that the resulting print messages are consistent, e.g. the deciphered codes will always be: [PROT] [USER|SUPERVISOR] [WRITE|INSTR|READ] [RSDV] [PK] Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Dave Hansen Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Rik van Riel Cc: Thomas Gleixner Cc: Yu-cheng Yu Cc: linux-kernel@vger.kernel.org Cc: Ingo Molnar Signed-off-by: Sean Christopherson --- arch/x86/mm/fault.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 2ff25ad33233..0b4ce5d2b461 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -609,7 +609,7 @@ static void show_ldttss(const struct desc_ptr *gdt, const char *name, u16 index) */ static void err_str_append(unsigned long error_code, char *buf, unsigned long mask, const char *txt) { - if (error_code & mask) { + if ((error_code & mask) == mask) { if (buf[0]) strcat(buf, " "); strcat(buf, txt); @@ -655,13 +655,16 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code, unsigned long ad * zero delimiter must fit into err_txt[]. */ err_str_append(error_code, err_txt, X86_PF_PROT, "[PROT]" ); - err_str_append(error_code, err_txt, X86_PF_WRITE, "[WRITE]"); err_str_append(error_code, err_txt, X86_PF_USER, "[USER]" ); - err_str_append(error_code, err_txt, X86_PF_RSVD, "[RSVD]" ); + err_str_append(~error_code, err_txt, X86_PF_USER, "[SUPERVISOR]"); + err_str_append(error_code, err_txt, X86_PF_WRITE, "[WRITE]"); err_str_append(error_code, err_txt, X86_PF_INSTR, "[INSTR]"); + err_str_append(~error_code, err_txt, X86_PF_WRITE | X86_PF_INSTR, + "[READ]"); + err_str_append(error_code, err_txt, X86_PF_RSVD, "[RSVD]" ); err_str_append(error_code, err_txt, X86_PF_PK, "[PK]" ); - pr_alert("#PF error: %s\n", error_code ? err_txt : "[normal kernel read fault]"); + pr_alert("#PF error code: %s\n", err_txt); if (!(error_code & X86_PF_USER) && user_mode(regs)) { struct desc_ptr idt, gdt; -- 2.19.2