1d21e507cSJoseph Huber //===-- Loader test to check the RPC streaming interface with the loader --===// 2d21e507cSJoseph Huber // 3d21e507cSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d21e507cSJoseph Huber // See https://llvm.org/LICENSE.txt for license information. 5d21e507cSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d21e507cSJoseph Huber // 7d21e507cSJoseph Huber //===----------------------------------------------------------------------===// 8d21e507cSJoseph Huber 973aab2f6Slntue #include "include/llvm-libc-types/test_rpc_opcodes_t.h" 10d21e507cSJoseph Huber #include "src/__support/GPU/utils.h" 11d21e507cSJoseph Huber #include "src/__support/RPC/rpc_client.h" 12d21e507cSJoseph Huber #include "src/__support/integer_to_string.h" 131f578347SGuillaume Chatelet #include "src/string/memory_utils/inline_memcmp.h" 141f578347SGuillaume Chatelet #include "src/string/memory_utils/inline_memcpy.h" 15d21e507cSJoseph Huber #include "src/string/string_utils.h" 16d21e507cSJoseph Huber #include "test/IntegrationTest/test.h" 17d21e507cSJoseph Huber 18d21e507cSJoseph Huber extern "C" void *malloc(uint64_t); 19f6e5f90fSJoseph Huber extern "C" void free(void *); 20d21e507cSJoseph Huber 21b6bc9d72SGuillaume Chatelet using namespace LIBC_NAMESPACE; 22d21e507cSJoseph Huber 23d21e507cSJoseph Huber static void test_stream() { 2429d3da3bSJoseph Huber static const char str[] = 2529d3da3bSJoseph Huber "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy" 26d21e507cSJoseph Huber "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy" 27d21e507cSJoseph Huber "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy" 28d21e507cSJoseph Huber "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy" 29d21e507cSJoseph Huber "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy"; 30d21e507cSJoseph Huber uint64_t send_size = sizeof(str); 31d21e507cSJoseph Huber void *send_ptr = malloc(send_size); 32d21e507cSJoseph Huber void *recv_ptr; 33d21e507cSJoseph Huber uint64_t recv_size; 34d21e507cSJoseph Huber 35d21e507cSJoseph Huber inline_memcpy(send_ptr, str, send_size); 36d21e507cSJoseph Huber ASSERT_TRUE(inline_memcmp(send_ptr, str, send_size) == 0 && "Data mismatch"); 37*89614cebSJoseph Huber LIBC_NAMESPACE::rpc::Client::Port port = 38*89614cebSJoseph Huber LIBC_NAMESPACE::rpc::client.open<RPC_TEST_STREAM>(); 39d21e507cSJoseph Huber port.send_n(send_ptr, send_size); 40d21e507cSJoseph Huber port.recv_n(&recv_ptr, &recv_size, 41d21e507cSJoseph Huber [](uint64_t size) { return malloc(size); }); 42d21e507cSJoseph Huber port.close(); 43d21e507cSJoseph Huber ASSERT_TRUE(inline_memcmp(recv_ptr, str, recv_size) == 0 && "Data mismatch"); 44d21e507cSJoseph Huber ASSERT_TRUE(recv_size == send_size && "Data size mismatch"); 45d21e507cSJoseph Huber 46d21e507cSJoseph Huber free(send_ptr); 47d21e507cSJoseph Huber free(recv_ptr); 48d21e507cSJoseph Huber } 49d21e507cSJoseph Huber 5029d3da3bSJoseph Huber static void test_divergent() { 5129d3da3bSJoseph Huber static const uint8_t data[] = { 5229d3da3bSJoseph Huber 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 5329d3da3bSJoseph Huber 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 5429d3da3bSJoseph Huber 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 5529d3da3bSJoseph Huber 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 5629d3da3bSJoseph Huber 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 5729d3da3bSJoseph Huber 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 5829d3da3bSJoseph Huber 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 5929d3da3bSJoseph Huber 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 6029d3da3bSJoseph Huber 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 6129d3da3bSJoseph Huber 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 6229d3da3bSJoseph Huber 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 6329d3da3bSJoseph Huber 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 6429d3da3bSJoseph Huber 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 6529d3da3bSJoseph Huber 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 6629d3da3bSJoseph Huber 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 6729d3da3bSJoseph Huber 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 6829d3da3bSJoseph Huber 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 6929d3da3bSJoseph Huber 255, 7029d3da3bSJoseph Huber }; 7129d3da3bSJoseph Huber 7229d3da3bSJoseph Huber uint8_t buffer[128] = {0}; 7329d3da3bSJoseph Huber uint64_t offset = 7429d3da3bSJoseph Huber (gpu::get_thread_id() + gpu::get_num_threads() * gpu::get_block_id()) % 7529d3da3bSJoseph Huber 128; 7629d3da3bSJoseph Huber void *recv_ptr; 7729d3da3bSJoseph Huber uint64_t recv_size; 7829d3da3bSJoseph Huber inline_memcpy(buffer, &data[offset], offset); 7929d3da3bSJoseph Huber ASSERT_TRUE(inline_memcmp(buffer, &data[offset], offset) == 0 && 8029d3da3bSJoseph Huber "Data mismatch"); 81*89614cebSJoseph Huber LIBC_NAMESPACE::rpc::Client::Port port = 82*89614cebSJoseph Huber LIBC_NAMESPACE::rpc::client.open<RPC_TEST_STREAM>(); 8329d3da3bSJoseph Huber port.send_n(buffer, offset); 8429d3da3bSJoseph Huber inline_memset(buffer, offset, 0); 8529d3da3bSJoseph Huber port.recv_n(&recv_ptr, &recv_size, [&](uint64_t) { return buffer; }); 8629d3da3bSJoseph Huber port.close(); 8729d3da3bSJoseph Huber 8829d3da3bSJoseph Huber ASSERT_TRUE(inline_memcmp(recv_ptr, &data[offset], recv_size) == 0 && 8929d3da3bSJoseph Huber "Data mismatch"); 9029d3da3bSJoseph Huber ASSERT_TRUE(recv_size == offset && "Data size mismatch"); 9129d3da3bSJoseph Huber } 9229d3da3bSJoseph Huber 93d21e507cSJoseph Huber TEST_MAIN(int argc, char **argv, char **envp) { 94d21e507cSJoseph Huber test_stream(); 9529d3da3bSJoseph Huber test_divergent(); 96d21e507cSJoseph Huber 97d21e507cSJoseph Huber return 0; 98d21e507cSJoseph Huber } 99