Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1726143ybh; Mon, 20 Jul 2020 05:52:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXwO7/kh5/BB/PScebHT+z4uCaAw6gNw9j9n6SFb4jgWLOmvMzzZQS3dPDn2fc+SHRd3Y/ X-Received: by 2002:a05:6402:203c:: with SMTP id ay28mr21880253edb.271.1595249526113; Mon, 20 Jul 2020 05:52:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595249526; cv=none; d=google.com; s=arc-20160816; b=JvROP9xwwv2/iceNNg3W5F3BsOJdMGGuCSgrGDsOlqWcULAF7y5SbPeVXXV4J+Lr8h xjJydZ4eJQnveN44gaTGYEr2yGCfKcPW+tyzs6GJoCyXIVcRE6je5B2NqTYqlPj7tTpL y3FqFWXH4FY4WUNzbqrR5s0HbuMRTQzPs7s8IsnfKF3ue1QDuQgtvwp5wNqt6Bu5iOxi Kvy6xzvbkKI2SzxrzK6NpwDIj1mzAqcGc+juHwms+sBlgigXmsp0M14yziiNYOMI/t7Z leKA2ZmaIsTxPt3ks13JaoXAFaK6bu0YU9l6cnM5co7LahATOI46HSefCImpm5uGqnYO Zo1A== 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 :user-agent:message-id:date:cc:to:from:subject; bh=WQzSjw4MLuqsP1xjWVfOjBek/5gojbgXMKGspXP58xg=; b=f89kzrnimCjy+1yhLCQMdyZ9Bd1saaAxxnaaAMA3ZTQHbTC4tbcHn+0zUJTWz+7t6B D9/+8FAtgWDECxJWFL3EP0Acl4qse5ZtbJUEv4EpQe6vlR+oZsfAvz8Yk2t0Vy1+MDM6 n9UPoNs9dL2FPFShGNkgfGbTng4S4D+Sy49bu+URC7QlIO53a9JDDevdyI8HFNuWgbQu 8bXlu0nwk5Mx2UA3tz38WWLxYz4wUInEdOqg7AYVTnCNkKWLERgdUzg8LBuC0E5iwlUE 7zPXq9m8vCDKYLd1DjFVu8HsjLcYx3tr42VkNo25kaNCdXC5rA66gEfGub1rVdIgLN2Q Auxw== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id by12si10398015edb.99.2020.07.20.05.51.43; Mon, 20 Jul 2020 05:52:06 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729405AbgGTMt7 (ORCPT + 99 others); Mon, 20 Jul 2020 08:49:59 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:60030 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729391AbgGTMt5 (ORCPT ); Mon, 20 Jul 2020 08:49:57 -0400 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 06KCYhqA103217; Mon, 20 Jul 2020 08:49:44 -0400 Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 32bw903jmw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Jul 2020 08:49:44 -0400 Received: from m0098420.ppops.net (m0098420.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 06KChKM5133823; Mon, 20 Jul 2020 08:49:43 -0400 Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0b-001b2d01.pphosted.com with ESMTP id 32bw903jkr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Jul 2020 08:49:43 -0400 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 06KCeeQI029943; Mon, 20 Jul 2020 12:49:41 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma04ams.nl.ibm.com with ESMTP id 32brq82ntj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Jul 2020 12:49:41 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 06KCncjK16187444 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jul 2020 12:49:38 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9F28F4C040; Mon, 20 Jul 2020 12:49:38 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4A8774C046; Mon, 20 Jul 2020 12:49:35 +0000 (GMT) Received: from hbathini.in.ibm.com (unknown [9.85.112.199]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jul 2020 12:49:35 +0000 (GMT) Subject: [PATCH v4 00/12] ppc64: enable kdump support for kexec_file_load syscall From: Hari Bathini To: Michael Ellerman , Andrew Morton Cc: Pingfan Liu , Kexec-ml , Mimi Zohar , Nayna Jain , Petr Tesarik , Mahesh J Salgaonkar , Sourabh Jain , lkml , linuxppc-dev , Eric Biederman , Thiago Jung Bauermann , Dave Young , Vivek Goyal Date: Mon, 20 Jul 2020 18:19:34 +0530 Message-ID: <159524918900.20855.17709718993097359220.stgit@hbathini.in.ibm.com> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.235,18.0.687 definitions=2020-07-20_07:2020-07-20,2020-07-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 spamscore=0 impostorscore=0 malwarescore=0 adultscore=0 phishscore=0 mlxscore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2006250000 definitions=main-2007200086 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch series enables kdump support for kexec_file_load system call (kexec -s -p) on PPC64. The changes are inspired from kexec-tools code but heavily modified for kernel consumption. The first patch adds a weak arch_kexec_locate_mem_hole() function to override locate memory hole logic suiting arch needs. There are some special regions in ppc64 which should be avoided while loading buffer & there are multiple callers to kexec_add_buffer making it complicated to maintain range sanity and using generic lookup at the same time. The second patch marks ppc64 specific code within arch/powerpc/kexec and arch/powerpc/purgatory to make the subsequent code changes easy to understand. The next patch adds helper function to setup different memory ranges needed for loading kdump kernel, booting into it and exporting the crashing kernel's elfcore. The fourth patch overrides arch_kexec_locate_mem_hole() function to locate memory hole for kdump segments by accounting for the special memory regions, referred to as excluded memory ranges, and sets kbuf->mem when a suitable memory region is found. The fifth patch moves walk_drmem_lmbs() out of .init section with a few changes to reuse it for setting up kdump kernel's usable memory ranges. The next patch uses walk_drmem_lmbs() to look up the LMBs and set linux,drconf-usable-memory & linux,usable-memory properties in order to restrict kdump kernel's memory usage. The seventh patch adds relocation support for the purgatory. Patch 8 helps setup the stack for the purgatory. The next patch setups up backup region as a segment while loading kdump kernel and teaches purgatory to copy it from source to destination. Patch 10 builds the elfcore header for the running kernel & passes the info to kdump kernel via "elfcorehdr=" parameter to export as /proc/vmcore file. The next patch sets up the memory reserve map for the kexec kernel and also claims kdump support for kdump as all the necessary changes are added. The last patch fixes a lookup issue for `kexec -l -s` case when memory is reserved for crashkernel. There is scope to improve purgatory to print messages, verify sha256, move code common across archs - like arch_kexec_apply_relocations_add and sha256 digest verification, build purgatory as position independent code & other Makefile improvements in purgatory which can be dealt with in a separate patch series as a follow-up. Tested the changes successfully on P8, P9 lpars, couple of OpenPOWER boxes, one with secureboot enabled and a simulator. v3 -> v4: * Updated get_node_path() to be an iterative function instead of a recursive one. * Added comment explaining why low memory is added to kdump kernel's usable memory ranges though it doesn't fall in crashkernel region. * Fixed stack_buf to be quadword aligned in accordance with ABI. * Added missing of_node_put() in setup_purgatory_ppc64(). * Added a FIXME tag to indicate issue in adding opal/rtas regions to core image. v2 -> v3: * Fixed TOC pointer calculation for purgatory by using section info that has relocations applied. * Fixed arch_kexec_locate_mem_hole() function to fallback to generic kexec_locate_mem_hole() lookup if exclude ranges list is empty. * Dropped check for backup_start in trampoline_64.S as purgatory() function takes care of it anyway. v1 -> v2: * Introduced arch_kexec_locate_mem_hole() for override and dropped weak arch_kexec_add_buffer(). * Addressed warnings reported by lkp. * Added patch to address kexec load issue when memory is reserved for crashkernel. * Used the appropriate license header for the new files added. * Added an option to merge ranges to minimize reallocations while adding memory ranges. * Dropped within_crashkernel parameter for add_opal_mem_range() & add_rtas_mem_range() functions as it is not really needed. --- Hari Bathini (12): kexec_file: allow archs to handle special regions while locating memory hole powerpc/kexec_file: mark PPC64 specific code powerpc/kexec_file: add helper functions for getting memory ranges ppc64/kexec_file: avoid stomping memory used by special regions powerpc/drmem: make lmb walk a bit more flexible ppc64/kexec_file: restrict memory usage of kdump kernel ppc64/kexec_file: add support to relocate purgatory ppc64/kexec_file: setup the stack for purgatory ppc64/kexec_file: setup backup region for kdump kernel ppc64/kexec_file: prepare elfcore header for crashing kernel ppc64/kexec_file: add appropriate regions for memory reserve map ppc64/kexec_file: fix kexec load failure with lack of memory hole arch/powerpc/include/asm/crashdump-ppc64.h | 10 arch/powerpc/include/asm/drmem.h | 9 arch/powerpc/include/asm/kexec.h | 33 + arch/powerpc/include/asm/kexec_ranges.h | 25 arch/powerpc/include/asm/purgatory.h | 11 arch/powerpc/kernel/prom.c | 13 arch/powerpc/kexec/Makefile | 2 arch/powerpc/kexec/elf_64.c | 36 + arch/powerpc/kexec/file_load.c | 60 + arch/powerpc/kexec/file_load_64.c | 1554 ++++++++++++++++++++++++++++ arch/powerpc/kexec/ranges.c | 410 +++++++ arch/powerpc/mm/drmem.c | 87 +- arch/powerpc/mm/numa.c | 13 arch/powerpc/purgatory/Makefile | 28 - arch/powerpc/purgatory/purgatory_64.c | 36 + arch/powerpc/purgatory/trampoline.S | 117 -- arch/powerpc/purgatory/trampoline_64.S | 170 +++ include/linux/kexec.h | 29 - kernel/kexec_file.c | 16 19 files changed, 2464 insertions(+), 195 deletions(-) create mode 100644 arch/powerpc/include/asm/crashdump-ppc64.h create mode 100644 arch/powerpc/include/asm/kexec_ranges.h create mode 100644 arch/powerpc/include/asm/purgatory.h create mode 100644 arch/powerpc/kexec/file_load_64.c create mode 100644 arch/powerpc/kexec/ranges.c create mode 100644 arch/powerpc/purgatory/purgatory_64.c delete mode 100644 arch/powerpc/purgatory/trampoline.S create mode 100644 arch/powerpc/purgatory/trampoline_64.S