[PATCH v4 2/2] selftests/powerpc: Add a test of the switch_endian() syscall
Gabriel Paubert
paubert at iram.es
Sat Mar 28 20:17:05 AEDT 2015
On Sat, Mar 28, 2015 at 12:19:10PM +1100, Michael Ellerman wrote:
> 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: Michael Ellerman <mpe at ellerman.id.au>
>
> ---
> v3: Have the test switch back to the original endian.
> v4: Add .gitignore.
> Drop the message write in the checking code - it clobbers some regs
> and breaks the second check.
>
> tools/testing/selftests/powerpc/Makefile | 2 +-
> .../selftests/powerpc/switch_endian/.gitignore | 2 +
> .../selftests/powerpc/switch_endian/Makefile | 23 +++++
> .../selftests/powerpc/switch_endian/check.S | 98 ++++++++++++++++++++++
> .../selftests/powerpc/switch_endian/common.h | 6 ++
> .../powerpc/switch_endian/switch_endian_test.S | 82 ++++++++++++++++++
> 6 files changed, 212 insertions(+), 1 deletion(-)
> create mode 100644 tools/testing/selftests/powerpc/switch_endian/.gitignore
> create mode 100644 tools/testing/selftests/powerpc/switch_endian/Makefile
> create mode 100644 tools/testing/selftests/powerpc/switch_endian/check.S
> create mode 100644 tools/testing/selftests/powerpc/switch_endian/common.h
> create mode 100644 tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S
[snipped]
> diff --git a/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S b/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S
> new file mode 100644
> index 000000000000..eee0e393600b
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S
> @@ -0,0 +1,82 @@
> +#include "common.h"
> +
> + .data
> + .balign 8
> +message:
> + .ascii "success: switch_endian_test\n\0"
> +
> + .section ".toc"
> + .balign 8
> +pattern:
> + .llong 0x5555AAAA5555AAAA
> +
> + .text
> +FUNC_START(_start)
> + /* Load the pattern */
> + ld r15, pattern at 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 r16, r15, 16
Duplicate?
> + 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
> +
> +#include "check-reversed.S"
> +
> + /* Flip back, r0 already has the switch syscall number */
> + .long 0x02000044 /* sc */
> +
> +#include "check.S"
> +
> + li r0, __NR_write
> + li r3, 1 /* stdout */
> + ld r4, message at got(%r2)
> + li r5, 28 /* strlen(message3) */
> + sc
> + li r0, __NR_exit
> + li r3, 0
> + sc
> + b .
> --
> 2.1.0
Gabriel
More information about the Linuxppc-dev
mailing list