1/* 2 * Copyright (c) 2012, 2016 ETH Zurich. 3 * All rights reserved. 4 * 5 * This file is distributed under the terms in the attached LICENSE file. 6 * If you do not find this file, copies can be found by writing to: 7 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 8 */ 9 10#ifndef CAPOPS_INTERNAL_H 11#define CAPOPS_INTERNAL_H 12 13#include <stdlib.h> 14#include <errors/errno.h> 15#include <barrelfish/waitset.h> 16#include <barrelfish/debug.h> 17#include <capops.h> 18#include <if/intermon_defs.h> 19 20typedef void (*gen_result_cont_fn)(errval_t, void*); 21struct result_closure { 22 gen_result_cont_fn handler; 23 void *arg; 24}; 25#define MKRESCONT(h,a) ((struct result_closure){ .handler = (h), .arg = (a) }) 26#define CALLRESCONT(c,e) ((c).handler((e), (c).arg)) 27 28#define malloce(size, ret) \ 29 ((*(ret) = malloc(size)) \ 30 ? SYS_ERR_OK \ 31 : LIB_ERR_MALLOC_FAIL) 32 33#define calloce(n, size, ret) \ 34 ((*(ret) = calloc(n, size)) \ 35 ? SYS_ERR_OK \ 36 : LIB_ERR_MALLOC_FAIL) 37 38#define GOTO_IF_ERR(err, label) do { \ 39 if (err_is_fail(err)) { \ 40 DEBUG_ERR(err, "%s:%u -> goto err", __FUNCTION__, __LINE__); \ 41 goto label; \ 42 } \ 43} while (0) 44 45#define PANIC_IF_ERR(err, msg...) do { \ 46 errval_t tmp_err__ = (err); \ 47 if (err_is_fail(tmp_err__)) { \ 48 USER_PANIC_ERR(tmp_err__, msg); \ 49 } \ 50} while (0) 51 52#define PANIC_IF_ERR2(err2, msg2, err, msg) do { \ 53 errval_t tmp_err2__ = (err2); \ 54 if (err_is_fail(tmp_err2__)) { \ 55 DEBUG_ERR((err), (msg)); \ 56 USER_PANIC_ERR(tmp_err2__, (msg2)); \ 57 } \ 58} while (0) 59 60#define DEBUG_IF_ERR(err, msg) do { \ 61 errval_t tmp_err__ = (err); \ 62 if (err_is_fail(tmp_err__)) { \ 63 DEBUG_ERR(tmp_err__, (msg)); \ 64 } \ 65} while (0) 66 67void find_cap__rx_handler(struct intermon_binding *b, intermon_caprep_t caprep, 68 genvaddr_t st); 69void find_cap_result__rx_handler(struct intermon_binding *b, errval_t result, 70 genvaddr_t st); 71void find_descendants__rx_handler(struct intermon_binding *b, 72 intermon_caprep_t caprep, genvaddr_t st); 73void find_descendants_result__rx_handler(struct intermon_binding *b, 74 errval_t status, genvaddr_t st); 75void check_retypeable__rx_handler(struct intermon_binding *b, intermon_caprep_t caprep, 76 genvaddr_t st, uint64_t offset, uint64_t objsize, 77 uint64_t count); 78void check_retypeable_result__rx_handler(struct intermon_binding *b, 79 errval_t status, genvaddr_t st); 80void owner_updated__rx_handler(struct intermon_binding *b, genvaddr_t st); 81void update_owner__rx_handler(struct intermon_binding *b, 82 intermon_caprep_t caprep, genvaddr_t st); 83void recv_copy_result__rx(struct intermon_binding *b, errval_t status, 84 capaddr_t capaddr, uint8_t level, cslot_t slot, 85 genvaddr_t st); 86void recv_copy__rx(struct intermon_binding *b, intermon_caprep_t caprep, 87 uint8_t owner_relations, genvaddr_t st); 88void request_copy__rx(struct intermon_binding *b, coreid_t dest, 89 intermon_caprep_t caprep, genvaddr_t st); 90void delete_remote__rx(struct intermon_binding *b, 91 intermon_caprep_t caprep, genvaddr_t st); 92void delete_remote_result__rx(struct intermon_binding *b, 93 errval_t status, genvaddr_t st); 94void move_request__rx_handler(struct intermon_binding *b, 95 intermon_caprep_t caprep, uint8_t relations, 96 genvaddr_t st); 97void move_result__rx_handler(struct intermon_binding *b, errval_t status, 98 genvaddr_t st); 99void retrieve_request__rx(struct intermon_binding *b, 100 intermon_caprep_t caprep, 101 genvaddr_t st); 102void retrieve_result__rx(struct intermon_binding *b, 103 errval_t status, uint8_t relations, 104 genvaddr_t st); 105void retype_request__rx(struct intermon_binding *b, intermon_caprep_t srcrep, 106 uint64_t offset, uint32_t desttype, uint64_t destsize, 107 uint64_t count, genvaddr_t st); 108void retype_response__rx(struct intermon_binding *b, errval_t status, 109 genvaddr_t st); 110void revoke_mark__rx(struct intermon_binding *b, 111 intermon_caprep_t caprep, 112 genvaddr_t st); 113void revoke_ready__rx(struct intermon_binding *b, genvaddr_t st); 114void revoke_commit__rx(struct intermon_binding *b, genvaddr_t st); 115void revoke_done__rx(struct intermon_binding *b, genvaddr_t st); 116 117/* Return number of monitors for which we've seen 'capops_ready' */ 118size_t num_monitors_ready_for_capops(void); 119 120#endif 121