2005-04-16 15:20:36 -07:00
.text
# include < l i n u x / l i n k a g e . h >
# include < a s m / s e g m e n t . h >
2007-05-02 19:27:07 +02:00
# include < a s m / p g t a b l e . h >
2005-04-16 15:20:36 -07:00
# include < a s m / p a g e . h >
# include < a s m / m s r . h >
# Copyright 2 0 0 3 P a v e l M a c h e k < p a v e l @suse.cz>, distribute under GPLv2
#
# wakeup_ c o d e r u n s i n r e a l m o d e , a n d a t u n k n o w n a d d r e s s ( d e t e r m i n e d a t r u n - t i m e ) .
# Therefore i t m u s t o n l y u s e r e l a t i v e j u m p s / c a l l s .
#
# Do w e n e e d t o d e a l w i t h A 2 0 ? I t i s o k a y : A C P I s p e c s s a y s A 2 0 m u s t b e e n a b l e d
#
# If p h y s i c a l a d d r e s s o f w a k e u p _ c o d e i s 0 x12 3 4 5 , B I O S s h o u l d c a l l u s w i t h
# cs = 0 x12 3 4 , e i p = 0 x05
#
2007-07-19 01:47:41 -07:00
# define B E E P \
inb $ 9 7 , % a l ; \
outb % a l , $ 0 x80 ; \
movb $ 3 , % a l ; \
outb % a l , $ 9 7 ; \
outb % a l , $ 0 x80 ; \
movb $ - 7 4 , % a l ; \
outb % a l , $ 6 7 ; \
outb % a l , $ 0 x80 ; \
movb $ - 1 1 9 , % a l ; \
outb % a l , $ 6 6 ; \
outb % a l , $ 0 x80 ; \
movb $ 1 5 , % a l ; \
outb % a l , $ 6 6 ;
2005-04-16 15:20:36 -07:00
ALIGN
.align 16
ENTRY( w a k e u p _ s t a r t )
wakeup_code :
wakeup_ c o d e _ s t a r t = .
.code16
# Running i n * c o p y * o f t h i s c o d e , s o m e w h e r e i n l o w 1 M B .
movb $ 0 x a1 , % a l ; outb %al, $0x80
cli
cld
# setup d a t a s e g m e n t
movw % c s , % a x
2007-05-02 19:27:07 +02:00
movw % a x , % d s # M a k e d s : 0 p o i n t t o w a k e u p _ s t a r t
2005-04-16 15:20:36 -07:00
movw % a x , % s s
2007-07-19 01:47:41 -07:00
# Data s e g m e n t m u s t b e s e t u p b e f o r e w e c a n s e e w h e t h e r t o b e e p .
2007-07-19 01:47:41 -07:00
testl $ 4 , r e a l m o d e _ f l a g s - w a k e u p _ c o d e
2007-07-19 01:47:41 -07:00
jz 1 f
BEEP
1 :
2007-05-02 19:27:07 +02:00
# Private s t a c k i s n e e d e d f o r A S U S b o a r d
mov $ ( w a k e u p _ s t a c k - w a k e u p _ c o d e ) , % s p
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
pushl $ 0 # K i l l a n y d a n g e r o u s f l a g s
2005-04-16 15:20:36 -07:00
popfl
movl r e a l _ m a g i c - w a k e u p _ c o d e , % e a x
cmpl $ 0 x12 3 4 5 6 7 8 , % e a x
jne b o g u s _ r e a l _ m a g i c
2007-05-02 19:27:08 +02:00
call v e r i f y _ c p u # V e r i f y t h e c p u s u p p o r t s l o n g
# mode
testl % e a x , % e a x
jnz n o _ l o n g m o d e
2007-07-19 01:47:41 -07:00
testl $ 1 , r e a l m o d e _ f l a g s - w a k e u p _ c o d e
2005-04-16 15:20:36 -07:00
jz 1 f
lcall $ 0 x c00 0 ,$ 3
movw % c s , % a x
2007-05-02 19:27:07 +02:00
movw % a x , % d s # B i o s m i g h t h a v e p l a y e d w i t h t h a t
2005-04-16 15:20:36 -07:00
movw % a x , % s s
1 :
2007-07-19 01:47:41 -07:00
testl $ 2 , r e a l m o d e _ f l a g s - w a k e u p _ c o d e
2005-04-16 15:20:36 -07:00
jz 1 f
mov v i d e o _ m o d e - w a k e u p _ c o d e , % a x
call m o d e _ s e t a
1 :
movw $ 0 x b80 0 , % a x
movw % a x ,% f s
movw $ 0 x0 e 0 0 + ' L ' , % f s : ( 0 x10 )
movb $ 0 x a2 , % a l ; outb %al, $0x80
2007-05-02 19:27:07 +02:00
mov % d s , % a x # F i n d 32 b i t w a k e u p _ c o d e a d d r
movzx % a x , % e s i # ( C o n v e r t % d s : g d t t o a l i n e r p t r )
shll $ 4 , % e s i
# Fix u p t h e v e c t o r s
addl % e s i , w a k e u p _ 3 2 _ v e c t o r - w a k e u p _ c o d e
addl % e s i , w a k e u p _ l o n g 6 4 _ v e c t o r - w a k e u p _ c o d e
addl % e s i , g d t _ 4 8 a + 2 - w a k e u p _ c o d e # F i x u p t h e g d t p o i n t e r
lidtl % d s : i d t _ 4 8 a - w a k e u p _ c o d e
2005-06-25 14:55:09 -07:00
lgdtl % d s : g d t _ 4 8 a - w a k e u p _ c o d e # l o a d g d t w i t h w h a t e v e r i s
2005-04-16 15:20:36 -07:00
# appropriate
movl $ 1 , % e a x # p r o t e c t e d m o d e ( P E ) b i t
lmsw % a x # T h i s i s i t !
jmp 1 f
1 :
2007-05-02 19:27:07 +02:00
ljmpl * ( w a k e u p _ 3 2 _ v e c t o r - w a k e u p _ c o d e )
.balign 4
wakeup_32_vector :
2007-05-02 19:27:07 +02:00
.long wakeup_32 - wakeup_ c o d e
2007-05-02 19:27:07 +02:00
.word _ _ KERNEL3 2 _ C S , 0
2005-04-16 15:20:36 -07:00
.code32
wakeup_32 :
# Running i n t h i s c o d e , b u t a t l o w a d d r e s s ; paging is not yet turned on.
movb $ 0 x a5 , % a l ; outb %al, $0x80
2007-05-02 19:27:07 +02:00
movl $ _ _ K E R N E L _ D S , % e a x
movl % e a x , % d s
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
movw $ 0 x0 e 0 0 + ' i ' , % d s : ( 0 x b80 1 2 )
movb $ 0 x a8 , % a l ; outb %al, $0x80;
2005-04-16 15:20:36 -07:00
/ *
* Prepare f o r e n t e r i n g 6 4 b i t s m o d e
* /
2007-05-02 19:27:07 +02:00
/* Enable PAE */
2005-04-16 15:20:36 -07:00
xorl % e a x , % e a x
btsl $ 5 , % e a x
movl % e a x , % c r4
/* Setup early boot stage 4 level pagetables */
2007-05-02 19:27:07 +02:00
leal ( w a k e u p _ l e v e l 4 _ p g t - w a k e u p _ c o d e ) ( % e s i ) , % e a x
2005-04-16 15:20:36 -07:00
movl % e a x , % c r3
2007-05-02 19:27:08 +02:00
/* Check if nx is implemented */
movl $ 0 x80 0 0 0 0 0 1 , % e a x
cpuid
movl % e d x ,% e d i
2005-04-16 15:20:36 -07:00
/* Enable Long Mode */
2007-05-02 19:27:07 +02:00
xorl % e a x , % e a x
2005-04-16 15:20:36 -07:00
btsl $ _ E F E R _ L M E , % e a x
2007-05-02 19:27:07 +02:00
/* No Execute supported? */
2005-04-16 15:20:36 -07:00
btl $ 2 0 ,% e d i
jnc 1 f
btsl $ _ E F E R _ N X , % e a x
/* Make changes effective */
2007-05-02 19:27:07 +02:00
1 : movl $ M S R _ E F E R , % e c x
xorl % e d x , % e d x
2005-04-16 15:20:36 -07:00
wrmsr
xorl % e a x , % e a x
btsl $ 3 1 , % e a x / * E n a b l e p a g i n g a n d i n t u r n a c t i v a t e L o n g M o d e * /
btsl $ 0 , % e a x / * E n a b l e p r o t e c t e d m o d e * /
/* Make changes effective */
movl % e a x , % c r0
2007-05-02 19:27:07 +02:00
2005-04-16 15:20:36 -07:00
/ * At t h i s p o i n t :
CR4 . P A E m u s t b e 1
CS. L m u s t b e 0
CR3 m u s t p o i n t t o P M L 4
Next i n s t r u c t i o n m u s t b e a b r a n c h
This m u s t b e o n i d e n t i t y - m a p p e d p a g e
* /
/ *
* At t h i s p o i n t w e ' r e i n l o n g m o d e b u t i n 3 2 b i t c o m p a t i b i l i t y m o d e
* with E F E R . L M E = 1 , C S . L = 0 , C S . D = 1 ( a n d i n t u r n
* EFER. L M A = 1 ) . N o w w e w a n t t o j u m p i n 6 4 b i t m o d e , t o d o t h a t w e l o a d
* the n e w g d t / i d t t h a t h a s _ _ K E R N E L _ C S w i t h C S . L = 1 .
* /
/* Finally jump in 64bit mode */
2007-05-02 19:27:07 +02:00
ljmp * ( w a k e u p _ l o n g 6 4 _ v e c t o r - w a k e u p _ c o d e ) ( % e s i )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
.balign 4
wakeup_long64_vector :
2007-05-02 19:27:07 +02:00
.long wakeup_long64 - wakeup_ c o d e
2007-05-02 19:27:07 +02:00
.word _ _ KERNEL_ C S , 0
2005-04-16 15:20:36 -07:00
.code64
2007-05-02 19:27:07 +02:00
/ * Hooray, w e a r e i n L o n g 6 4 - b i t m o d e ( b u t s t i l l r u n n i n g i n
* low m e m o r y )
* /
2005-04-16 15:20:36 -07:00
wakeup_long64 :
/ *
* We m u s t s w i t c h t o a n e w d e s c r i p t o r i n k e r n e l s p a c e f o r t h e G D T
* because s o o n t h e k e r n e l w o n ' t h a v e a c c e s s a n y m o r e t o t h e u s e r s p a c e
* addresses w h e r e w e ' r e c u r r e n t l y r u n n i n g o n . W e h a v e t o d o t h a t h e r e
* because i n 3 2 b i t w e c o u l d n ' t l o a d a 6 4 b i t l i n e a r a d d r e s s .
* /
2007-05-02 19:27:07 +02:00
lgdt c p u _ g d t _ d e s c r
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
movw $ 0 x0 e 0 0 + ' n ' , % d s : ( 0 x b80 1 4 )
movb $ 0 x a9 , % a l ; outb %al, $0x80
2007-05-02 19:27:07 +02:00
movq s a v e d _ m a g i c , % r a x
movq $ 0 x12 3 4 5 6 7 8 9 a b c d e f0 , % r d x
cmpq % r d x , % r a x
jne b o g u s _ 6 4 _ m a g i c
2005-04-16 15:20:36 -07:00
movw $ 0 x0 e 0 0 + ' u ' , % d s : ( 0 x b80 1 6 )
nop
nop
movw $ _ _ K E R N E L _ D S , % a x
movw % a x , % s s
movw % a x , % d s
movw % a x , % e s
movw % a x , % f s
movw % a x , % g s
2007-05-02 19:27:07 +02:00
movq s a v e d _ r s p , % r s p
2005-04-16 15:20:36 -07:00
movw $ 0 x0 e 0 0 + ' x ' , % d s : ( 0 x b80 1 8 )
2007-05-02 19:27:07 +02:00
movq s a v e d _ r b x , % r b x
movq s a v e d _ r d i , % r d i
movq s a v e d _ r s i , % r s i
movq s a v e d _ r b p , % r b p
2005-04-16 15:20:36 -07:00
movw $ 0 x0 e 0 0 + ' ! ' , % d s : ( 0 x b80 1 a )
2007-05-02 19:27:07 +02:00
movq s a v e d _ r i p , % r a x
2005-04-16 15:20:36 -07:00
jmp * % r a x
.code32
.align 64
gdta :
2007-05-02 19:27:07 +02:00
/* Its good to keep gdt in sync with one in trampoline.S */
2005-04-16 15:20:36 -07:00
.word 0 , 0 , 0 , 0 # dummy
2007-05-02 19:27:07 +02:00
/* ??? Why I need the accessed bit set in order for this to work? */
.quad 0x00cf9b000000ffff # _ _ KERNEL3 2 _ C S
.quad 0x00af9b000000ffff # _ _ KERNEL_ C S
.quad 0x00cf93000000ffff # _ _ KERNEL_ D S
2005-04-16 15:20:36 -07:00
idt_48a :
.word 0 # idt l i m i t = 0
.word 0 , 0 # idt b a s e = 0 L
gdt_48a :
2007-05-02 19:27:07 +02:00
.word 0x800 # gdt l i m i t =2048 ,
2005-04-16 15:20:36 -07:00
# 2 5 6 GDT e n t r i e s
2007-05-02 19:27:07 +02:00
.long gdta - wakeup_ c o d e # g d t b a s e ( r e l o c a t e d i n l a t e r )
2005-04-16 15:20:36 -07:00
real_magic : .quad 0
video_mode : .quad 0
2007-07-19 01:47:41 -07:00
realmode_flags : .quad 0
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
.code16
2005-04-16 15:20:36 -07:00
bogus_real_magic :
2007-05-02 19:27:07 +02:00
movb $ 0 x b a ,% a l ; outb %al,$0x80
2005-04-16 15:20:36 -07:00
jmp b o g u s _ r e a l _ m a g i c
2007-05-02 19:27:07 +02:00
.code64
bogus_64_magic :
2005-04-16 15:20:36 -07:00
movb $ 0 x b3 ,% a l ; outb %al,$0x80
2007-05-02 19:27:07 +02:00
jmp b o g u s _ 6 4 _ m a g i c
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:08 +02:00
.code16
no_longmode :
movb $ 0 x b c ,% a l ; outb %al,$0x80
jmp n o _ l o n g m o d e
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:08 +02:00
# include " . . / v e r i f y _ c p u . S "
2005-04-16 15:20:36 -07:00
/ * This c o d e u s e s a n e x t e n d e d s e t o f v i d e o m o d e n u m b e r s . T h e s e i n c l u d e :
* Aliases f o r s t a n d a r d m o d e s
* NORMAL_ V G A ( - 1 )
* EXTENDED_ V G A ( - 2 )
* ASK_ V G A ( - 3 )
* Video m o d e s n u m b e r e d b y m e n u p o s i t i o n - - N O T R E C O M M E N D E D b e c a u s e o f l a c k
* of c o m p a t i b i l i t y w h e n e x t e n d i n g t h e t a b l e . T h e s e a r e b e t w e e n 0 x00 a n d 0 x f f .
* /
# define V I D E O _ F I R S T _ M E N U 0 x00 0 0
/* Standard BIOS video modes (BIOS number + 0x0100) */
# define V I D E O _ F I R S T _ B I O S 0 x01 0 0
/* VESA BIOS video modes (VESA number + 0x0200) */
# define V I D E O _ F I R S T _ V E S A 0 x02 0 0
/* Video7 special modes (BIOS number + 0x0900) */
# define V I D E O _ F I R S T _ V 7 0 x09 0 0
# Setting o f u s e r m o d e ( A X =mode I D ) = > C F =success
2007-05-02 19:27:07 +02:00
.code16
2005-04-16 15:20:36 -07:00
mode_seta :
movw % a x , % b x
# if 0
cmpb $ 0 x f f , % a h
jz s e t a l i a s
testb $ V I D E O _ R E C A L C > > 8 , % a h
jnz _ s e t r e c
cmpb $ V I D E O _ F I R S T _ R E S O L U T I O N > > 8 , % a h
jnc s e t r e s
cmpb $ V I D E O _ F I R S T _ S P E C I A L > > 8 , % a h
jz s e t s p c
cmpb $ V I D E O _ F I R S T _ V 7 > > 8 , % a h
jz s e t v7
# endif
cmpb $ V I D E O _ F I R S T _ V E S A > > 8 , % a h
jnc c h e c k _ v e s a a
# if 0
orb % a h , % a h
jz s e t m e n u
# endif
decb % a h
# jz s e t b i o s A d d b i o s m o d e s l a t e r
setbada : clc
ret
check_vesaa :
subb $ V I D E O _ F I R S T _ V E S A > > 8 , % b h
orw $ 0 x40 0 0 , % b x # U s e l i n e a r f r a m e b u f f e r
movw $ 0 x4 f02 , % a x # V E S A B I O S m o d e s e t c a l l
int $ 0 x10
cmpw $ 0 x00 4 f , % a x # A L = 4 f i f i m p l e m e n t e d
jnz _ s e t b a d a # A H = 0 i f O K
stc
ret
_setbada : jmp s e t b a d a
wakeup_stack_begin : # Stack g r o w s d o w n
.org 0xff0
wakeup_stack : # Just b e l o w e n d o f p a g e
2007-05-02 19:27:07 +02:00
.org 0x1000
ENTRY( w a k e u p _ l e v e l 4 _ p g t )
.quad level3_ident_pgt - _ _ START_ K E R N E L _ m a p + _ K E R N P G _ T A B L E
.fill 5 1 0 , 8 , 0
/* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
.quad level3_kernel_pgt - _ _ START_ K E R N E L _ m a p + _ K E R N P G _ T A B L E
2005-04-16 15:20:36 -07:00
ENTRY( w a k e u p _ e n d )
# #
# acpi_ c o p y _ w a k e u p _ r o u t i n e
#
# Copy t h e a b o v e r o u t i n e t o l o w m e m o r y .
#
# Parameters :
# % rdi : place t o c o p y w a k e u p r o u t i n e t o
#
# Returned a d d r e s s i s l o c a t i o n o f c o d e i n l o w m e m o r y ( p a s t d a t a a n d s t a c k )
#
[PATCH] x86-64: Get rid of dead code in suspend resume
o Get rid of dead code in wakeup.S
o We never restore from saved_gdt, saved_idt, saved_ltd, saved_tss, saved_cr3,
saved_cr4, saved_cr0, real_save_gdt, saved_efer, saved_efer2. Get rid
of of associated code.
o Get rid of bogus_magic, bogus_31_magic and bogus_magic2. No longer being
used.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andi Kleen <ak@suse.de>
2007-05-02 19:27:07 +02:00
.code64
2005-04-16 15:20:36 -07:00
ENTRY( a c p i _ c o p y _ w a k e u p _ r o u t i n e )
pushq % r a x
pushq % r d x
movl s a v e d _ v i d e o _ m o d e , % e d x
movl % e d x , v i d e o _ m o d e - w a k e u p _ s t a r t ( ,% r d i )
2007-07-19 01:47:41 -07:00
movl a c p i _ r e a l m o d e _ f l a g s , % e d x
movl % e d x , r e a l m o d e _ f l a g s - w a k e u p _ s t a r t ( ,% r d i )
2005-04-16 15:20:36 -07:00
movq $ 0 x12 3 4 5 6 7 8 , r e a l _ m a g i c - w a k e u p _ s t a r t ( ,% r d i )
movq $ 0 x12 3 4 5 6 7 8 9 a b c d e f0 , % r d x
movq % r d x , s a v e d _ m a g i c
2007-05-02 19:27:07 +02:00
movq s a v e d _ m a g i c , % r a x
movq $ 0 x12 3 4 5 6 7 8 9 a b c d e f0 , % r d x
cmpq % r d x , % r a x
jne b o g u s _ 6 4 _ m a g i c
2005-04-16 15:20:36 -07:00
# restore t h e r e g s w e u s e d
popq % r d x
popq % r a x
ENTRY( d o _ s u s p e n d _ l o w l e v e l _ s4 b i o s )
ret
.align 2
.p2align 4 , , 1 5
.globl do_suspend_lowlevel
.type do_ s u s p e n d _ l o w l e v e l ,@function
do_suspend_lowlevel :
.LFB5 :
subq $ 8 , % r s p
xorl % e a x , % e a x
call s a v e _ p r o c e s s o r _ s t a t e
movq % r s p , s a v e d _ c o n t e x t _ e s p ( % r i p )
movq % r a x , s a v e d _ c o n t e x t _ e a x ( % r i p )
movq % r b x , s a v e d _ c o n t e x t _ e b x ( % r i p )
movq % r c x , s a v e d _ c o n t e x t _ e c x ( % r i p )
movq % r d x , s a v e d _ c o n t e x t _ e d x ( % r i p )
movq % r b p , s a v e d _ c o n t e x t _ e b p ( % r i p )
movq % r s i , s a v e d _ c o n t e x t _ e s i ( % r i p )
movq % r d i , s a v e d _ c o n t e x t _ e d i ( % r i p )
movq % r8 , s a v e d _ c o n t e x t _ r08 ( % r i p )
movq % r9 , s a v e d _ c o n t e x t _ r09 ( % r i p )
movq % r10 , s a v e d _ c o n t e x t _ r10 ( % r i p )
movq % r11 , s a v e d _ c o n t e x t _ r11 ( % r i p )
movq % r12 , s a v e d _ c o n t e x t _ r12 ( % r i p )
movq % r13 , s a v e d _ c o n t e x t _ r13 ( % r i p )
movq % r14 , s a v e d _ c o n t e x t _ r14 ( % r i p )
movq % r15 , s a v e d _ c o n t e x t _ r15 ( % r i p )
pushfq ; popq saved_context_eflags(%rip)
2007-05-02 19:27:07 +02:00
movq $ . L 9 7 , s a v e d _ r i p ( % r i p )
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
movq % r s p ,s a v e d _ r s p
movq % r b p ,s a v e d _ r b p
movq % r b x ,s a v e d _ r b x
movq % r d i ,s a v e d _ r d i
movq % r s i ,s a v e d _ r s i
2005-04-16 15:20:36 -07:00
addq $ 8 , % r s p
movl $ 3 , % e d i
xorl % e a x , % e a x
jmp a c p i _ e n t e r _ s l e e p _ s t a t e
.L97 :
.p2align 4 , , 7
.L99 :
.align 4
movl $ 2 4 , % e a x
movw % a x , % d s
movq s a v e d _ c o n t e x t + 5 8 ( % r i p ) , % r a x
movq % r a x , % c r4
movq s a v e d _ c o n t e x t + 5 0 ( % r i p ) , % r a x
movq % r a x , % c r3
movq s a v e d _ c o n t e x t + 4 2 ( % r i p ) , % r a x
movq % r a x , % c r2
movq s a v e d _ c o n t e x t + 3 4 ( % r i p ) , % r a x
movq % r a x , % c r0
pushq s a v e d _ c o n t e x t _ e f l a g s ( % r i p ) ; popfq
movq s a v e d _ c o n t e x t _ e s p ( % r i p ) , % r s p
movq s a v e d _ c o n t e x t _ e b p ( % r i p ) , % r b p
movq s a v e d _ c o n t e x t _ e a x ( % r i p ) , % r a x
movq s a v e d _ c o n t e x t _ e b x ( % r i p ) , % r b x
movq s a v e d _ c o n t e x t _ e c x ( % r i p ) , % r c x
movq s a v e d _ c o n t e x t _ e d x ( % r i p ) , % r d x
movq s a v e d _ c o n t e x t _ e s i ( % r i p ) , % r s i
movq s a v e d _ c o n t e x t _ e d i ( % r i p ) , % r d i
movq s a v e d _ c o n t e x t _ r08 ( % r i p ) , % r8
movq s a v e d _ c o n t e x t _ r09 ( % r i p ) , % r9
movq s a v e d _ c o n t e x t _ r10 ( % r i p ) , % r10
movq s a v e d _ c o n t e x t _ r11 ( % r i p ) , % r11
movq s a v e d _ c o n t e x t _ r12 ( % r i p ) , % r12
movq s a v e d _ c o n t e x t _ r13 ( % r i p ) , % r13
movq s a v e d _ c o n t e x t _ r14 ( % r i p ) , % r14
movq s a v e d _ c o n t e x t _ r15 ( % r i p ) , % r15
xorl % e a x , % e a x
addq $ 8 , % r s p
jmp r e s t o r e _ p r o c e s s o r _ s t a t e
.LFE5 :
.Lfe5 :
.size do_ s u s p e n d _ l o w l e v e l ,. L f e 5 - d o _ s u s p e n d _ l o w l e v e l
.data
ALIGN
2007-05-02 19:27:07 +02:00
ENTRY( s a v e d _ r b p ) . q u a d 0
ENTRY( s a v e d _ r s i ) . q u a d 0
ENTRY( s a v e d _ r d i ) . q u a d 0
ENTRY( s a v e d _ r b x ) . q u a d 0
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:07 +02:00
ENTRY( s a v e d _ r i p ) . q u a d 0
ENTRY( s a v e d _ r s p ) . q u a d 0
2005-04-16 15:20:36 -07:00
ENTRY( s a v e d _ m a g i c ) . q u a d 0