| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "private.h" |
| |
| __EXPORT void _zx_cprng_draw(void* buffer, size_t len) { |
| uint8_t* ptr = static_cast<uint8_t*>(buffer); |
| while (len != 0) { |
| size_t chunk = len; |
| if (chunk > ZX_CPRNG_DRAW_MAX_LEN) |
| chunk = ZX_CPRNG_DRAW_MAX_LEN; |
| zx_status_t status = SYSCALL_zx_cprng_draw_once(ptr, chunk); |
| // zx_cprng_draw_once shouldn't fail unless given bogus arguments. |
| if (unlikely(status != ZX_OK)) { |
| // We loop around __builtin_trap in case __builtin_trap doesn't |
| // actually terminate the process. |
| while (true) { |
| __builtin_trap(); |
| } |
| } |
| ptr += chunk; |
| len -= chunk; |
| } |
| } |
| |
| VDSO_INTERFACE_FUNCTION(zx_cprng_draw); |