Exemplo n.º 1
0
errval_t rcap_db_remote_lock_req(struct capability *cap, coreid_t from_core, 
                                 recordid_t ccast_recordid) 
{
    assert(bsp_monitor);
    errval_t reply_err = bsp_db_lock(cap, from_core);

    bool has_desc;
    coremask_t on_cores;
    errval_t err = rcap_db_get_info(cap, &has_desc, &on_cores);
    assert(err_is_ok(err));
        
    return route_rcap_lock_reply(reply_err, 
                                 err_is_ok(reply_err) ? BSP_CORE_MASK : 0,
                                 has_desc, ccast_recordid);
}
Exemplo n.º 2
0
static void remote_cap_retype(struct monitor_blocking_binding *b,
                              struct capref croot, capaddr_t src,
                              uint64_t new_type, uint8_t size_bits,
                              capaddr_t to, capaddr_t slot, int32_t dcn_vbits)
{
    errval_t err;
    bool has_descendants;
    coremask_t on_cores;

    /* Save state for stackripped reply */
    struct retype_st * st = alloc_retype_st(b, croot, src, new_type, size_bits,
                                            to, slot, dcn_vbits);


    /* Get the raw cap from the kernel */
    err = monitor_domains_cap_identify(croot, src, CPTR_BITS,
                                       &(st->rcap_st.capability));
    if (err_is_fail(err)) {
        err_push(err, MON_ERR_CAP_REMOTE);
        goto reply;
    }

    /* Check if cap is retyped, if it is there is no point continuing,
       This will be checked again once we succeed in locking cap */
    err = rcap_db_get_info(&st->rcap_st.capability, &has_descendants, &on_cores);
    assert(err_is_ok(err));
    if (has_descendants) {
        err = MON_ERR_REMOTE_CAP_NEED_REVOKE;
        goto reply;
    }

    /* request lock */
    err = rcap_db_acquire_lock(&st->rcap_st.capability, (struct rcap_st*)st);
    if (err_is_fail(err)) {
        goto reply;
    }
    return;  // continues in remote_cap_retype_phase_2

reply:
    free_retype_st(st);
    err = b->tx_vtbl.remote_cap_retype_response(b, NOP_CONT, err);
    assert(err_is_ok(err));
}
Exemplo n.º 3
0
static void remote_cap_retype_phase_2(void * st_arg)
{
    errval_t err, reply_err;
    bool has_descendants;
    coremask_t on_cores;
    struct retype_st * st = (struct retype_st *) st_arg;
    struct monitor_blocking_binding *b = st->b;


    reply_err = st->rcap_st.err;

    err = rcap_db_get_info(&st->rcap_st.capability, &has_descendants, &on_cores);

    assert(err_is_ok(err));
    if (has_descendants) {
        reply_err = MON_ERR_REMOTE_CAP_NEED_REVOKE;
    }

    if (err_is_fail(reply_err)) {
        // lock failed or cap already retyped, unlock any cores we locked
        err = rcap_db_release_lock(&(st->rcap_st.capability), st->rcap_st.cores_locked);
        assert (err_is_ok(err));
    } else {
        // all good, do retype on domains behalf
        reply_err = monitor_retype_remote_cap(st->croot, st->src, st->new_type,
                                              st->size_bits, st->to, st->slot,
                                              st->dcn_vbits);

        // signal if retype was a success to remote cores
        err = rcap_db_retype(&(st->rcap_st.capability), err_is_ok(reply_err));
        assert (err_is_ok(err));
    }

    free_retype_st(st);
    err = b->tx_vtbl.remote_cap_retype_response(b, NOP_CONT, reply_err);
    assert (err_is_ok(err));
}