mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 08:28:13 +00:00
65fddcfca8
The replacement of <asm/pgrable.h> with <linux/pgtable.h> made the include of the latter in the middle of asm includes. Fix this up with the aid of the below script and manual adjustments here and there. import sys import re if len(sys.argv) is not 3: print "USAGE: %s <file> <header>" % (sys.argv[0]) sys.exit(1) hdr_to_move="#include <linux/%s>" % sys.argv[2] moved = False in_hdrs = False with open(sys.argv[1], "r") as f: lines = f.readlines() for _line in lines: line = _line.rstrip(' ') if line == hdr_to_move: continue if line.startswith("#include <linux/"): in_hdrs = True elif not moved and in_hdrs: moved = True print hdr_to_move print line Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Cain <bcain@codeaurora.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chris Zankel <chris@zankel.net> Cc: "David S. Miller" <davem@davemloft.net> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Greentime Hu <green.hu@gmail.com> Cc: Greg Ungerer <gerg@linux-m68k.org> Cc: Guan Xuetao <gxt@pku.edu.cn> Cc: Guo Ren <guoren@kernel.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Helge Deller <deller@gmx.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Ley Foon Tan <ley.foon.tan@intel.com> Cc: Mark Salter <msalter@redhat.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Matt Turner <mattst88@gmail.com> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Simek <monstr@monstr.eu> Cc: Nick Hu <nickhu@andestech.com> Cc: Paul Walmsley <paul.walmsley@sifive.com> Cc: Richard Weinberger <richard@nod.at> Cc: Rich Felker <dalias@libc.org> Cc: Russell King <linux@armlinux.org.uk> Cc: Stafford Horne <shorne@gmail.com> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tony Luck <tony.luck@intel.com> Cc: Vincent Chen <deanbo422@gmail.com> Cc: Vineet Gupta <vgupta@synopsys.com> Cc: Will Deacon <will@kernel.org> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Link: http://lkml.kernel.org/r/20200514170327.31389-4-rppt@kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
160 lines
4.5 KiB
C
160 lines
4.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* sleep.c - x86-specific ACPI sleep support.
|
|
*
|
|
* Copyright (C) 2001-2003 Patrick Mochel
|
|
* Copyright (C) 2001-2003 Pavel Machek <pavel@ucw.cz>
|
|
*/
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/memblock.h>
|
|
#include <linux/dmi.h>
|
|
#include <linux/cpumask.h>
|
|
#include <linux/pgtable.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/desc.h>
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/realmode.h>
|
|
|
|
#include <linux/ftrace.h>
|
|
#include "../../realmode/rm/wakeup.h"
|
|
#include "sleep.h"
|
|
|
|
unsigned long acpi_realmode_flags;
|
|
|
|
#if defined(CONFIG_SMP) && defined(CONFIG_64BIT)
|
|
static char temp_stack[4096];
|
|
#endif
|
|
|
|
/**
|
|
* acpi_get_wakeup_address - provide physical address for S3 wakeup
|
|
*
|
|
* Returns the physical address where the kernel should be resumed after the
|
|
* system awakes from S3, e.g. for programming into the firmware waking vector.
|
|
*/
|
|
unsigned long acpi_get_wakeup_address(void)
|
|
{
|
|
return ((unsigned long)(real_mode_header->wakeup_start));
|
|
}
|
|
|
|
/**
|
|
* x86_acpi_enter_sleep_state - enter sleep state
|
|
* @state: Sleep state to enter.
|
|
*
|
|
* Wrapper around acpi_enter_sleep_state() to be called by assmebly.
|
|
*/
|
|
asmlinkage acpi_status __visible x86_acpi_enter_sleep_state(u8 state)
|
|
{
|
|
return acpi_enter_sleep_state(state);
|
|
}
|
|
|
|
/**
|
|
* x86_acpi_suspend_lowlevel - save kernel state
|
|
*
|
|
* Create an identity mapped page table and copy the wakeup routine to
|
|
* low memory.
|
|
*/
|
|
int x86_acpi_suspend_lowlevel(void)
|
|
{
|
|
struct wakeup_header *header =
|
|
(struct wakeup_header *) __va(real_mode_header->wakeup_header);
|
|
|
|
if (header->signature != WAKEUP_HEADER_SIGNATURE) {
|
|
printk(KERN_ERR "wakeup header does not match\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
header->video_mode = saved_video_mode;
|
|
|
|
header->pmode_behavior = 0;
|
|
|
|
#ifndef CONFIG_64BIT
|
|
native_store_gdt((struct desc_ptr *)&header->pmode_gdt);
|
|
|
|
/*
|
|
* We have to check that we can write back the value, and not
|
|
* just read it. At least on 90 nm Pentium M (Family 6, Model
|
|
* 13), reading an invalid MSR is not guaranteed to trap, see
|
|
* Erratum X4 in "Intel Pentium M Processor on 90 nm Process
|
|
* with 2-MB L2 Cache and Intel® Processor A100 and A110 on 90
|
|
* nm process with 512-KB L2 Cache Specification Update".
|
|
*/
|
|
if (!rdmsr_safe(MSR_EFER,
|
|
&header->pmode_efer_low,
|
|
&header->pmode_efer_high) &&
|
|
!wrmsr_safe(MSR_EFER,
|
|
header->pmode_efer_low,
|
|
header->pmode_efer_high))
|
|
header->pmode_behavior |= (1 << WAKEUP_BEHAVIOR_RESTORE_EFER);
|
|
#endif /* !CONFIG_64BIT */
|
|
|
|
header->pmode_cr0 = read_cr0();
|
|
if (__this_cpu_read(cpu_info.cpuid_level) >= 0) {
|
|
header->pmode_cr4 = __read_cr4();
|
|
header->pmode_behavior |= (1 << WAKEUP_BEHAVIOR_RESTORE_CR4);
|
|
}
|
|
if (!rdmsr_safe(MSR_IA32_MISC_ENABLE,
|
|
&header->pmode_misc_en_low,
|
|
&header->pmode_misc_en_high) &&
|
|
!wrmsr_safe(MSR_IA32_MISC_ENABLE,
|
|
header->pmode_misc_en_low,
|
|
header->pmode_misc_en_high))
|
|
header->pmode_behavior |=
|
|
(1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE);
|
|
header->realmode_flags = acpi_realmode_flags;
|
|
header->real_magic = 0x12345678;
|
|
|
|
#ifndef CONFIG_64BIT
|
|
header->pmode_entry = (u32)&wakeup_pmode_return;
|
|
header->pmode_cr3 = (u32)__pa_symbol(initial_page_table);
|
|
saved_magic = 0x12345678;
|
|
#else /* CONFIG_64BIT */
|
|
#ifdef CONFIG_SMP
|
|
initial_stack = (unsigned long)temp_stack + sizeof(temp_stack);
|
|
early_gdt_descr.address =
|
|
(unsigned long)get_cpu_gdt_rw(smp_processor_id());
|
|
initial_gs = per_cpu_offset(smp_processor_id());
|
|
#endif
|
|
initial_code = (unsigned long)wakeup_long64;
|
|
saved_magic = 0x123456789abcdef0L;
|
|
#endif /* CONFIG_64BIT */
|
|
|
|
/*
|
|
* Pause/unpause graph tracing around do_suspend_lowlevel as it has
|
|
* inconsistent call/return info after it jumps to the wakeup vector.
|
|
*/
|
|
pause_graph_tracing();
|
|
do_suspend_lowlevel();
|
|
unpause_graph_tracing();
|
|
return 0;
|
|
}
|
|
|
|
static int __init acpi_sleep_setup(char *str)
|
|
{
|
|
while ((str != NULL) && (*str != '\0')) {
|
|
if (strncmp(str, "s3_bios", 7) == 0)
|
|
acpi_realmode_flags |= 1;
|
|
if (strncmp(str, "s3_mode", 7) == 0)
|
|
acpi_realmode_flags |= 2;
|
|
if (strncmp(str, "s3_beep", 7) == 0)
|
|
acpi_realmode_flags |= 4;
|
|
#ifdef CONFIG_HIBERNATION
|
|
if (strncmp(str, "s4_nohwsig", 10) == 0)
|
|
acpi_no_s4_hw_signature();
|
|
#endif
|
|
if (strncmp(str, "nonvs", 5) == 0)
|
|
acpi_nvs_nosave();
|
|
if (strncmp(str, "nonvs_s3", 8) == 0)
|
|
acpi_nvs_nosave_s3();
|
|
if (strncmp(str, "old_ordering", 12) == 0)
|
|
acpi_old_suspend_ordering();
|
|
if (strncmp(str, "nobl", 4) == 0)
|
|
acpi_sleep_no_blacklist();
|
|
str = strchr(str, ',');
|
|
if (str != NULL)
|
|
str += strspn(str, ", \t");
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
__setup("acpi_sleep=", acpi_sleep_setup);
|