1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <inttypes.h>
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h>
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h>
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "../../../none/tests/s390x/opcodes.h"
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Define various input buffers. */
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* U+0000 to U+d7ff:  Result is 2 bytes for each uint32_t
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   U+dc00 to U+ffff:  Result is 2 bytes for each uint32_t */
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chenguint32_t pattern2[] = {
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0x0000, 0xd7ff,    /* corner cases */
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0xdc00, 0xffff,    /* corner cases */
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0xabba, 0xf00d, 0xd00f, 0x1234 /* misc */
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* U+00010000 to U+0010ffff:  Result is 4 bytes for each uint32_t */
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chenguint32_t pattern4[] = {
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0x00010000, 0x0010ffff,    /* corner cases */
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0x00010123, 0x00023456, 0x000789ab, 0x00100000  /* misc */
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengdo_cu42(uint16_t *dst, uint64_t dst_len, uint32_t *src, uint64_t src_len)
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* build up the register pairs */
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint32_t *source     asm("4") = src;
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t  source_len asm("5") = src_len;
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint16_t *dest       asm("2") = dst;
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t  dest_len   asm("3") = dst_len;
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CU42(2,4)
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : "+d"(dest), "+d"(source), "+d"(source_len), "+d"(dest_len)
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                :
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : "memory", "cc");
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main()
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*------------------------------------------------------------*/
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write to a too small buffer                                */
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*------------------------------------------------------------*/
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 2 bytes into buffer of length 1 */
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(1), 10, pattern2, 4);             // complaint (2 bytes)
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 2 bytes into buffer of length 2 */
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(2), 10, pattern2, 4);             // no complaint
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 4 bytes into buffer of length 1 */
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(1), 10, pattern4, 4);             // complaint (4 bytes)
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 4 bytes into buffer of length 2 */
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(2), 10, pattern4, 4);             // complaint (4 bytes)
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 4 bytes into buffer of length 3 */
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(3), 10, pattern4, 4);             // complaint (4 bytes)
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write 4 bytes into buffer of length 4 */
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(malloc(4), 10, pattern4, 4);             // no complaint
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*------------------------------------------------------------*/
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read uninitialised data                                    */
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*------------------------------------------------------------*/
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint16_t buf[100];
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint8_t *input;
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Input buffer is completely uninitialised */
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);         // complaint
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 4 bytes from input buffer. First byte is uninitialised */
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input[1] = input[2] = input[3] = 0x0;
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 4 bytes from input buffer. Second byte is uninitialised */
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input[0] = input[2] = input[3] = 0x0;
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 4 bytes from input buffer. Third byte is uninitialised */
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input[0] = input[1] = input[3] = 0x0;
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 4 bytes from input buffer. Fourth byte is uninitialised */
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input[0] = input[1] = input[2] = 0x0;
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);          // complaint
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 4 bytes from input buffer. All bytes are initialised */
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memset(input, 0, 4);
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 4);          // no complaint
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read 8 bytes from input buffer. This iterates once. In the 1st
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      iteration all input bytes are initialised in the 2nd iteration all
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      input bytes are uninitialised. */
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   input = malloc(10);
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memset(input, 0, 4);
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_cu42(buf, sizeof buf, (void *)input, 8);          // complaint
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Write to NULL */
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   //   do_cu42(NULL, 10, pattern1, sizeof pattern1);    // complaint
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
112