Home | History | Annotate | Download | only in s390x
      1 #include <stdint.h>
      2 #include <inttypes.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #include <stdio.h>
      6 #include "../../../none/tests/s390x/opcodes.h"
      7 
      8 /* Define various input buffers. */
      9 
     10 /* U+0000 to U+d7ff:  Result is 2 bytes for each uint32_t
     11    U+dc00 to U+ffff:  Result is 2 bytes for each uint32_t */
     12 uint32_t pattern2[] = {
     13    0x0000, 0xd7ff,    /* corner cases */
     14    0xdc00, 0xffff,    /* corner cases */
     15    0xabba, 0xf00d, 0xd00f, 0x1234 /* misc */
     16 };
     17 
     18 /* U+00010000 to U+0010ffff:  Result is 4 bytes for each uint32_t */
     19 uint32_t pattern4[] = {
     20    0x00010000, 0x0010ffff,    /* corner cases */
     21    0x00010123, 0x00023456, 0x000789ab, 0x00100000  /* misc */
     22 };
     23 
     24 static void
     25 do_cu42(uint16_t *dst, uint64_t dst_len, uint32_t *src, uint64_t src_len)
     26 {
     27    /* build up the register pairs */
     28    register uint32_t *source     asm("4") = src;
     29    register uint64_t  source_len asm("5") = src_len;
     30    register uint16_t *dest       asm("2") = dst;
     31    register uint64_t  dest_len   asm("3") = dst_len;
     32 
     33    asm volatile(
     34                 CU42(2,4)
     35                 : "+d"(dest), "+d"(source), "+d"(source_len), "+d"(dest_len)
     36                 :
     37                 : "memory", "cc");
     38 }
     39 
     40 int main()
     41 {
     42    /*------------------------------------------------------------*/
     43    /* Write to a too small buffer                                */
     44    /*------------------------------------------------------------*/
     45 
     46    /* Write 2 bytes into buffer of length 1 */
     47    do_cu42(malloc(1), 10, pattern2, 4);             // complaint (2 bytes)
     48 
     49    /* Write 2 bytes into buffer of length 2 */
     50    do_cu42(malloc(2), 10, pattern2, 4);             // no complaint
     51 
     52    /* Write 4 bytes into buffer of length 1 */
     53    do_cu42(malloc(1), 10, pattern4, 4);             // complaint (4 bytes)
     54 
     55    /* Write 4 bytes into buffer of length 2 */
     56    do_cu42(malloc(2), 10, pattern4, 4);             // complaint (4 bytes)
     57 
     58    /* Write 4 bytes into buffer of length 3 */
     59    do_cu42(malloc(3), 10, pattern4, 4);             // complaint (4 bytes)
     60 
     61    /* Write 4 bytes into buffer of length 4 */
     62    do_cu42(malloc(4), 10, pattern4, 4);             // no complaint
     63 
     64    /*------------------------------------------------------------*/
     65    /* Read uninitialised data                                    */
     66    /*------------------------------------------------------------*/
     67    uint16_t buf[100];
     68    uint8_t *input;
     69 
     70    /* Input buffer is completely uninitialised */
     71    input = malloc(10);
     72    do_cu42(buf, sizeof buf, (void *)input, 4);         // complaint
     73 
     74    /* Read 4 bytes from input buffer. First byte is uninitialised */
     75    input = malloc(10);
     76    input[1] = input[2] = input[3] = 0x0;
     77    do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
     78 
     79    /* Read 4 bytes from input buffer. Second byte is uninitialised */
     80    input = malloc(10);
     81    input[0] = input[2] = input[3] = 0x0;
     82    do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
     83 
     84    /* Read 4 bytes from input buffer. Third byte is uninitialised */
     85    input = malloc(10);
     86    input[0] = input[1] = input[3] = 0x0;
     87    do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
     88 
     89    /* Read 4 bytes from input buffer. Fourth byte is uninitialised */
     90    input = malloc(10);
     91    input[0] = input[1] = input[2] = 0x0;
     92    do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
     93 
     94    /* Read 4 bytes from input buffer. All bytes are initialised */
     95    input = malloc(10);
     96    memset(input, 0, 4);
     97    do_cu42(buf, sizeof buf, (void *)input, 4);          // no complaint
     98 
     99    /* Read 8 bytes from input buffer. This iterates once. In the 1st
    100       iteration all input bytes are initialised in the 2nd iteration all
    101       input bytes are uninitialised. */
    102    input = malloc(10);
    103    memset(input, 0, 4);
    104    do_cu42(buf, sizeof buf, (void *)input, 8);          // complaint
    105 
    106 
    107    /* Write to NULL */
    108    //   do_cu42(NULL, 10, pattern1, sizeof pattern1);    // complaint
    109 
    110    return 0;
    111 }
    112