mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-10-31 17:40:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* Copyright (C) 1999, 2000, 2001, 2002, 2008 Free Software Foundation, Inc.
 | |
|    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
 | |
| 
 | |
|    The GNU C Library is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU Lesser General Public
 | |
|    License as published by the Free Software Foundation; either
 | |
|    version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
|    The GNU C Library is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|    Lesser General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Lesser General Public
 | |
|    License along with the GNU C Library; if not, write to the Free
 | |
|    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | |
|    02111-1307 USA.
 | |
| 
 | |
|    The layout of the jmp_buf is as follows.  This is subject to change
 | |
|    and user-code should never depend on the particular layout of
 | |
|    jmp_buf!
 | |
| 
 | |
| 
 | |
|   	offset:	description:
 | |
| 	-------	------------
 | |
|   	0x000	stack pointer (r12)	; unchangeable (see _JMPBUF_UNWINDS)
 | |
|   	0x008	r1 (gp)
 | |
| 	0x010	caller's unat
 | |
| 	0x018	fpsr
 | |
|   	0x020	r4
 | |
|   	0x028	r5
 | |
|   	0x030	r6
 | |
|   	0x038	r7
 | |
|   	0x040	rp (b0)
 | |
|   	0x048	b1
 | |
|   	0x050	b2
 | |
|   	0x058	b3
 | |
|   	0x060	b4
 | |
|   	0x068	b5
 | |
|   	0x070	ar.pfs
 | |
|   	0x078	ar.lc
 | |
|   	0x080	pr
 | |
|   	0x088	ar.bsp			; unchangeable (see __longjmp.S)
 | |
|   	0x090	ar.unat
 | |
| 	0x098	&__jmp_buf	; address of the jmpbuf (needed to locate NaT bits in unat)
 | |
| 	0x0a0	 f2
 | |
| 	0x0b0	 f3
 | |
| 	0x0c0	 f4
 | |
| 	0x0d0	 f5
 | |
| 	0x0e0	f16
 | |
|   	0x0f0	f17
 | |
|   	0x100	f18
 | |
|   	0x110	f19
 | |
|   	0x120	f20
 | |
|   	0x130	f21
 | |
|   	0x130	f22
 | |
|   	0x140	f23
 | |
|   	0x150	f24
 | |
|   	0x160	f25
 | |
|   	0x170	f26
 | |
|   	0x180	f27
 | |
|   	0x190	f28
 | |
|   	0x1a0	f29
 | |
|   	0x1b0	f30
 | |
|   	0x1c0	f31 */
 | |
| 
 | |
| #include <grub/symbol.h>
 | |
| #include <grub/dl.h>
 | |
| 
 | |
| 	.file	"setjmp.S"
 | |
| 
 | |
| GRUB_MOD_LICENSE "GPLv2+"
 | |
| 
 | |
| 	/* The following two entry points are the traditional entry points: */
 | |
| 
 | |
| 	.text
 | |
| 	
 | |
| 	.proc EXT_C(grub_setjmp)
 | |
| FUNCTION(grub_setjmp)
 | |
| 	alloc r8=ar.pfs,2,0,0,0
 | |
| 	mov in1=1
 | |
| 	br.cond.sptk.many __sigsetjmp
 | |
| 	.endp EXT_C(grub_setjmp)
 | |
| 
 | |
| 	/* __sigsetjmp(__jmp_buf buf, int savemask) */
 | |
| 
 | |
| 	.proc __sigsetjmp
 | |
| __sigsetjmp:
 | |
| 	//.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
 | |
| 	alloc loc1=ar.pfs,2,2,2,0
 | |
| 	mov r16=ar.unat
 | |
| 	;;
 | |
| 	mov r17=ar.fpsr
 | |
| 	mov r2=in0
 | |
| 	add r3=8,in0
 | |
| 	;;
 | |
| 	st8.spill.nta [r2]=sp,16	// r12 (sp)
 | |
| 	st8.spill.nta [r3]=gp,16	// r1 (gp)
 | |
| 	;;
 | |
| 	st8.nta [r2]=r16,16		// save caller's unat
 | |
| 	st8.nta [r3]=r17,16		// save fpsr
 | |
| 	add r8=0xa0,in0
 | |
| 	;;
 | |
| 	st8.spill.nta [r2]=r4,16	// r4
 | |
| 	st8.spill.nta [r3]=r5,16	// r5
 | |
| 	add r9=0xb0,in0
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f2,32
 | |
| 	stf.spill.nta [r9]=f3,32
 | |
| 	mov loc0=rp
 | |
| 	.body
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f4,32
 | |
| 	stf.spill.nta [r9]=f5,32
 | |
| 	mov r17=b1
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f16,32
 | |
| 	stf.spill.nta [r9]=f17,32
 | |
| 	mov r18=b2
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f18,32
 | |
| 	stf.spill.nta [r9]=f19,32
 | |
| 	mov r19=b3
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f20,32
 | |
| 	stf.spill.nta [r9]=f21,32
 | |
| 	mov r20=b4
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f22,32
 | |
| 	stf.spill.nta [r9]=f23,32
 | |
| 	mov r21=b5
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f24,32
 | |
| 	stf.spill.nta [r9]=f25,32
 | |
| 	mov r22=ar.lc
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f26,32
 | |
| 	stf.spill.nta [r9]=f27,32
 | |
| 	mov r24=pr
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f28,32
 | |
| 	stf.spill.nta [r9]=f29,32
 | |
| 	;;
 | |
| 	stf.spill.nta [r8]=f30
 | |
| 	stf.spill.nta [r9]=f31
 | |
| 
 | |
| 	st8.spill.nta [r2]=r6,16	// r6
 | |
| 	st8.spill.nta [r3]=r7,16	// r7
 | |
| 	;;
 | |
| 	mov r23=ar.bsp
 | |
| 	mov r25=ar.unat
 | |
| 	mov out0=in0
 | |
| 
 | |
| 	st8.nta [r2]=loc0,16		// b0
 | |
| 	st8.nta [r3]=r17,16		// b1
 | |
| 	mov out1=in1
 | |
| 	;;
 | |
| 	st8.nta [r2]=r18,16		// b2
 | |
| 	st8.nta [r3]=r19,16		// b3
 | |
| 	;;
 | |
| 	st8.nta [r2]=r20,16		// b4
 | |
| 	st8.nta [r3]=r21,16		// b5
 | |
| 	;;
 | |
| 	st8.nta [r2]=loc1,16		// ar.pfs
 | |
| 	st8.nta [r3]=r22,16		// ar.lc
 | |
| 	;;
 | |
| 	st8.nta [r2]=r24,16		// pr
 | |
| 	st8.nta [r3]=r23,16		// ar.bsp
 | |
| 	;;
 | |
| 	st8.nta [r2]=r25		// ar.unat
 | |
| 	st8.nta [r3]=in0		// &__jmp_buf
 | |
| 	mov r8=0
 | |
| 	mov rp=loc0
 | |
| 	mov ar.pfs=loc1
 | |
| 	br.ret.sptk.many rp
 | |
| 
 | |
| 	.endp __sigsetjmp
 | 
