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
|