1b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include <stdint.h>
2b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include <inttypes.h>
3b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include <stdlib.h>
4b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include <string.h>
5b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include <stdio.h>
6b7eaf815e14e920b90277de12fa6ac4760d5859cflorian#include "../../../none/tests/s390x/opcodes.h"
7b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
8b7eaf815e14e920b90277de12fa6ac4760d5859cflorian/* Define various input buffers. */
9b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
10b7eaf815e14e920b90277de12fa6ac4760d5859cflorian/* U+0000 to U+007f:  Result is 1 byte for each uint16_t */
11b7eaf815e14e920b90277de12fa6ac4760d5859cflorianuint16_t pattern1[] = {
12b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x0000, 0x007f,    /* corner cases */
13b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x0047, 0x0056, 0x0045, 0x0021, 0x007b, 0x003a /* misc */
14b7eaf815e14e920b90277de12fa6ac4760d5859cflorian};
15b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
16b7eaf815e14e920b90277de12fa6ac4760d5859cflorian/* U+0080 to U+07ff:  Result is 2 bytes for each uint16_t */
17b7eaf815e14e920b90277de12fa6ac4760d5859cflorianuint16_t pattern2[] = {
18b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x0080, 0x07ff,    /* corner cases */
19b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x07df, 0x008f, 0x0100, 0x017f, 0x052f, 0x0600, 0x06ff /* misc */
20b7eaf815e14e920b90277de12fa6ac4760d5859cflorian};
21b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
22b7eaf815e14e920b90277de12fa6ac4760d5859cflorian/* U+0800 to U+d7ff:  Result is 3 bytes for each uint16_t
23b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   U+dc00 to U+ffff:  Result is 3 bytes for each uint16_t */
24b7eaf815e14e920b90277de12fa6ac4760d5859cflorianuint16_t pattern3[] = {
25b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x0800, 0xd7ff,    /* corner cases */
26b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0xdc00, 0xffff,    /* corner cases */
27b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0x083f, 0x1a21, 0x1b10, 0x2200, 0x225e, 0x22c9, 0xe001  /* misc */
28b7eaf815e14e920b90277de12fa6ac4760d5859cflorian};
29b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
30b7eaf815e14e920b90277de12fa6ac4760d5859cflorian/* U+d800 to U+dbff:  Result is 4 bytes for each uint16_t pair */
31b7eaf815e14e920b90277de12fa6ac4760d5859cflorianuint16_t pattern4[] = {
32b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0xd800, 0xdc00,    /* left  corner case */
33b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0xdbff, 0xdfff,    /* right corner case */
34b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   0xdada, 0xdddd, 0xdeaf, 0xdcdc  /* misc */
35b7eaf815e14e920b90277de12fa6ac4760d5859cflorian};
36b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
37b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
38b7eaf815e14e920b90277de12fa6ac4760d5859cflorianvoid
39b7eaf815e14e920b90277de12fa6ac4760d5859cfloriando_cu21(uint8_t *dst, uint64_t dst_len, uint16_t *src, uint64_t src_len)
40b7eaf815e14e920b90277de12fa6ac4760d5859cflorian{
41b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* build up the register pairs */
42b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   register uint16_t *source     asm("4") = src;
43b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   register uint64_t  source_len asm("5") = src_len;
44b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   register uint8_t  *dest       asm("2") = dst;
45b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   register uint64_t  dest_len   asm("3") = dst_len;
46b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
47b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   asm volatile(
48b7eaf815e14e920b90277de12fa6ac4760d5859cflorian                CU21(0,2,4)
49b7eaf815e14e920b90277de12fa6ac4760d5859cflorian                : "+d"(dest), "+d"(source), "+d"(source_len), "+d"(dest_len)
50b7eaf815e14e920b90277de12fa6ac4760d5859cflorian                :
51b7eaf815e14e920b90277de12fa6ac4760d5859cflorian                : "memory", "cc");
52b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   return;
53b7eaf815e14e920b90277de12fa6ac4760d5859cflorian}
54b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
55b7eaf815e14e920b90277de12fa6ac4760d5859cflorianint main()
56b7eaf815e14e920b90277de12fa6ac4760d5859cflorian{
57b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /*------------------------------------------------------------*/
58b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write to a too small buffer                                */
59b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /*------------------------------------------------------------*/
60b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
61b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 2 bytes into buffer of length 1 */
62b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(1), 10, pattern2, 2);             // complaint (2 bytes)
63b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
64b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 2 bytes into buffer of length 2 */
65b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(2), 10, pattern2, 2);             // no complaint
66b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
67b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 3 bytes into buffer of length 1 */
68b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(1), 10, pattern3, 2);             // 2 complaints (3 = 2+1)
69b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
70b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 3 bytes into buffer of length 2 */
71b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(2), 10, pattern3, 2);             // complaint (1 byte)
72b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
73b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 3 bytes into buffer of length 3 */
74b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(3), 10, pattern3, 2);             // no complaint
75b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
76b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 4 bytes into buffer of length 1 */
77b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(1), 10, pattern4, 4);             // complaint (4 bytes)
78b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
79b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 4 bytes into buffer of length 2 */
80b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(2), 10, pattern4, 4);             // complaint (4 bytes)
81b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
82b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 4 bytes into buffer of length 3 */
83b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(3), 10, pattern4, 4);             // complaint (4 bytes)
84b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
85b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write 4 bytes into buffer of length 4 */
86b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(4), 10, pattern4, 4);             // no complaint
87b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
88b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /*------------------------------------------------------------*/
89b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Read uninitialised data                                    */
90b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /*------------------------------------------------------------*/
91b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   uint8_t *input = malloc(10);
92b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
93b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Input buffer is completely uninitialised */
94b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(4), 4, (void *)input, 2);         // complaint
95b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
96b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Read 2 bytes from input buffer. First byte is uninitialised */
97b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   input = malloc(10);
982d71c3652cab9e908736505b51bb82643d4b0503florian   input[1] = 0x0;
99b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(4), 4, (void *)input, 2);          // complaint
100b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
101b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Read 2 bytes from input buffer. Second byte is uninitialised */
102b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   input = malloc(10);
1032d71c3652cab9e908736505b51bb82643d4b0503florian   input[0] = 0x0;
104b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(4), 4, (void *)input, 2);          // complaint
105b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
1062d71c3652cab9e908736505b51bb82643d4b0503florian   /* Read 2 bytes from input buffer. All bytes are initialised */
107b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   input = malloc(10);
108b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   input[0] = input[1] = 0x0;
109b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   do_cu21(malloc(4), 4, (void *)input, 2);          // no complaint
110b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
1112d71c3652cab9e908736505b51bb82643d4b0503florian   /* Read 4 bytes from input buffer. This iterates once. In the 1st
1122d71c3652cab9e908736505b51bb82643d4b0503florian      iteration all input bytes are initialised in the 2nd iteration all
1132d71c3652cab9e908736505b51bb82643d4b0503florian      input bytes are uninitialised. */
1142d71c3652cab9e908736505b51bb82643d4b0503florian   input = malloc(10);
1152d71c3652cab9e908736505b51bb82643d4b0503florian   input[0] = input[1] = 0x0;
1162d71c3652cab9e908736505b51bb82643d4b0503florian   do_cu21(malloc(4), 4, (void *)input, 4);          // complaint
1172d71c3652cab9e908736505b51bb82643d4b0503florian
118b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   /* Write to NULL */
119b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   //   do_cu21(NULL, 10, pattern1, sizeof pattern1);    // complaint
120b7eaf815e14e920b90277de12fa6ac4760d5859cflorian
121b7eaf815e14e920b90277de12fa6ac4760d5859cflorian   return 0;
122b7eaf815e14e920b90277de12fa6ac4760d5859cflorian}
123