1ea697dccSJoseph Huber //===-- GPU memory allocator implementation ---------------------*- C++ -*-===// 2ea697dccSJoseph Huber // 3ea697dccSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ea697dccSJoseph Huber // See https://llvm.org/LICENSE.txt for license information. 5ea697dccSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ea697dccSJoseph Huber // 7ea697dccSJoseph Huber //===----------------------------------------------------------------------===// 8ea697dccSJoseph Huber 9ea697dccSJoseph Huber #include "allocator.h" 10ea697dccSJoseph Huber 11ea697dccSJoseph Huber #include "src/__support/GPU/utils.h" 12ea697dccSJoseph Huber #include "src/__support/RPC/rpc_client.h" 135ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 14ea697dccSJoseph Huber 155ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 16ea697dccSJoseph Huber namespace { 17ea697dccSJoseph Huber 18ea697dccSJoseph Huber void *rpc_allocate(uint64_t size) { 19ea697dccSJoseph Huber void *ptr = nullptr; 20*a6ef0debSJoseph Huber rpc::Client::Port port = rpc::client.open<LIBC_MALLOC>(); 21be0c67c9SJoseph Huber port.send_and_recv( 22be0c67c9SJoseph Huber [=](rpc::Buffer *buffer, uint32_t) { buffer->data[0] = size; }, 23be0c67c9SJoseph Huber [&](rpc::Buffer *buffer, uint32_t) { 24ea697dccSJoseph Huber ptr = reinterpret_cast<void *>(buffer->data[0]); 25ea697dccSJoseph Huber }); 26ea697dccSJoseph Huber port.close(); 27ea697dccSJoseph Huber return ptr; 28ea697dccSJoseph Huber } 29ea697dccSJoseph Huber 30ea697dccSJoseph Huber void rpc_free(void *ptr) { 31*a6ef0debSJoseph Huber rpc::Client::Port port = rpc::client.open<LIBC_FREE>(); 32be0c67c9SJoseph Huber port.send([=](rpc::Buffer *buffer, uint32_t) { 33ea697dccSJoseph Huber buffer->data[0] = reinterpret_cast<uintptr_t>(ptr); 34ea697dccSJoseph Huber }); 35ea697dccSJoseph Huber port.close(); 36ea697dccSJoseph Huber } 37ea697dccSJoseph Huber 38ea697dccSJoseph Huber } // namespace 39ea697dccSJoseph Huber 40ea697dccSJoseph Huber namespace gpu { 41ea697dccSJoseph Huber 42ea697dccSJoseph Huber void *allocate(uint64_t size) { return rpc_allocate(size); } 43ea697dccSJoseph Huber 44ea697dccSJoseph Huber void deallocate(void *ptr) { rpc_free(ptr); } 45ea697dccSJoseph Huber 46ea697dccSJoseph Huber } // namespace gpu 475ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 48