mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 dd5f726076
			
		
	
	
		dd5f726076
		
	
	
	
	
		
			
			This patch adds support for loading a kexec on panic (kdump) kernel usning new system call. It prepares ELF headers for memory areas to be dumped and for saved cpu registers. Also prepares the memory map for second kernel and limits its boot to reserved areas only. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Eric Biederman <ebiederm@xmission.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Greg Kroah-Hartman <greg@kroah.com> Cc: Dave Young <dyoung@redhat.com> Cc: WANG Chao <chaowang@redhat.com> Cc: Baoquan He <bhe@redhat.com> Cc: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2003,2004  Eric Biederman (ebiederm@xmission.com)
 | |
|  * Copyright (C) 2014  Red Hat Inc.
 | |
| 
 | |
|  * Author(s): Vivek Goyal <vgoyal@redhat.com>
 | |
|  *
 | |
|  * This code has been taken from kexec-tools.
 | |
|  *
 | |
|  * This source code is licensed under the GNU General Public License,
 | |
|  * Version 2.  See the file COPYING for more details.
 | |
|  */
 | |
| 
 | |
| 	.text
 | |
| 	.balign 16
 | |
| 	.code64
 | |
| 	.globl entry64, entry64_regs
 | |
| 
 | |
| 
 | |
| entry64:
 | |
| 	/* Setup a gdt that should be preserved */
 | |
| 	lgdt gdt(%rip)
 | |
| 
 | |
| 	/* load the data segments */
 | |
| 	movl    $0x18, %eax     /* data segment */
 | |
| 	movl    %eax, %ds
 | |
| 	movl    %eax, %es
 | |
| 	movl    %eax, %ss
 | |
| 	movl    %eax, %fs
 | |
| 	movl    %eax, %gs
 | |
| 
 | |
| 	/* Setup new stack */
 | |
| 	leaq    stack_init(%rip), %rsp
 | |
| 	pushq   $0x10 /* CS */
 | |
| 	leaq    new_cs_exit(%rip), %rax
 | |
| 	pushq   %rax
 | |
| 	lretq
 | |
| new_cs_exit:
 | |
| 
 | |
| 	/* Load the registers */
 | |
| 	movq	rax(%rip), %rax
 | |
| 	movq	rbx(%rip), %rbx
 | |
| 	movq	rcx(%rip), %rcx
 | |
| 	movq	rdx(%rip), %rdx
 | |
| 	movq	rsi(%rip), %rsi
 | |
| 	movq	rdi(%rip), %rdi
 | |
| 	movq    rsp(%rip), %rsp
 | |
| 	movq	rbp(%rip), %rbp
 | |
| 	movq	r8(%rip), %r8
 | |
| 	movq	r9(%rip), %r9
 | |
| 	movq	r10(%rip), %r10
 | |
| 	movq	r11(%rip), %r11
 | |
| 	movq	r12(%rip), %r12
 | |
| 	movq	r13(%rip), %r13
 | |
| 	movq	r14(%rip), %r14
 | |
| 	movq	r15(%rip), %r15
 | |
| 
 | |
| 	/* Jump to the new code... */
 | |
| 	jmpq	*rip(%rip)
 | |
| 
 | |
| 	.section ".rodata"
 | |
| 	.balign 4
 | |
| entry64_regs:
 | |
| rax:	.quad 0x0
 | |
| rcx:	.quad 0x0
 | |
| rdx:	.quad 0x0
 | |
| rbx:	.quad 0x0
 | |
| rsp:	.quad 0x0
 | |
| rbp:	.quad 0x0
 | |
| rsi:	.quad 0x0
 | |
| rdi:	.quad 0x0
 | |
| r8:	.quad 0x0
 | |
| r9:	.quad 0x0
 | |
| r10:	.quad 0x0
 | |
| r11:	.quad 0x0
 | |
| r12:	.quad 0x0
 | |
| r13:	.quad 0x0
 | |
| r14:	.quad 0x0
 | |
| r15:	.quad 0x0
 | |
| rip:	.quad 0x0
 | |
| 	.size entry64_regs, . - entry64_regs
 | |
| 
 | |
| 	/* GDT */
 | |
| 	.section ".rodata"
 | |
| 	.balign 16
 | |
| gdt:
 | |
| 	/* 0x00 unusable segment
 | |
| 	 * 0x08 unused
 | |
| 	 * so use them as gdt ptr
 | |
| 	 */
 | |
| 	.word gdt_end - gdt - 1
 | |
| 	.quad gdt
 | |
| 	.word 0, 0, 0
 | |
| 
 | |
| 	/* 0x10 4GB flat code segment */
 | |
| 	.word 0xFFFF, 0x0000, 0x9A00, 0x00AF
 | |
| 
 | |
| 	/* 0x18 4GB flat data segment */
 | |
| 	.word 0xFFFF, 0x0000, 0x9200, 0x00CF
 | |
| gdt_end:
 | |
| stack:	.quad   0, 0
 | |
| stack_init:
 |