cregit-Linux how code gets into the kernel

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

PersonTokensPropCommitsCommitProp
Lv Zheng1593.75%150.00%
Andi Kleen16.25%150.00%
Total16100.00%2100.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

PersonTokensPropCommitsCommitProp
Pavel Machek13042.07%14.00%
H. Peter Anvin7323.62%520.00%
Kees Cook3210.36%14.00%
Rafael J. Wysocki165.18%28.00%
Andi Kleen165.18%14.00%
Jarkko Sakkinen82.59%28.00%
Tejun Heo82.59%28.00%
Todd E Brandt72.27%14.00%
Ingo Molnar51.62%14.00%
Matt Mackall41.29%14.00%
Borislav Petkov30.97%14.00%
Konrad Rzeszutek Wilk20.65%28.00%
Alexander Duyck10.32%14.00%
Thomas Garnier10.32%14.00%
Jaswinder Singh Rajput10.32%14.00%
Josh Poimboeuf10.32%14.00%
Andrew Lutomirski10.32%14.00%
Total309100.00%25100.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

PersonTokensPropCommitsCommitProp
Andi Kleen8649.14%114.29%
Rafael J. Wysocki3419.43%342.86%
Pavel Machek2011.43%114.29%
David Shaohua Li1910.86%114.29%
Kristen Carlson Accardi169.14%114.29%
Total175100.00%7100.00%

__setup("acpi_sleep=", acpi_sleep_setup);

Overall Contributors

PersonTokensPropCommitsCommitProp
Pavel Machek16428.57%49.09%
Andi Kleen12421.60%36.82%
H. Peter Anvin7913.76%715.91%
Rafael J. Wysocki539.23%511.36%
Kees Cook325.57%12.27%
David Shaohua Li223.83%24.55%
Kristen Carlson Accardi162.79%12.27%
Lv Zheng162.79%12.27%
Jarkko Sakkinen122.09%36.82%
Marcin Ślusarz101.74%12.27%
Todd E Brandt101.74%12.27%
Tejun Heo81.39%24.55%
Borislav Petkov61.05%12.27%
Ingo Molnar50.87%12.27%
Matt Mackall50.87%24.55%
Yinghai Lu30.52%12.27%
Konrad Rzeszutek Wilk30.52%24.55%
Josh Poimboeuf10.17%12.27%
Andrew Lutomirski10.17%12.27%
Greg Kroah-Hartman10.17%12.27%
Jaswinder Singh Rajput10.17%12.27%
Thomas Garnier10.17%12.27%
Alexander Duyck10.17%12.27%
Total574100.00%44100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.