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