⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 suspend_asm_64.s

📁 linux 内核源代码
💻 S
字号:
/* Copyright 2004,2005 Pavel Machek <pavel@suse.cz>, Andi Kleen <ak@suse.de>, Rafael J. Wysocki <rjw@sisk.pl> * * Distribute under GPLv2. * * swsusp_arch_resume must not use any stack or any nonlocal variables while * copying pages: * * Its rewriting one kernel image with another. What is stack in "old" * image could very well be data page in "new" image, and overwriting * your own stack under you is bad idea. */		.text#include <linux/linkage.h>#include <asm/segment.h>#include <asm/page.h>#include <asm/asm-offsets.h>ENTRY(swsusp_arch_suspend)	movq	$saved_context, %rax	movq	%rsp, pt_regs_rsp(%rax)	movq	%rbp, pt_regs_rbp(%rax)	movq	%rsi, pt_regs_rsi(%rax)	movq	%rdi, pt_regs_rdi(%rax)	movq	%rbx, pt_regs_rbx(%rax)	movq	%rcx, pt_regs_rcx(%rax)	movq	%rdx, pt_regs_rdx(%rax)	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	popq	pt_regs_eflags(%rax)	/* save the address of restore_registers */	movq	$restore_registers, %rax	movq	%rax, restore_jump_address(%rip)	/* save cr3 */	movq	%cr3, %rax	movq	%rax, restore_cr3(%rip)	call swsusp_save	retENTRY(restore_image)	/* switch to temporary page tables */	movq	$__PAGE_OFFSET, %rdx	movq	temp_level4_pgt(%rip), %rax	subq	%rdx, %rax	movq	%rax, %cr3	/* Flush TLB */	movq	mmu_cr4_features(%rip), %rax	movq	%rax, %rdx	andq	$~(1<<7), %rdx	# PGE	movq	%rdx, %cr4;  # turn off PGE	movq	%cr3, %rcx;  # flush TLB	movq	%rcx, %cr3;	movq	%rax, %cr4;  # turn PGE back on	/* prepare to jump to the image kernel */	movq	restore_jump_address(%rip), %rax	movq	restore_cr3(%rip), %rbx	/* prepare to copy image data to their original locations */	movq	restore_pblist(%rip), %rdx	movq	relocated_restore_code(%rip), %rcx	jmpq	*%rcx	/* code below has been relocated to a safe page */ENTRY(core_restore_code)loop:	testq	%rdx, %rdx	jz	done	/* get addresses from the pbe and copy the page */	movq	pbe_address(%rdx), %rsi	movq	pbe_orig_address(%rdx), %rdi	movq	$(PAGE_SIZE >> 3), %rcx	rep	movsq	/* progress to the next pbe */	movq	pbe_next(%rdx), %rdx	jmp	loopdone:	/* jump to the restore_registers address from the image header */	jmpq	*%rax	/*	 * NOTE: This assumes that the boot kernel's text mapping covers the	 * image kernel's page containing restore_registers and the address of	 * this page is the same as in the image kernel's text mapping (it	 * should always be true, because the text mapping is linear, starting	 * from 0, and is supposed to cover the entire kernel text for every	 * kernel).	 *	 * code below belongs to the image kernel	 */ENTRY(restore_registers)	/* go back to the original page tables */	movq    %rbx, %cr3	/* Flush TLB, including "global" things (vmalloc) */	movq	mmu_cr4_features(%rip), %rax	movq	%rax, %rdx	andq	$~(1<<7), %rdx;  # PGE	movq	%rdx, %cr4;  # turn off PGE	movq	%cr3, %rcx;  # flush TLB	movq	%rcx, %cr3	movq	%rax, %cr4;  # turn PGE back on	/* We don't restore %rax, it must be 0 anyway */	movq	$saved_context, %rax	movq	pt_regs_rsp(%rax), %rsp	movq	pt_regs_rbp(%rax), %rbp	movq	pt_regs_rsi(%rax), %rsi	movq	pt_regs_rdi(%rax), %rdi	movq	pt_regs_rbx(%rax), %rbx	movq	pt_regs_rcx(%rax), %rcx	movq	pt_regs_rdx(%rax), %rdx	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	pushq	pt_regs_eflags(%rax)	popfq	xorq	%rax, %rax	/* tell the hibernation core that we've just restored the memory */	movq	%rax, in_suspend(%rip)	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -