Esempio n. 1
0
static errval_t reclaim_memory(genpaddr_t base, uint8_t bits)
{
    /* XXX: mem client is only defined for the bsp core.
     * For app cores, just return */
    if (get_mem_client() == NULL) {
        return SYS_ERR_OK;
    }

    // Fabricate new RAM cap and hand back to mem_serv
    struct capability c = {
        .type = ObjType_RAM,
        .u.ram = {
            .base = base,
            .bits = bits,
        }
    };
    struct capref ramcap;
    errval_t err = slot_alloc(&ramcap);
    if(err_is_fail(err)) {
        return err;
    }

    err = monitor_cap_create(ramcap, &c, my_core_id);
    if(err_is_fail(err)) {
        return err;
    }

    struct ram_alloc_state *ram_alloc_state = get_ram_alloc_state();
    errval_t result;
    thread_mutex_lock(&ram_alloc_state->ram_alloc_lock);
    struct mem_rpc_client *b = get_mem_client();
    // XXX: This should not be an RPC! It could stall the monitor, but
    // we trust mem_serv for the moment.
    err = b->vtbl.free_monitor(b, ramcap, base, bits, &result);
    thread_mutex_unlock(&ram_alloc_state->ram_alloc_lock);
    if(err_is_fail(err)) {
        return err;
    }
    if(err_is_fail(result)) {
        return result;
    }

    // XXX: this shouldn't be necessary as free_monitor uses give_away_cap
    err = cap_destroy(ramcap);
    if (err_no(err) == SYS_ERR_CAP_NOT_FOUND) {
        err = SYS_ERR_OK;
    }
    if (err_is_fail(err)) {
        DEBUG_ERR(err, "destroying reclaimed cap");
    }
    return err;
}
Esempio n. 2
0
static int freecmd(int argc, char *argv[])
{
    struct mem_rpc_client *mc = get_mem_client();
    assert(mc != NULL);
    errval_t err;
    genpaddr_t available, total;

    err = ram_available(&available, &total);
    if(err_is_fail(err)) {
        DEBUG_ERR(err, "available");
        return EXIT_FAILURE;
    }

    printf("Free memory: %" PRIuGENPADDR " bytes\n", available);
    printf("Total memory: %" PRIuGENPADDR " bytes\n", total);

    return EXIT_SUCCESS;
}
Esempio n. 3
0
static int freemem(void)
{
    struct mem_rpc_client *mc = get_mem_client();
    assert(mc != NULL);
    errval_t err;
    genpaddr_t available, total;

    err = ram_available(&available, &total);
    if(err_is_fail(err)) {
        DEBUG_ERR(err, "available");
        return EXIT_FAILURE;
    }

    printf("Free memory: %"PRIu32" MB (%" PRIu32 " bytes)\n",((uint32_t)available)/1024/1024, (uint32_t)available);
    printf("Total memory: %"PRIu32" MB (%" PRIu32 " bytes)\n",((uint32_t)total)/1024/1024, (uint32_t)total);

    return EXIT_SUCCESS;
}