1/**
2 * \file
3 * \brief Capability invocations specific to the monitors
4 */
5
6/*
7 * Copyright (c) 2007-2016, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Universitaetstr 6, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#ifndef MONITOR_INVOCATIONS_ARCH_H
16#define MONITOR_INVOCATIONS_ARCH_H
17
18#include <barrelfish/syscall_arch.h>
19#include <barrelfish/caddr.h>
20#include <barrelfish/invocations_arch.h>
21
22static inline errval_t
23invoke_monitor_create_cap(uint64_t *raw, capaddr_t caddr, int level, capaddr_t slot, coreid_t owner)
24{
25    assert(sizeof(struct capability) <= 3*sizeof(uint64_t));
26    return cap_invoke8(cap_kernel, KernelCmd_Create_cap,
27                       raw[0], raw[1], raw[2],
28                       caddr, level, slot, owner).error;
29}
30
31static inline errval_t
32invoke_monitor_remote_cap_retype(capaddr_t src_root, capaddr_t src, gensize_t offset,
33                                 enum objtype newtype, gensize_t objsize, size_t count,
34                                 capaddr_t to_cspace,  capaddr_t to, capaddr_t slot,
35                                 int level) {
36    return cap_invoke9(cap_kernel, KernelCmd_Retype,
37                       ((uint64_t)src_root << 32) | (uint64_t)src,
38                       offset, newtype, objsize, count,
39                       ((uint64_t)to_cspace << 32) | (uint64_t)to,
40                       slot, level).error;
41}
42
43static inline errval_t
44invoke_monitor_copy_existing(uint64_t *raw, capaddr_t croot_addr, capaddr_t cn_addr,
45                             int cn_level, cslot_t slot)
46{
47    assert(sizeof(struct capability) <= 3*sizeof(uint64_t));
48    return cap_invoke8(cap_kernel, KernelCmd_Copy_existing,
49                       raw[0], raw[1], raw[2],
50                       croot_addr, cn_addr, cn_level, slot).error;
51}
52
53/**
54 * \brief Set up tracing in the kernel
55 *
56 */
57static inline errval_t
58invoke_trace_setup(struct capref cap)
59{
60    return cap_invoke2(cap_kernel, KernelCmd_Setup_trace,
61                       get_cap_addr(cap)).error;
62}
63
64static inline errval_t
65invoke_domain_id(struct capref cap, domainid_t domain_id)
66{
67    return cap_invoke3(cap_kernel, KernelCmd_Domain_Id, get_cap_addr(cap),
68                       domain_id).error;
69}
70
71static inline errval_t invoke_monitor_sync_timer(uint64_t synctime)
72{
73    return cap_invoke2(cap_kernel, KernelCmd_Sync_timer, synctime).error;
74}
75
76static inline errval_t
77invoke_monitor_revoke_mark_relations(uint64_t *raw_base)
78{
79    assert(sizeof(struct capability) <= 3*sizeof(uint64_t));
80    return cap_invoke4(cap_kernel, KernelCmd_Revoke_mark_relations,
81                       raw_base[0], raw_base[1], raw_base[2]).error;
82}
83
84static inline errval_t
85invoke_monitor_has_descendants(uint64_t *raw, bool *res)
86{
87    assert(sizeof(struct capability) <= 3*sizeof(uint64_t));
88    struct sysret sysret;
89    sysret = cap_invoke4(cap_kernel, KernelCmd_Has_descendants,
90                         raw[0], raw[1], raw[2]);
91    if (err_is_ok(sysret.error)) {
92        *res = sysret.value;
93    }
94    return sysret.error;
95}
96
97static inline errval_t
98invoke_monitor_is_retypeable(uint64_t *raw, gensize_t offset,
99                             gensize_t objsize, size_t count)
100{
101    assert(sizeof(struct capability) <= 3*sizeof(uint64_t));
102    return cap_invoke7(cap_kernel, KernelCmd_Is_retypeable,
103                       raw[0], raw[1], raw[2], offset, objsize, count).error;
104}
105
106#endif
107