mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 6f34152f54
			
		
	
	
		6f34152f54
		
	
	
	
	
		
			
			The .inittext section tries to aggregate all functions which are needed to get a message out in the case of a load failure. However, putchar() uses intcall(), so intcall() should be in the .inittext section. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Link: http://lkml.kernel.org/n/tip-twxm8igouzbmsklmf6lfyq0w@git.kernel.org
		
			
				
	
	
		
			83 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* -----------------------------------------------------------------------
 | |
|  *
 | |
|  *   Copyright 2009-2014 Intel Corporation; author H. Peter Anvin
 | |
|  *
 | |
|  *   This file is part of the Linux kernel, and is made available under
 | |
|  *   the terms of the GNU General Public License version 2 or (at your
 | |
|  *   option) any later version; incorporated herein by reference.
 | |
|  *
 | |
|  * ----------------------------------------------------------------------- */
 | |
| 
 | |
| /*
 | |
|  * "Glove box" for BIOS calls.  Avoids the constant problems with BIOSes
 | |
|  * touching registers they shouldn't be.
 | |
|  */
 | |
| 
 | |
| 	.code16
 | |
| 	.section ".inittext","ax"
 | |
| 	.globl	intcall
 | |
| 	.type	intcall, @function
 | |
| intcall:
 | |
| 	/* Self-modify the INT instruction.  Ugly, but works. */
 | |
| 	cmpb	%al, 3f
 | |
| 	je	1f
 | |
| 	movb	%al, 3f
 | |
| 	jmp	1f		/* Synchronize pipeline */
 | |
| 1:
 | |
| 	/* Save state */
 | |
| 	pushfl
 | |
| 	pushw	%fs
 | |
| 	pushw	%gs
 | |
| 	pushal
 | |
| 
 | |
| 	/* Copy input state to stack frame */
 | |
| 	subw	$44, %sp
 | |
| 	movw	%dx, %si
 | |
| 	movw	%sp, %di
 | |
| 	movw	$11, %cx
 | |
| 	rep; movsd
 | |
| 
 | |
| 	/* Pop full state from the stack */
 | |
| 	popal
 | |
| 	popw	%gs
 | |
| 	popw	%fs
 | |
| 	popw	%es
 | |
| 	popw	%ds
 | |
| 	popfl
 | |
| 
 | |
| 	/* Actual INT */
 | |
| 	.byte	0xcd		/* INT opcode */
 | |
| 3:	.byte	0
 | |
| 
 | |
| 	/* Push full state to the stack */
 | |
| 	pushfl
 | |
| 	pushw	%ds
 | |
| 	pushw	%es
 | |
| 	pushw	%fs
 | |
| 	pushw	%gs
 | |
| 	pushal
 | |
| 
 | |
| 	/* Re-establish C environment invariants */
 | |
| 	cld
 | |
| 	movzwl	%sp, %esp
 | |
| 	movw	%cs, %ax
 | |
| 	movw	%ax, %ds
 | |
| 	movw	%ax, %es
 | |
| 
 | |
| 	/* Copy output state from stack frame */
 | |
| 	movw	68(%esp), %di	/* Original %cx == 3rd argument */
 | |
| 	andw	%di, %di
 | |
| 	jz	4f
 | |
| 	movw	%sp, %si
 | |
| 	movw	$11, %cx
 | |
| 	rep; movsd
 | |
| 4:	addw	$44, %sp
 | |
| 
 | |
| 	/* Restore state and return */
 | |
| 	popal
 | |
| 	popw	%gs
 | |
| 	popw	%fs
 | |
| 	popfl
 | |
| 	retl
 | |
| 	.size	intcall, .-intcall
 |