Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
a1716d50
Commit
a1716d50
authored
Jul 05, 2008
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'x86/s2ram-fix' into x86/urgent
parents
64e83b5a
4b4f7280
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
5 deletions
+59
-5
arch/x86/kernel/acpi/realmode/wakeup.S
arch/x86/kernel/acpi/realmode/wakeup.S
+37
-1
arch/x86/kernel/acpi/realmode/wakeup.h
arch/x86/kernel/acpi/realmode/wakeup.h
+5
-0
arch/x86/kernel/acpi/sleep.c
arch/x86/kernel/acpi/sleep.c
+15
-1
drivers/acpi/sleep/main.c
drivers/acpi/sleep/main.c
+2
-3
No files found.
arch/x86/kernel/acpi/realmode/wakeup.S
View file @
a1716d50
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
#include <asm/msr-index.h>
#include <asm/msr-index.h>
#include <asm/page.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/processor-flags.h>
.
code16
.
code16
.
section
".header"
,
"a"
.
section
".header"
,
"a"
...
@@ -24,6 +25,11 @@ pmode_gdt: .quad 0
...
@@ -24,6 +25,11 @@ pmode_gdt: .quad 0
realmode_flags
:
.
long
0
realmode_flags
:
.
long
0
real_magic
:
.
long
0
real_magic
:
.
long
0
trampoline_segment
:
.
word
0
trampoline_segment
:
.
word
0
_pad1
:
.
byte
0
wakeup_jmp
:
.
byte
0xea
/*
ljmpw
*/
wakeup_jmp_off
:
.
word
3
f
wakeup_jmp_seg
:
.
word
0
wakeup_gdt
:
.
quad
0
,
0
,
0
signature
:
.
long
0x51ee1111
signature
:
.
long
0x51ee1111
.
text
.
text
...
@@ -34,11 +40,34 @@ _start:
...
@@ -34,11 +40,34 @@ _start:
cli
cli
cld
cld
/
*
Apparently
some
dimwit
BIOS
programmers
don
't know how to
program
a
PM
to
RM
transition
,
and
we
might
end
up
here
with
junk
in
the
data
segment
descriptor
registers
.
The
only
way
to
repair
that
is
to
go
into
PM
and
fix
it
ourselves
...
*/
movw
$
16
,
%
cx
lgdtl
%
cs
:
wakeup_gdt
movl
%
cr0
,
%
eax
orb
$X86_CR0_PE
,
%
al
movl
%
eax
,
%
cr0
jmp
1
f
1
:
ljmpw
$
8
,
$
2
f
2
:
movw
%
cx
,
%
ds
movw
%
cx
,
%
es
movw
%
cx
,
%
ss
movw
%
cx
,
%
fs
movw
%
cx
,
%
gs
andb
$~
X86_CR0_PE
,
%
al
movl
%
eax
,
%
cr0
jmp
wakeup_jmp
3
:
/
*
Set
up
segments
*/
/
*
Set
up
segments
*/
movw
%
cs
,
%
ax
movw
%
cs
,
%
ax
movw
%
ax
,
%
ds
movw
%
ax
,
%
ds
movw
%
ax
,
%
es
movw
%
ax
,
%
es
movw
%
ax
,
%
ss
movw
%
ax
,
%
ss
lidtl
wakeup_idt
movl
$wakeup_stack_end
,
%
esp
movl
$wakeup_stack_end
,
%
esp
...
@@ -98,7 +127,14 @@ bogus_real_magic:
...
@@ -98,7 +127,14 @@ bogus_real_magic:
jmp
1
b
jmp
1
b
.
data
.
data
.
balign
4
.
balign
8
/
*
This
is
the
standard
real
-
mode
IDT
*/
wakeup_idt
:
.
word
0xffff
/*
limit
*/
.
long
0
/*
address
*/
.
word
0
.
globl
HEAP
,
heap_end
.
globl
HEAP
,
heap_end
HEAP
:
HEAP
:
.
long
wakeup_heap
.
long
wakeup_heap
...
...
arch/x86/kernel/acpi/realmode/wakeup.h
View file @
a1716d50
...
@@ -24,6 +24,11 @@ struct wakeup_header {
...
@@ -24,6 +24,11 @@ struct wakeup_header {
u32
realmode_flags
;
u32
realmode_flags
;
u32
real_magic
;
u32
real_magic
;
u16
trampoline_segment
;
/* segment with trampoline code, 64-bit only */
u16
trampoline_segment
;
/* segment with trampoline code, 64-bit only */
u8
_pad1
;
u8
wakeup_jmp
;
u16
wakeup_jmp_off
;
u16
wakeup_jmp_seg
;
u64
wakeup_gdt
[
3
];
u32
signature
;
/* To check we have correct structure */
u32
signature
;
/* To check we have correct structure */
}
__attribute__
((
__packed__
));
}
__attribute__
((
__packed__
));
...
...
arch/x86/kernel/acpi/sleep.c
View file @
a1716d50
...
@@ -50,6 +50,20 @@ int acpi_save_state_mem(void)
...
@@ -50,6 +50,20 @@ int acpi_save_state_mem(void)
header
->
video_mode
=
saved_video_mode
;
header
->
video_mode
=
saved_video_mode
;
header
->
wakeup_jmp_seg
=
acpi_wakeup_address
>>
4
;
/* GDT[0]: GDT self-pointer */
header
->
wakeup_gdt
[
0
]
=
(
u64
)(
sizeof
(
header
->
wakeup_gdt
)
-
1
)
+
((
u64
)(
acpi_wakeup_address
+
((
char
*
)
&
header
->
wakeup_gdt
-
(
char
*
)
acpi_realmode
))
<<
16
);
/* GDT[1]: real-mode-like code segment */
header
->
wakeup_gdt
[
1
]
=
(
0x009bULL
<<
40
)
+
((
u64
)
acpi_wakeup_address
<<
16
)
+
0xffff
;
/* GDT[2]: real-mode-like data segment */
header
->
wakeup_gdt
[
2
]
=
(
0x0093ULL
<<
40
)
+
((
u64
)
acpi_wakeup_address
<<
16
)
+
0xffff
;
#ifndef CONFIG_64BIT
#ifndef CONFIG_64BIT
store_gdt
((
struct
desc_ptr
*
)
&
header
->
pmode_gdt
);
store_gdt
((
struct
desc_ptr
*
)
&
header
->
pmode_gdt
);
...
@@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void)
...
@@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void)
return
;
return
;
}
}
acpi_wakeup_address
=
acpi_realmode
;
acpi_wakeup_address
=
virt_to_phys
((
void
*
)
acpi_realmode
)
;
}
}
...
...
drivers/acpi/sleep/main.c
View file @
a1716d50
...
@@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
...
@@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
if
(
!
acpi_wakeup_address
)
{
if
(
!
acpi_wakeup_address
)
{
return
-
EFAULT
;
return
-
EFAULT
;
}
}
acpi_set_firmware_waking_vector
((
acpi_physical_address
)
acpi_set_firmware_waking_vector
(
virt_to_phys
((
void
*
)
(
acpi_physical_address
)
acpi_wakeup_address
);
acpi_wakeup_address
));
}
}
ACPI_FLUSH_CPU_CACHE
();
ACPI_FLUSH_CPU_CACHE
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment