mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 03:58:17 +00:00 
			
		
		
		
	The previous setjmp-implementation (as a static inline function that contained an 'asm volatile' sequence) was extremely fragile: (some versions of) GCC optimised the set of registers. One critical example was the removal of 'r9' from the clobber list, if -ffixed-reg9 was supplied. To increase robustness and ensure PCS-compliant behaviour, the setjmp and longjmp implementation are now in assembly and closely match what one would expect to find in a libc implementation. Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Tested-by: Andy Yan <andy.yan@rock-chips.com>
		
			
				
	
	
		
			29 lines
		
	
	
		
			588 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			588 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
 | |
|  * (C) Copyright 2016 Alexander Graf <agraf@suse.de>
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #ifndef _SETJMP_H_
 | |
| #define _SETJMP_H_	1
 | |
| 
 | |
| /*
 | |
|  * This really should be opaque, but the EFI implementation wrongly
 | |
|  * assumes that a 'struct jmp_buf_data' is defined.
 | |
|  */
 | |
| struct jmp_buf_data {
 | |
| #if defined(__aarch64__)
 | |
| 	u64  regs[13];
 | |
| #else
 | |
| 	u32  regs[10];  /* r4-r9, sl, fp, sp, lr */
 | |
| #endif
 | |
| };
 | |
| 
 | |
| typedef struct jmp_buf_data jmp_buf[1];
 | |
| 
 | |
| int setjmp(jmp_buf jmp);
 | |
| void longjmp(jmp_buf jmp, int ret);
 | |
| 
 | |
| #endif /* _SETJMP_H_ */
 |