| // Copyright 2017 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 "vmo-utils.h" |
| |
| #include <inttypes.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <zircon/status.h> |
| #include <zircon/syscalls.h> |
| #include <zircon/syscalls/object.h> |
| |
| // Reads the zx_info_vmo_t entries for the process. |
| // Caller is responsible for the |out_vmos| pointer. |
| zx_status_t get_vmos(zx_handle_t process, zx_info_vmo_t** out_vmos, size_t* out_count, |
| size_t* out_avail) { |
| size_t count = 4096; // Should be more than enough. |
| zx_info_vmo_t* vmos = NULL; |
| int pass = 3; |
| while (true) { |
| vmos = (zx_info_vmo_t*)realloc(vmos, count * sizeof(zx_info_vmo_t)); |
| |
| size_t actual; |
| size_t avail; |
| zx_status_t s = zx_object_get_info(process, ZX_INFO_PROCESS_VMOS, vmos, |
| count * sizeof(zx_info_vmo_t), &actual, &avail); |
| if (s != ZX_OK) { |
| free(vmos); |
| return s; |
| } |
| if (actual < avail && pass-- > 0) { |
| count = (avail * 10) / 9; |
| continue; |
| } |
| *out_vmos = vmos; |
| *out_count = actual; |
| *out_avail = avail; |
| return ZX_OK; |
| } |
| } |