Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #include "common.h"
0003 
0004     .data
0005     .balign 8
0006 success_message:
0007     .ascii "success: switch_endian_test\n\0"
0008 
0009     .balign 8
0010 failure_message:
0011     .ascii "failure: switch_endian_test\n\0"
0012 
0013     .section ".toc"
0014     .balign 8
0015 pattern:
0016     .8byte 0x5555AAAA5555AAAA
0017 
0018     .text
0019 FUNC_START(_start)
0020     /* Load the pattern */
0021     ld  r15, pattern@TOC(%r2)
0022 
0023     /* Setup CR, only CR2-CR4 are maintained */
0024     lis r3, 0x00FF
0025     ori r3, r3, 0xF000
0026     mtcr    r3
0027 
0028     /* Load the pattern slightly modified into the registers */
0029     mr  r3, r15
0030     addi    r4, r15, 4
0031 
0032     addi    r5, r15, 32
0033     mtlr    r5
0034 
0035     addi    r5, r15, 5
0036     addi    r6, r15, 6
0037     addi    r7, r15, 7
0038     addi    r8, r15, 8
0039 
0040     /* r9 - r12 are clobbered */
0041 
0042     addi    r13, r15, 13
0043     addi    r14, r15, 14
0044 
0045     /* Skip r15 we're using it */
0046 
0047     addi    r16, r15, 16
0048     addi    r17, r15, 17
0049     addi    r18, r15, 18
0050     addi    r19, r15, 19
0051     addi    r20, r15, 20
0052     addi    r21, r15, 21
0053     addi    r22, r15, 22
0054     addi    r23, r15, 23
0055     addi    r24, r15, 24
0056     addi    r25, r15, 25
0057     addi    r26, r15, 26
0058     addi    r27, r15, 27
0059     addi    r28, r15, 28
0060     addi    r29, r15, 29
0061     addi    r30, r15, 30
0062     addi    r31, r15, 31
0063 
0064     /*
0065      * Call the syscall to switch endian.
0066      * It clobbers r9-r12, XER, CTR and CR0-1,5-7.
0067      */
0068     li r0, __NR_switch_endian
0069     sc
0070 
0071     tdi   0, 0, 0x48    // b +8 if the endian was switched
0072     b     .Lfail        // exit if endian didn't switch
0073 
0074 #include "check-reversed.S"
0075 
0076     /* Flip back, r0 already has the switch syscall number */
0077     .long   0x02000044  /* sc */
0078 
0079 #include "check.S"
0080 
0081     ld  r4, success_message@got(%r2)
0082     li  r5, 28  // strlen(success_message)
0083     li  r14, 0  // exit status
0084 .Lout:
0085     li  r0, __NR_write
0086     li  r3, 1   /* stdout */
0087     sc
0088     li      r0, __NR_exit
0089     mr  r3, r14
0090     sc
0091     b       .
0092 
0093 .Lfail:
0094     ld  r4, failure_message@got(%r2)
0095     li  r5, 28  // strlen(failure_message)
0096     li  r14, 1
0097     b   .Lout