Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp271676imm; Thu, 20 Sep 2018 23:22:32 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZ9sIm57AbeyB56bZCDar9fFOOjw6bEQl6O4MecLJN6jwV9Ly5f7pL+WcG6acV0+K367UsS X-Received: by 2002:a62:6b41:: with SMTP id g62-v6mr9528569pfc.113.1537510952530; Thu, 20 Sep 2018 23:22:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537510952; cv=none; d=google.com; s=arc-20160816; b=W1G5Rn4ywEv/XRqVWNiYd3b0rDoFUFRoYZlcxltUhxtfn9pJ6+ZDsLjvOmeqbbHfQ4 wrmnYyqoQiFb7PxxoFadyYEEoGjlkIPCfUqM9sOEwEzWSuWzueuYI3kp5APC1OcaldzR ivT7cbadD119+glrCQegK0wwGk8bjejl8kvv2+xETtl5b9U2JMPjm2AVlE+Q8j5G6dE8 SU9vZFZKKcK8G+ClWRL8M9VBfkyZzbGutJJ5Pnvb1c/nA0X7dwITyY8dU+i+aTHyCea7 HqDZucrVCSncl2bEXf9pYYEfJlXGVigWTiE70R8VvyWCuMMAwDZRhVnjKF+KWl14ahWD qRJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=jLu+01nYIp4t/P0BtfEZidLdQu4DHWX7H/Njubr9zjk=; b=ZiBliRm4ZzftzE+bFZOcy8vA6u3pTHhi/GH28JSUlHvrlwbq1CbX8YrUzh4WTJUgfS 5h4fTclOq5FR7HpJTEpU+xBiENIbHnHGaXMy+CEl3xjMmzLyXZLVYXC3k0R1QbbgvDo0 ekz5fOAtWVs+m3xQnE//4aeqoYKYDu+RdqOKTQ9WBr5ZTq8jlyvxBUmESosNy0+M4Qjx xVa4Qqn3B8GqpZpFCPc9vj917ZHv+Or2zWTLA8QGST7j9TW8ZaUCk3jXqGEJpPEh6pDJ pB3TESYG9NP4te15xrxu8RCAzbFFVyC00ja4rwgXTCxeE0MNfCri5Maz3bRRwYFJdLHp 2GEQ== 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 f8-v6si27855082pln.5.2018.09.20.23.22.15; Thu, 20 Sep 2018 23:22:32 -0700 (PDT) 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 S2389437AbeIUMIx (ORCPT + 99 others); Fri, 21 Sep 2018 08:08:53 -0400 Received: from mga18.intel.com ([134.134.136.126]:15331 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389205AbeIUMIx (ORCPT ); Fri, 21 Sep 2018 08:08:53 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Sep 2018 23:21:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,283,1534834800"; d="scan'208";a="74799006" Received: from chenyu-desktop.sh.intel.com ([10.239.160.116]) by orsmga007.jf.intel.com with ESMTP; 20 Sep 2018 23:21:25 -0700 From: Chen Yu To: Thomas Gleixner , "Rafael J. Wysocki" Cc: Pavel Machek , Len Brown , Zhimin Gu , Chen Yu , x86@kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "Rafael J. Wysocki" Subject: [PATCH 09/12][v4] x86-32, hibernate: Switch to original page table after resumed Date: Fri, 21 Sep 2018 14:28:11 +0800 Message-Id: <55f1f33f0fe7963bd63eda4e05b19b68ec4a8d3f.1537448058.git.yu.c.chen@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhimin Gu After all the pages are restored to previous address, the page table switches back to current swapper_pg_dir. However the swapper_pg_dir currently in used might not be consistent with previous page table, which might cause issue after resume. Fix this issue by switching to original page table after resume, and the address of the original page table is saved in the hibernation image header. Move the manipulation of restore_cr3 into common code blocks. Cc: "Rafael J. Wysocki" Signed-off-by: Zhimin Gu Acked-by: Pavel Machek Signed-off-by: Chen Yu --- arch/x86/power/hibernate.c | 4 ++-- arch/x86/power/hibernate_asm_32.S | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/arch/x86/power/hibernate.c b/arch/x86/power/hibernate.c index e3409e4a9b6a..4935b8139229 100644 --- a/arch/x86/power/hibernate.c +++ b/arch/x86/power/hibernate.c @@ -160,6 +160,7 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size) #ifdef CONFIG_X86_64 rdr->jump_address = (unsigned long)restore_registers; rdr->jump_address_phys = __pa_symbol(restore_registers); +#endif /* * The restore code fixes up CR3 and CR4 in the following sequence: @@ -179,7 +180,6 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size) * have any of the PCID bits set. */ rdr->cr3 = restore_cr3 & ~CR3_PCID_MASK; -#endif return hibernation_e820_save(rdr->e820_digest); } @@ -201,8 +201,8 @@ int arch_hibernation_header_restore(void *addr) #ifdef CONFIG_X86_64 restore_jump_address = rdr->jump_address; jump_address_phys = rdr->jump_address_phys; - restore_cr3 = rdr->cr3; #endif + restore_cr3 = rdr->cr3; if (hibernation_e820_mismatch(rdr->e820_digest)) { pr_crit("Hibernate inconsistent memory map detected!\n"); diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S index f5103ae96582..6b2b94937113 100644 --- a/arch/x86/power/hibernate_asm_32.S +++ b/arch/x86/power/hibernate_asm_32.S @@ -25,6 +25,10 @@ ENTRY(swsusp_arch_suspend) pushfl popl saved_context_eflags + /* save cr3 */ + movl %cr3, %eax + movl %eax, restore_cr3 + FRAME_BEGIN call swsusp_save FRAME_END @@ -32,6 +36,8 @@ ENTRY(swsusp_arch_suspend) ENDPROC(swsusp_arch_suspend) ENTRY(restore_image) + movl restore_cr3, %ebp + movl mmu_cr4_features, %ecx movl temp_pgt, %eax movl %eax, %cr3 @@ -66,9 +72,7 @@ done: .align PAGE_SIZE ENTRY(restore_registers) /* go back to the original page tables */ - movl $swapper_pg_dir, %eax - subl $__PAGE_OFFSET, %eax - movl %eax, %cr3 + movl %ebp, %cr3 movl mmu_cr4_features, %ecx jecxz 1f # cr4 Pentium and higher, skip if zero movl %ecx, %cr4; # turn PGE back on -- 2.17.1