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