char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
ffaafde16
char/aliceai-t5-moe
1#include "backend-dispatched.h" 2#include "backend-virgl-apir.h" 3#include "ggml-backend-impl.h" 4#include "ggml-backend.h" 5#include "ggml-impl.h" 6 7#include <cstdint> 8 9static uint32_t validate_buffer_operation (size_t offset ,size_t size ,const char * operation ) { 10// Only check for critical integer overflow - no arbitrary size limits 11if (offset > SIZE_MAX - size ) { 12GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Integer overflow in offset+size: %zu + %zu\n" ,operation ,offset ,size ); 13return 1 ; 14 } 15 16return 0 ;// Valid 17} 18 19uint32_t backend_buffer_get_base (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 20GGML_UNUSED (ctx ); 21ggml_backend_buffer_t buffer ; 22buffer = apir_decode_ggml_buffer (dec ); 23 24if (!buffer || apir_decoder_get_fatal (dec )) { 25GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 26return 1 ; 27 } 28 29uintptr_t base = (uintptr_t )buffer -> iface .get_base (buffer ); 30apir_encode_uintptr_t (enc ,& base ); 31 32return 0 ; 33} 34 35uint32_t backend_buffer_set_tensor (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 36GGML_UNUSED (ctx ); 37GGML_UNUSED (enc ); 38 39ggml_backend_buffer_t buffer ; 40buffer = apir_decode_ggml_buffer (dec ); 41 42if (!buffer || apir_decoder_get_fatal (dec )) { 43GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 44return 1 ; 45 } 46 47ggml_tensor * tensor ; 48// safe to remove the const qualifier here 49tensor = (ggml_tensor * ) (uintptr_t )apir_decode_ggml_tensor (dec ); 50 51uint32_t shmem_res_id ; 52apir_decode_virtgpu_shmem_res_id (dec ,& shmem_res_id ); 53 54size_t offset ; 55apir_decode_size_t (dec ,& offset ); 56 57size_t size ; 58apir_decode_size_t (dec ,& size ); 59 60if (validate_buffer_operation (offset ,size ,__func__ )!= 0 ) { 61return 1 ; 62 } 63 64void * shmem_data = ctx -> iface -> get_shmem_ptr (ctx -> ctx_id ,shmem_res_id ); 65 66if (!shmem_data ) { 67GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Couldn't get the shmem addr from virgl\n" ,__func__ ); 68return 1 ; 69 } 70 71buffer -> iface .set_tensor (buffer ,tensor ,shmem_data ,offset ,size ); 72 73return 0 ; 74} 75 76uint32_t backend_buffer_get_tensor (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 77GGML_UNUSED (ctx ); 78GGML_UNUSED (enc ); 79 80ggml_backend_buffer_t buffer ; 81buffer = apir_decode_ggml_buffer (dec ); 82 83if (!buffer || apir_decoder_get_fatal (dec )) { 84GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 85return 1 ; 86 } 87 88const ggml_tensor * tensor ; 89// safe to remove the const qualifier here 90tensor = apir_decode_ggml_tensor (dec ); 91 92uint32_t shmem_res_id ; 93apir_decode_virtgpu_shmem_res_id (dec ,& shmem_res_id ); 94 95size_t offset ; 96apir_decode_size_t (dec ,& offset ); 97 98size_t size ; 99apir_decode_size_t (dec ,& size ); 100 101if (validate_buffer_operation (offset ,size ,__func__ )!= 0 ) { 102return 1 ; 103 } 104 105void * shmem_data = ctx -> iface -> get_shmem_ptr (ctx -> ctx_id ,shmem_res_id ); 106if (!shmem_data ) { 107GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Couldn't get the shmem addr from virgl\n" ,__func__ ); 108return 1 ; 109 } 110 111buffer -> iface .get_tensor (buffer ,tensor ,shmem_data ,offset ,size ); 112 113return 0 ; 114} 115 116uint32_t backend_buffer_cpy_tensor (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 117GGML_UNUSED (ctx ); 118 119ggml_backend_buffer_t buffer ; 120buffer = apir_decode_ggml_buffer (dec ); 121 122if (!buffer || apir_decoder_get_fatal (dec )) { 123GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 124return 1 ; 125 } 126 127const ggml_tensor * src ; 128// safe to remove the const qualifier here 129src = apir_decode_ggml_tensor (dec ); 130ggml_tensor * dst = (ggml_tensor * ) (uintptr_t )apir_decode_ggml_tensor (dec ); 131 132bool ret = buffer -> iface .cpy_tensor (buffer ,src , (ggml_tensor * )dst ); 133 134apir_encode_bool_t (enc ,& ret ); 135 136return 0 ; 137} 138 139uint32_t backend_buffer_clear (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 140GGML_UNUSED (ctx ); 141GGML_UNUSED (enc ); 142 143ggml_backend_buffer_t buffer ; 144buffer = apir_decode_ggml_buffer (dec ); 145 146if (!buffer || apir_decoder_get_fatal (dec )) { 147GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 148return 1 ; 149 } 150 151uint8_t value ; 152apir_decode_uint8_t (dec ,& value ); 153 154buffer -> iface .clear (buffer ,value ); 155 156return 0 ; 157} 158 159uint32_t backend_buffer_free_buffer (apir_encoder * enc ,apir_decoder * dec ,virgl_apir_context * ctx ) { 160GGML_UNUSED (ctx ); 161GGML_UNUSED (enc ); 162 163ggml_backend_buffer_t buffer ; 164buffer = apir_decode_ggml_buffer (dec ); 165 166if (!buffer || apir_decoder_get_fatal (dec )) { 167GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Invalid buffer handle from guest\n" ,__func__ ); 168return 1 ; 169 } 170 171if (!apir_untrack_backend_buffer (buffer )) { 172GGML_LOG_WARN (GGML_VIRTGPU_BCK "%s: unknown buffer %p\n" ,__func__ , (void * )buffer ); 173return 1 ; 174 } 175 176buffer -> iface .free_buffer (buffer ); 177 178return 0 ; 179}