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; }
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; }
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; }