98 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #include "common.h"
 | |
| 
 | |
| 	.data
 | |
| 	.balign 8
 | |
| success_message:
 | |
| 	.ascii "success: switch_endian_test\n\0"
 | |
| 
 | |
| 	.balign 8
 | |
| failure_message:
 | |
| 	.ascii "failure: switch_endian_test\n\0"
 | |
| 
 | |
| 	.section ".toc"
 | |
| 	.balign 8
 | |
| pattern:
 | |
| 	.8byte 0x5555AAAA5555AAAA
 | |
| 
 | |
| 	.text
 | |
| FUNC_START(_start)
 | |
| 	/* Load the pattern */
 | |
| 	ld	r15, pattern@TOC(%r2)
 | |
| 
 | |
| 	/* Setup CR, only CR2-CR4 are maintained */
 | |
| 	lis	r3, 0x00FF
 | |
| 	ori	r3, r3, 0xF000
 | |
| 	mtcr	r3
 | |
| 
 | |
| 	/* Load the pattern slightly modified into the registers */
 | |
| 	mr	r3, r15
 | |
| 	addi	r4, r15, 4
 | |
| 
 | |
| 	addi	r5, r15, 32
 | |
| 	mtlr	r5
 | |
| 
 | |
| 	addi	r5, r15, 5
 | |
| 	addi	r6, r15, 6
 | |
| 	addi	r7, r15, 7
 | |
| 	addi	r8, r15, 8
 | |
| 
 | |
| 	/* r9 - r12 are clobbered */
 | |
| 
 | |
| 	addi	r13, r15, 13
 | |
| 	addi	r14, r15, 14
 | |
| 
 | |
| 	/* Skip r15 we're using it */
 | |
| 
 | |
| 	addi	r16, r15, 16
 | |
| 	addi	r17, r15, 17
 | |
| 	addi	r18, r15, 18
 | |
| 	addi	r19, r15, 19
 | |
| 	addi	r20, r15, 20
 | |
| 	addi	r21, r15, 21
 | |
| 	addi	r22, r15, 22
 | |
| 	addi	r23, r15, 23
 | |
| 	addi	r24, r15, 24
 | |
| 	addi	r25, r15, 25
 | |
| 	addi	r26, r15, 26
 | |
| 	addi	r27, r15, 27
 | |
| 	addi	r28, r15, 28
 | |
| 	addi	r29, r15, 29
 | |
| 	addi	r30, r15, 30
 | |
| 	addi	r31, r15, 31
 | |
| 
 | |
| 	/*
 | |
| 	 * Call the syscall to switch endian.
 | |
| 	 * It clobbers r9-r12, XER, CTR and CR0-1,5-7.
 | |
| 	 */
 | |
| 	li r0, __NR_switch_endian
 | |
| 	sc
 | |
| 
 | |
| 	tdi   0, 0, 0x48	// b +8 if the endian was switched
 | |
| 	b     .Lfail	  	// exit if endian didn't switch
 | |
| 
 | |
| #include "check-reversed.S"
 | |
| 
 | |
| 	/* Flip back, r0 already has the switch syscall number */
 | |
| 	.long	0x02000044	/* sc */
 | |
| 
 | |
| #include "check.S"
 | |
| 
 | |
| 	ld	r4, success_message@got(%r2)
 | |
| 	li	r5, 28	// strlen(success_message)
 | |
| 	li	r14, 0	// exit status
 | |
| .Lout:
 | |
| 	li	r0, __NR_write
 | |
| 	li	r3, 1	/* stdout */
 | |
| 	sc
 | |
| 	li      r0, __NR_exit
 | |
| 	mr	r3, r14
 | |
| 	sc
 | |
| 	b       .
 | |
| 
 | |
| .Lfail:
 | |
| 	ld	r4, failure_message@got(%r2)
 | |
| 	li	r5, 28	// strlen(failure_message)
 | |
| 	li	r14, 1
 | |
| 	b	.Lout
 |