65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#include <machine/asm.h>
 | 
						|
 | 
						|
IMPORT(remaining_invocations)
 | 
						|
IMPORT(origstate)
 | 
						|
IMPORT(newstate)
 | 
						|
 | 
						|
#define JUNK 0xCC0FFEE0
 | 
						|
 | 
						|
#define COPY(dest, offset)	\
 | 
						|
	mov	$dest, %ebp		;	\
 | 
						|
	mov	4*offset(%esp), %ebx	;	\
 | 
						|
	mov	%ebx, 4*offset(%ebp) ;
 | 
						|
 | 
						|
/* Copy the result of a pusha to dest. */
 | 
						|
#define COPYA(dest) \
 | 
						|
	COPY(dest, 0); COPY(dest, 1); COPY(dest, 2); COPY(dest, 3); \
 | 
						|
	COPY(dest, 4); COPY(dest, 5); COPY(dest, 6); COPY(dest, 7); 
 | 
						|
 | 
						|
/* void check_context_loop() */
 | 
						|
ENTRY(check_context_loop)
 | 
						|
	/* Save original context so we can restore it. */
 | 
						|
	pusha
 | 
						|
 | 
						|
	/* Put some junk in the registers.
 | 
						|
	 * We want to junk the state, and junk it differently per reg,
 | 
						|
	 * so it's likelier corruption is actually detected. We can't
 | 
						|
	 * touch %esp but we can verify that it doesn't change from its
 | 
						|
	 * current value.
 | 
						|
	 */
 | 
						|
	mov	$JUNK+1, %eax
 | 
						|
	mov	$JUNK+2, %ebx
 | 
						|
	mov	$JUNK+3, %ecx
 | 
						|
	mov	$JUNK+4, %edx
 | 
						|
	mov	$JUNK+5, %ebp
 | 
						|
	mov	$JUNK+6, %esi
 | 
						|
	mov	$JUNK+7, %edi
 | 
						|
 | 
						|
	/* Save the junked state so we can compare it. */
 | 
						|
	pusha
 | 
						|
cont:
 | 
						|
	/* Check if we're done. */
 | 
						|
	cmpl	$0, (_C_LABEL(remaining_invocations))
 | 
						|
	jz	done
 | 
						|
 | 
						|
	/* We're not done. */
 | 
						|
 | 
						|
	/* Restart loop. */
 | 
						|
	jmp	cont
 | 
						|
 | 
						|
done:
 | 
						|
	/* Save the junked, but should be unmodified state
 | 
						|
	 * so we can copy it.
 | 
						|
	 */
 | 
						|
	pusha
 | 
						|
	COPYA(_C_LABEL(newstate));
 | 
						|
	popa
 | 
						|
 | 
						|
	/* copy and restore junked state */
 | 
						|
	COPYA(_C_LABEL(origstate));
 | 
						|
	popa
 | 
						|
 | 
						|
	/* restore original state and return */
 | 
						|
	popa
 | 
						|
	ret
 |