| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | .text | 
					
						
							|  |  |  | #include <linux/linkage.h> | 
					
						
							|  |  |  | #include <asm/segment.h> | 
					
						
							| 
									
										
										
										
											2009-02-13 11:14:01 -08:00
										 |  |  | #include <asm/pgtable_types.h> | 
					
						
							|  |  |  | #include <asm/page_types.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/msr.h> | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | #include <asm/asm-offsets.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Copyright 2003 Pavel Machek <pavel@suse.cz>, distribute under GPLv2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .code64 | 
					
						
							|  |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2008-04-10 23:28:10 +02:00
										 |  |  | 	 * Hooray, we are in Long 64-bit mode (but still running in low memory) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2008-04-10 23:28:10 +02:00
										 |  |  | ENTRY(wakeup_long64) | 
					
						
							|  |  |  | 	movq	saved_magic, %rax | 
					
						
							|  |  |  | 	movq	$0x123456789abcdef0, %rdx | 
					
						
							|  |  |  | 	cmpq	%rdx, %rax | 
					
						
							|  |  |  | 	jne	bogus_64_magic | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movw	$__KERNEL_DS, %ax | 
					
						
							|  |  |  | 	movw	%ax, %ss	 | 
					
						
							|  |  |  | 	movw	%ax, %ds | 
					
						
							|  |  |  | 	movw	%ax, %es | 
					
						
							|  |  |  | 	movw	%ax, %fs | 
					
						
							|  |  |  | 	movw	%ax, %gs | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | 	movq	saved_rsp, %rsp | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | 	movq	saved_rbx, %rbx | 
					
						
							|  |  |  | 	movq	saved_rdi, %rdi | 
					
						
							|  |  |  | 	movq	saved_rsi, %rsi | 
					
						
							|  |  |  | 	movq	saved_rbp, %rbp | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | 	movq	saved_rip, %rax | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	jmp	*%rax | 
					
						
							| 
									
										
										
										
											2009-02-15 22:45:49 +01:00
										 |  |  | ENDPROC(wakeup_long64) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | bogus_64_magic: | 
					
						
							| 
									
										
										
										
											2008-04-10 23:28:10 +02:00
										 |  |  | 	jmp	bogus_64_magic | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-15 22:45:49 +01:00
										 |  |  | ENTRY(do_suspend_lowlevel) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	subq	$8, %rsp | 
					
						
							|  |  |  | 	xorl	%eax, %eax | 
					
						
							|  |  |  | 	call	save_processor_state | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	movq	$saved_context, %rax | 
					
						
							| 
									
										
										
										
											2008-01-30 13:30:56 +01:00
										 |  |  | 	movq	%rsp, pt_regs_sp(%rax) | 
					
						
							|  |  |  | 	movq	%rbp, pt_regs_bp(%rax) | 
					
						
							|  |  |  | 	movq	%rsi, pt_regs_si(%rax) | 
					
						
							|  |  |  | 	movq	%rdi, pt_regs_di(%rax) | 
					
						
							|  |  |  | 	movq	%rbx, pt_regs_bx(%rax) | 
					
						
							|  |  |  | 	movq	%rcx, pt_regs_cx(%rax) | 
					
						
							|  |  |  | 	movq	%rdx, pt_regs_dx(%rax) | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	movq	%r8, pt_regs_r8(%rax) | 
					
						
							|  |  |  | 	movq	%r9, pt_regs_r9(%rax) | 
					
						
							|  |  |  | 	movq	%r10, pt_regs_r10(%rax) | 
					
						
							|  |  |  | 	movq	%r11, pt_regs_r11(%rax) | 
					
						
							|  |  |  | 	movq	%r12, pt_regs_r12(%rax) | 
					
						
							|  |  |  | 	movq	%r13, pt_regs_r13(%rax) | 
					
						
							|  |  |  | 	movq	%r14, pt_regs_r14(%rax) | 
					
						
							|  |  |  | 	movq	%r15, pt_regs_r15(%rax) | 
					
						
							|  |  |  | 	pushfq | 
					
						
							| 
									
										
										
										
											2008-01-30 13:30:56 +01:00
										 |  |  | 	popq	pt_regs_flags(%rax) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-15 22:45:49 +01:00
										 |  |  | 	movq	$resume_point, saved_rip(%rip) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	movq	%rsp, saved_rsp | 
					
						
							|  |  |  | 	movq	%rbp, saved_rbp | 
					
						
							|  |  |  | 	movq	%rbx, saved_rbx | 
					
						
							|  |  |  | 	movq	%rdi, saved_rdi | 
					
						
							|  |  |  | 	movq	%rsi, saved_rsi | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	addq	$8, %rsp | 
					
						
							| 
									
										
										
										
											2012-07-26 19:40:08 -04:00
										 |  |  | 	movl	$3, %edi | 
					
						
							|  |  |  | 	xorl	%eax, %eax | 
					
						
							| 
									
										
										
										
											2013-10-31 09:31:18 +08:00
										 |  |  | 	call	x86_acpi_enter_sleep_state | 
					
						
							| 
									
										
										
										
											2009-02-15 22:46:45 +01:00
										 |  |  | 	/* in case something went wrong, restore the machine status and go on */ | 
					
						
							|  |  |  | 	jmp	resume_point | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-15 22:45:49 +01:00
										 |  |  | 	.align 4
 | 
					
						
							|  |  |  | resume_point: | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	/* We don't restore %rax, it must be 0 anyway */ | 
					
						
							|  |  |  | 	movq	$saved_context, %rax | 
					
						
							|  |  |  | 	movq	saved_context_cr4(%rax), %rbx | 
					
						
							|  |  |  | 	movq	%rbx, %cr4 | 
					
						
							|  |  |  | 	movq	saved_context_cr3(%rax), %rbx | 
					
						
							|  |  |  | 	movq	%rbx, %cr3 | 
					
						
							|  |  |  | 	movq	saved_context_cr2(%rax), %rbx | 
					
						
							|  |  |  | 	movq	%rbx, %cr2 | 
					
						
							|  |  |  | 	movq	saved_context_cr0(%rax), %rbx | 
					
						
							|  |  |  | 	movq	%rbx, %cr0 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:30:56 +01:00
										 |  |  | 	pushq	pt_regs_flags(%rax) | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	popfq | 
					
						
							| 
									
										
										
										
											2008-01-30 13:30:56 +01:00
										 |  |  | 	movq	pt_regs_sp(%rax), %rsp | 
					
						
							|  |  |  | 	movq	pt_regs_bp(%rax), %rbp | 
					
						
							|  |  |  | 	movq	pt_regs_si(%rax), %rsi | 
					
						
							|  |  |  | 	movq	pt_regs_di(%rax), %rdi | 
					
						
							|  |  |  | 	movq	pt_regs_bx(%rax), %rbx | 
					
						
							|  |  |  | 	movq	pt_regs_cx(%rax), %rcx | 
					
						
							|  |  |  | 	movq	pt_regs_dx(%rax), %rdx | 
					
						
							| 
									
										
										
										
											2007-10-23 22:37:24 +02:00
										 |  |  | 	movq	pt_regs_r8(%rax), %r8 | 
					
						
							|  |  |  | 	movq	pt_regs_r9(%rax), %r9 | 
					
						
							|  |  |  | 	movq	pt_regs_r10(%rax), %r10 | 
					
						
							|  |  |  | 	movq	pt_regs_r11(%rax), %r11 | 
					
						
							|  |  |  | 	movq	pt_regs_r12(%rax), %r12 | 
					
						
							|  |  |  | 	movq	pt_regs_r13(%rax), %r13 | 
					
						
							|  |  |  | 	movq	pt_regs_r14(%rax), %r14 | 
					
						
							|  |  |  | 	movq	pt_regs_r15(%rax), %r15 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	xorl	%eax, %eax | 
					
						
							|  |  |  | 	addq	$8, %rsp | 
					
						
							|  |  |  | 	jmp	restore_processor_state | 
					
						
							| 
									
										
										
										
											2009-02-15 22:45:49 +01:00
										 |  |  | ENDPROC(do_suspend_lowlevel) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | .data | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | ENTRY(saved_rbp)	.quad	0 | 
					
						
							|  |  |  | ENTRY(saved_rsi)	.quad	0 | 
					
						
							|  |  |  | ENTRY(saved_rdi)	.quad	0 | 
					
						
							|  |  |  | ENTRY(saved_rbx)	.quad	0 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:07 +02:00
										 |  |  | ENTRY(saved_rip)	.quad	0 | 
					
						
							|  |  |  | ENTRY(saved_rsp)	.quad	0 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(saved_magic)	.quad	0 |