Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
kernel
acpi
sleep.c
Go to the documentation of this file.
1
/*
2
* sleep.c - x86-specific ACPI sleep support.
3
*
4
* Copyright (C) 2001-2003 Patrick Mochel
5
* Copyright (C) 2001-2003 Pavel Machek <
[email protected]
>
6
*/
7
8
#include <
linux/acpi.h
>
9
#include <
linux/bootmem.h
>
10
#include <
linux/memblock.h
>
11
#include <
linux/dmi.h
>
12
#include <
linux/cpumask.h
>
13
#include <asm/segment.h>
14
#include <asm/desc.h>
15
#include <asm/pgtable.h>
16
#include <asm/cacheflush.h>
17
#include <
asm/realmode.h
>
18
19
#include "../../realmode/rm/wakeup.h"
20
#include "
sleep.h
"
21
22
unsigned
long
acpi_realmode_flags
;
23
24
#if defined(CONFIG_SMP) && defined(CONFIG_64BIT)
25
static
char
temp_stack[4096];
26
#endif
27
34
int
acpi_suspend_lowlevel
(
void
)
35
{
36
struct
wakeup_header
*
header
=
37
(
struct
wakeup_header
*)
__va
(
real_mode_header
->wakeup_header);
38
39
if
(header->
signature
!=
WAKEUP_HEADER_SIGNATURE
) {
40
printk
(
KERN_ERR
"wakeup header does not match\n"
);
41
return
-
EINVAL
;
42
}
43
44
header->
video_mode
=
saved_video_mode
;
45
46
header->
pmode_behavior
= 0;
47
48
#ifndef CONFIG_64BIT
49
store_gdt
((
struct
desc_ptr
*)&header->
pmode_gdt
);
50
51
if
(!rdmsr_safe(
MSR_EFER
,
52
&header->
pmode_efer_low
,
53
&header->
pmode_efer_high
))
54
header->
pmode_behavior
|= (1 <<
WAKEUP_BEHAVIOR_RESTORE_EFER
);
55
#endif
/* !CONFIG_64BIT */
56
57
header->
pmode_cr0
= read_cr0();
58
if
(
__this_cpu_read
(
cpu_info
.cpuid_level) >= 0) {
59
header->
pmode_cr4
= read_cr4();
60
header->
pmode_behavior
|= (1 <<
WAKEUP_BEHAVIOR_RESTORE_CR4
);
61
}
62
if
(!rdmsr_safe(
MSR_IA32_MISC_ENABLE
,
63
&header->
pmode_misc_en_low
,
64
&header->
pmode_misc_en_high
))
65
header->
pmode_behavior
|=
66
(1 <<
WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE
);
67
header->
realmode_flags
=
acpi_realmode_flags
;
68
header->
real_magic
= 0x12345678;
69
70
#ifndef CONFIG_64BIT
71
header->
pmode_entry
= (
u32
)&
wakeup_pmode_return
;
72
header->
pmode_cr3
= (
u32
)
__pa
(&
initial_page_table
);
73
saved_magic
= 0x12345678;
74
#else
/* CONFIG_64BIT */
75
#ifdef CONFIG_SMP
76
stack_start
= (
unsigned
long
)temp_stack +
sizeof
(temp_stack);
77
early_gdt_descr
.address =
78
(
unsigned
long
)get_cpu_gdt_table(
smp_processor_id
());
79
initial_gs
= per_cpu_offset(
smp_processor_id
());
80
#endif
81
initial_code
= (
unsigned
long
)
wakeup_long64
;
82
saved_magic
= 0x123456789abcdef0
L
;
83
#endif
/* CONFIG_64BIT */
84
85
do_suspend_lowlevel
();
86
return
0;
87
}
88
89
static
int
__init
acpi_sleep_setup(
char
*
str
)
90
{
91
while
((str !=
NULL
) && (*str !=
'\0'
)) {
92
if
(
strncmp
(str,
"s3_bios"
, 7) == 0)
93
acpi_realmode_flags
|= 1;
94
if
(
strncmp
(str,
"s3_mode"
, 7) == 0)
95
acpi_realmode_flags
|= 2;
96
if
(
strncmp
(str,
"s3_beep"
, 7) == 0)
97
acpi_realmode_flags
|= 4;
98
#ifdef CONFIG_HIBERNATION
99
if
(
strncmp
(str,
"s4_nohwsig"
, 10) == 0)
100
acpi_no_s4_hw_signature();
101
#endif
102
if
(
strncmp
(str,
"nonvs"
, 5) == 0)
103
acpi_nvs_nosave();
104
if
(
strncmp
(str,
"old_ordering"
, 12) == 0)
105
acpi_old_suspend_ordering();
106
str =
strchr
(str,
','
);
107
if
(str !=
NULL
)
108
str +=
strspn
(str,
", \t"
);
109
}
110
return
1;
111
}
112
113
__setup
(
"acpi_sleep="
, acpi_sleep_setup);
Generated on Thu Jan 10 2013 13:20:14 for Linux Kernel by
1.8.2