66 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  * Copyright (C) 2014 Intel Corporation; author Matt Fleming
 | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <linux/linkage.h> | ||
|  | #include <asm/page_types.h> | ||
|  | 
 | ||
|  | 	.text | ||
|  | 	.code64 | ||
|  | ENTRY(efi64_thunk) | ||
|  | 	push	%rbp | ||
|  | 	push	%rbx | ||
|  | 
 | ||
|  | 	/* | ||
|  | 	 * Switch to 1:1 mapped 32-bit stack pointer. | ||
|  | 	 */ | ||
|  | 	movq	%rsp, efi_saved_sp(%rip) | ||
|  | 	movq	efi_scratch+25(%rip), %rsp | ||
|  | 
 | ||
|  | 	/* | ||
|  | 	 * Calculate the physical address of the kernel text. | ||
|  | 	 */ | ||
|  | 	movq	$__START_KERNEL_map, %rax | ||
|  | 	subq	phys_base(%rip), %rax | ||
|  | 
 | ||
|  | 	/* | ||
|  | 	 * Push some physical addresses onto the stack. This is easier | ||
|  | 	 * to do now in a code64 section while the assembler can address | ||
|  | 	 * 64-bit values. Note that all the addresses on the stack are | ||
|  | 	 * 32-bit. | ||
|  | 	 */ | ||
|  | 	subq	$16, %rsp | ||
|  | 	leaq	efi_exit32(%rip), %rbx | ||
|  | 	subq	%rax, %rbx | ||
|  | 	movl	%ebx, 8(%rsp) | ||
|  | 	leaq	efi_gdt64(%rip), %rbx | ||
|  | 	subq	%rax, %rbx | ||
|  | 	movl	%ebx, 2(%ebx) | ||
|  | 	movl	%ebx, 4(%rsp) | ||
|  | 	leaq	efi_gdt32(%rip), %rbx | ||
|  | 	subq	%rax, %rbx | ||
|  | 	movl	%ebx, 2(%ebx) | ||
|  | 	movl	%ebx, (%rsp) | ||
|  | 
 | ||
|  | 	leaq	__efi64_thunk(%rip), %rbx | ||
|  | 	subq	%rax, %rbx | ||
|  | 	call	*%rbx | ||
|  | 
 | ||
|  | 	movq	efi_saved_sp(%rip), %rsp | ||
|  | 	pop	%rbx | ||
|  | 	pop	%rbp | ||
|  | 	retq | ||
|  | ENDPROC(efi64_thunk) | ||
|  | 
 | ||
|  | 	.data | ||
|  | efi_gdt32: | ||
|  | 	.word 	efi_gdt32_end - efi_gdt32 | ||
|  | 	.long	0			/* Filled out above */ | ||
|  | 	.word	0
 | ||
|  | 	.quad	0x0000000000000000	/* NULL descriptor */ | ||
|  | 	.quad	0x00cf9a000000ffff	/* __KERNEL_CS */ | ||
|  | 	.quad	0x00cf93000000ffff	/* __KERNEL_DS */ | ||
|  | efi_gdt32_end: | ||
|  | 
 | ||
|  | efi_saved_sp:		.quad 0 |