Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cd968ef authored by Michael Ellerman's avatar Michael Ellerman
Browse files

selftests/powerpc: Add a test of the switch_endian() syscall



This adds a test of the switch_endian() syscall we added in the previous
commit.

We test it by calling the endian switch syscall, and then executing some
code in the other endian to check everything went as expected. That code
checks registers we expect to be maintained are. If the endian switch
failed to happen that code sequence will be illegal and cause the test
to abort.

We then switch back to the original endian, do the same checks and
finally write a success message and exit(0).

Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 529d235a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CUR

export CC CFLAGS

SUB_DIRS = pmu copyloops mm tm primitives stringloops vphn
SUB_DIRS = pmu copyloops mm tm primitives stringloops vphn switch_endian

endif

+2 −0
Original line number Diff line number Diff line
switch_endian_test
check-reversed.S
+24 −0
Original line number Diff line number Diff line
CC := $(CROSS_COMPILE)gcc
PROGS := switch_endian_test

ASFLAGS += -O2 -Wall -g -nostdlib -m64

all: $(PROGS)

switch_endian_test: check-reversed.S

check-reversed.o: check.o
	$(CROSS_COMPILE)objcopy -j .text --reverse-bytes=4 -O binary $< $@

check-reversed.S: check-reversed.o
	hexdump -v -e '/1 ".byte 0x%02X\n"' $< > $@

run_tests: all
	@-for PROG in $(PROGS); do \
		./$$PROG; \
	done;

clean:
	rm -f $(PROGS) *.o check-reversed.S

.PHONY: all run_tests clean
+100 −0
Original line number Diff line number Diff line
#include "common.h"

/*
 * Checks that registers contain what we expect, ie. they were not clobbered by
 * the syscall.
 *
 * r15: pattern to check registers against.
 *
 * At the end r3 == 0 if everything's OK.
 */
	nop			# guaranteed to be illegal in reverse-endian
	mr	r9,r15
	cmpd    r9,r3		# check r3
	bne     1f
	addi    r9,r15,4	# check r4
	cmpd    r9,r4
	bne     1f
	lis     r9,0x00FF	# check CR
	ori     r9,r9,0xF000
	mfcr    r10
	and     r10,r10,r9
	cmpw    r9,r10
	addi    r9,r15,34
	bne     1f
	addi    r9,r15,32	# check LR
	mflr    r10
	cmpd    r9,r10
	bne     1f
	addi    r9,r15,5	# check r5
	cmpd    r9,r5
	bne     1f
	addi    r9,r15,6	# check r6
	cmpd    r9,r6
	bne     1f
	addi    r9,r15,7	# check r7
	cmpd    r9,r7
	bne     1f
	addi    r9,r15,8	# check r8
	cmpd    r9,r8
	bne     1f
	addi    r9,r15,13	# check r13
	cmpd    r9,r13
	bne     1f
	addi    r9,r15,14	# check r14
	cmpd    r9,r14
	bne     1f
	addi    r9,r15,16	# check r16
	cmpd    r9,r16
	bne     1f
	addi    r9,r15,17	# check r17
	cmpd    r9,r17
	bne     1f
	addi    r9,r15,18	# check r18
	cmpd    r9,r18
	bne     1f
	addi    r9,r15,19	# check r19
	cmpd    r9,r19
	bne     1f
	addi    r9,r15,20	# check r20
	cmpd    r9,r20
	bne     1f
	addi    r9,r15,21	# check r21
	cmpd    r9,r21
	bne     1f
	addi    r9,r15,22	# check r22
	cmpd    r9,r22
	bne     1f
	addi    r9,r15,23	# check r23
	cmpd    r9,r23
	bne     1f
	addi    r9,r15,24	# check r24
	cmpd    r9,r24
	bne     1f
	addi    r9,r15,25	# check r25
	cmpd    r9,r25
	bne     1f
	addi    r9,r15,26	# check r26
	cmpd    r9,r26
	bne     1f
	addi    r9,r15,27	# check r27
	cmpd    r9,r27
	bne     1f
	addi    r9,r15,28	# check r28
	cmpd    r9,r28
	bne     1f
	addi    r9,r15,29	# check r29
	cmpd    r9,r29
	bne     1f
	addi    r9,r15,30	# check r30
	cmpd    r9,r30
	bne     1f
	addi    r9,r15,31	# check r31
	cmpd    r9,r31
	bne     1f
	b	2f
1:	mr	r3, r9
	li	r0, __NR_exit
	sc
2:	li	r0, __NR_switch_endian
	nop
+6 −0
Original line number Diff line number Diff line
#include <ppc-asm.h>
#include <asm/unistd.h>

#ifndef __NR_switch_endian
#define __NR_switch_endian 363
#endif
Loading