blob: 9105dc609b28e233fdcc1e1cbcf0037c70289e99 [file] [log] [blame]
// 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;
}
}