Release 4.14 arch/x86/kernel/acpi/sleep.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/bootmem.h>
#include <linux/memblock.h>
#include <linux/dmi.h>
#include <linux/cpumask.h>
#include <asm/segment.h>
#include <asm/desc.h>
#include <asm/pgtable.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
/**
* x86_acpi_enter_sleep_state - enter sleep state
* @state: Sleep state to enter.
*
* Wrapper around acpi_enter_sleep_state() to be called by assmebly.
*/
acpi_status asmlinkage __visible x86_acpi_enter_sleep_state(u8 state)
{
return acpi_enter_sleep_state(state);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Lv Zheng | 15 | 93.75% | 1 | 50.00% |
Andi Kleen | 1 | 6.25% | 1 | 50.00% |
Total | 16 | 100.00% | 2 | 100.00% |
/**
* 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;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Pavel Machek | 130 | 42.07% | 1 | 4.00% |
H. Peter Anvin | 73 | 23.62% | 5 | 20.00% |
Kees Cook | 32 | 10.36% | 1 | 4.00% |
Rafael J. Wysocki | 16 | 5.18% | 2 | 8.00% |
Andi Kleen | 16 | 5.18% | 1 | 4.00% |
Jarkko Sakkinen | 8 | 2.59% | 2 | 8.00% |
Tejun Heo | 8 | 2.59% | 2 | 8.00% |
Todd E Brandt | 7 | 2.27% | 1 | 4.00% |
Ingo Molnar | 5 | 1.62% | 1 | 4.00% |
Matt Mackall | 4 | 1.29% | 1 | 4.00% |
Borislav Petkov | 3 | 0.97% | 1 | 4.00% |
Konrad Rzeszutek Wilk | 2 | 0.65% | 2 | 8.00% |
Alexander Duyck | 1 | 0.32% | 1 | 4.00% |
Thomas Garnier | 1 | 0.32% | 1 | 4.00% |
Jaswinder Singh Rajput | 1 | 0.32% | 1 | 4.00% |
Josh Poimboeuf | 1 | 0.32% | 1 | 4.00% |
Andrew Lutomirski | 1 | 0.32% | 1 | 4.00% |
Total | 309 | 100.00% | 25 | 100.00% |
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();
str = strchr(str, ',');
if (str != NULL)
str += strspn(str, ", \t");
}
return 1;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andi Kleen | 86 | 49.14% | 1 | 14.29% |
Rafael J. Wysocki | 34 | 19.43% | 3 | 42.86% |
Pavel Machek | 20 | 11.43% | 1 | 14.29% |
David Shaohua Li | 19 | 10.86% | 1 | 14.29% |
Kristen Carlson Accardi | 16 | 9.14% | 1 | 14.29% |
Total | 175 | 100.00% | 7 | 100.00% |
__setup("acpi_sleep=", acpi_sleep_setup);
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Pavel Machek | 164 | 28.57% | 4 | 9.09% |
Andi Kleen | 124 | 21.60% | 3 | 6.82% |
H. Peter Anvin | 79 | 13.76% | 7 | 15.91% |
Rafael J. Wysocki | 53 | 9.23% | 5 | 11.36% |
Kees Cook | 32 | 5.57% | 1 | 2.27% |
David Shaohua Li | 22 | 3.83% | 2 | 4.55% |
Kristen Carlson Accardi | 16 | 2.79% | 1 | 2.27% |
Lv Zheng | 16 | 2.79% | 1 | 2.27% |
Jarkko Sakkinen | 12 | 2.09% | 3 | 6.82% |
Marcin Ślusarz | 10 | 1.74% | 1 | 2.27% |
Todd E Brandt | 10 | 1.74% | 1 | 2.27% |
Tejun Heo | 8 | 1.39% | 2 | 4.55% |
Borislav Petkov | 6 | 1.05% | 1 | 2.27% |
Ingo Molnar | 5 | 0.87% | 1 | 2.27% |
Matt Mackall | 5 | 0.87% | 2 | 4.55% |
Yinghai Lu | 3 | 0.52% | 1 | 2.27% |
Konrad Rzeszutek Wilk | 3 | 0.52% | 2 | 4.55% |
Josh Poimboeuf | 1 | 0.17% | 1 | 2.27% |
Andrew Lutomirski | 1 | 0.17% | 1 | 2.27% |
Greg Kroah-Hartman | 1 | 0.17% | 1 | 2.27% |
Jaswinder Singh Rajput | 1 | 0.17% | 1 | 2.27% |
Thomas Garnier | 1 | 0.17% | 1 | 2.27% |
Alexander Duyck | 1 | 0.17% | 1 | 2.27% |
Total | 574 | 100.00% | 44 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.