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