Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp137931pxk; Wed, 9 Sep 2020 00:54:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyCYO3xBWDiO3e8PlbonpvgVIwc0LpLYghhptCsrqpiPNtlxuoDhkY0ngshiDgWr+UWlhKJ X-Received: by 2002:aa7:d296:: with SMTP id w22mr2820289edq.327.1599638077412; Wed, 09 Sep 2020 00:54:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599638077; cv=none; d=google.com; s=arc-20160816; b=zs1Iu/ikm01I0f2HOByJXM89PdEvTMXNj+H+0TO63vfZwDJPBLcCniBFqlGKX5mS2i yvu96emjwep9rlD68Tp8KQSxiF2WBMSZJXHFG6rKmhaU1WrnsstpfsBDdGLmTl7ax0f8 zsUn2F5U6ak/JAx4B7HjC2HLb82oZoEbBa0NJkYhSPNTiXCizjPbgiS9nZuph/n+PNdr H/3Hhh3XfZn2B0nUYVhSYtM13iQ0b1Z2dZXT9SqqrE8XyD7bZuVgfSGcMXuvZEv4BZ1b feLHHa7n2JuOg87HVU7WaQFU6nZpE3oKl04m2am39Gpt+nA88vcUr0OqYO/K+TS4WCum szvg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=oFGgC/FDoYZhSU8b4Uab79sGJ0NrKz3NI9qlx3SDNNs=; b=uR5mOaJyrE2HNGFp0MR5LeRGWO5uG18XLjpgJ7Uoo90OVEb70bNpTVFz4XRmmhIcqK 0ZVlHwESB8wRfNoMH6MolFcsLb5t/6Y11qVhFEaR9h1k7aNwD7Y3R4sW+Qw/oydCXLCV RtkqgqoBQ0See4xQ198tVQrCQrMEZ747FBwrnMfaGloFTs3ErGV703cQ+rWSSZ8NFT+B DUaH+62uNp5h78KqcP7DwzUaCi2ewqRxpAulJXXq6BPJrY5Jq1lFjTlLEb50nZoB8i3k WuxNr5+vBFXcJ3/h6c/Og/gSHMthDweZrWTYGq5/RfF8SoOW0pzLqTBGflRFetw1K0Vc Sisg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=bhw69oSv; 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=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f25si1021993ejh.697.2020.09.09.00.54.14; Wed, 09 Sep 2020 00:54:37 -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=@redhat.com header.s=mimecast20190719 header.b=bhw69oSv; 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=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730131AbgIIHu5 (ORCPT + 99 others); Wed, 9 Sep 2020 03:50:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:31061 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725959AbgIIHux (ORCPT ); Wed, 9 Sep 2020 03:50:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1599637851; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oFGgC/FDoYZhSU8b4Uab79sGJ0NrKz3NI9qlx3SDNNs=; b=bhw69oSvjvAzYVaeLkvmqsOuNcwRrBy7szDS/lK1NA08QkHyTeSOX6ySq41J2I/F1ybxOw NSXficLxbrYtYtuWuVII5x8mccX23JwfFNAkQP+wiiV/5nu6yBbMZsaUQu696UtLTqNcBL OUoPDbNLvtS+geE3K+fS3AoHGfhqALc= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-176-PFolikKPMSOFIyJSvQOpIQ-1; Wed, 09 Sep 2020 03:50:50 -0400 X-MC-Unique: PFolikKPMSOFIyJSvQOpIQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 04D48802B6C; Wed, 9 Sep 2020 07:50:49 +0000 (UTC) Received: from kasong-rh-laptop.redhat.com (ovpn-12-29.pek2.redhat.com [10.72.12.29]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7717F100238C; Wed, 9 Sep 2020 07:50:45 +0000 (UTC) From: Kairui Song To: linux-kernel@vger.kernel.org Cc: Dave Young , Baoquan He , Vivek Goyal , Alexey Dobriyan , Eric Biederman , Thomas Gleixner , Ingo Molnar , Borislav Petkov , kexec@lists.infradead.org, Kairui Song Subject: [RFC PATCH 3/3] x86_64: implement copy_to_oldmem_page Date: Wed, 9 Sep 2020 15:50:16 +0800 Message-Id: <20200909075016.104407-4-kasong@redhat.com> In-Reply-To: <20200909075016.104407-1-kasong@redhat.com> References: <20200909075016.104407-1-kasong@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Previous commit introduced writing support for vmcore, it requires per-architecture implementation for the writing function. Signed-off-by: Kairui Song --- arch/x86/kernel/crash_dump_64.c | 49 +++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/arch/x86/kernel/crash_dump_64.c b/arch/x86/kernel/crash_dump_64.c index 045e82e8945b..ec80da75b287 100644 --- a/arch/x86/kernel/crash_dump_64.c +++ b/arch/x86/kernel/crash_dump_64.c @@ -13,7 +13,7 @@ static ssize_t __copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, unsigned long offset, int userbuf, - bool encrypted) + bool encrypted, bool is_write) { void *vaddr; @@ -28,13 +28,25 @@ static ssize_t __copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, if (!vaddr) return -ENOMEM; - if (userbuf) { - if (copy_to_user((void __user *)buf, vaddr + offset, csize)) { - iounmap((void __iomem *)vaddr); - return -EFAULT; + if (is_write) { + if (userbuf) { + if (copy_from_user(vaddr + offset, (void __user *)buf, csize)) { + iounmap((void __iomem *)vaddr); + return -EFAULT; + } + } else { + memcpy(vaddr + offset, buf, csize); } - } else - memcpy(buf, vaddr + offset, csize); + } else { + if (userbuf) { + if (copy_to_user((void __user *)buf, vaddr + offset, csize)) { + iounmap((void __iomem *)vaddr); + return -EFAULT; + } + } else { + memcpy(buf, vaddr + offset, csize); + } + } set_iounmap_nonlazy(); iounmap((void __iomem *)vaddr); @@ -57,7 +69,7 @@ static ssize_t __copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, unsigned long offset, int userbuf) { - return __copy_oldmem_page(pfn, buf, csize, offset, userbuf, false); + return __copy_oldmem_page(pfn, buf, csize, offset, userbuf, false, false); } /** @@ -68,7 +80,26 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, ssize_t copy_oldmem_page_encrypted(unsigned long pfn, char *buf, size_t csize, unsigned long offset, int userbuf) { - return __copy_oldmem_page(pfn, buf, csize, offset, userbuf, true); + return __copy_oldmem_page(pfn, buf, csize, offset, userbuf, true, false); +} + +/** + * copy_to_oldmem_page - similar to copy_oldmem_page but in opposite direction. + */ +ssize_t copy_to_oldmem_page(unsigned long pfn, char *src, size_t csize, + unsigned long offset, int userbuf) +{ + return __copy_oldmem_page(pfn, src, csize, offset, userbuf, false, true); +} + +/** + * copy_to_oldmem_page_encrypted - similar to copy_oldmem_page_encrypted but + * in opposite direction. + */ +ssize_t copy_to_oldmem_page_encrypted(unsigned long pfn, char *src, size_t csize, + unsigned long offset, int userbuf) +{ + return __copy_oldmem_page(pfn, src, csize, offset, userbuf, true, true); } ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos) -- 2.26.2