capaddr_t source_croot_ptr = args->arg5;
capaddr_t source_cptr = args->arg6;
uint8_t destcn_level = args->arg7;
- uint8_t source_level = args->arg8;
+ uint8_t source_level = args->x8;
uint64_t param1, param2;
// params only sent if mint operation
if (mint) {
- param1 = args->arg9;
- param2 = args->arg10;
+ param1 = args->x9;
+ param2 = args->x10;
} else {
param1 = param2 = 0;
}
// number of new objects
size_t count = sa->arg7;
// Destination cspace cptr
- capaddr_t dest_cspace_cptr = sa->arg8;
+ capaddr_t dest_cspace_cptr = sa->x8;
// Destination cnode cptr
- capaddr_t dest_cnode_cptr = sa->arg9;
+ capaddr_t dest_cnode_cptr = sa->x9;
// Destination slot number
- capaddr_t dest_slot = sa->arg10;
+ capaddr_t dest_slot = sa->x10;
// Level of destination cnode in destination cspace
uint8_t dest_cnode_level = (word >> 16) & 0xF;
capaddr_t dest_cptr = sa->arg4;
uint8_t dest_level= sa->arg5;
cslot_t dest_slot = sa->arg6;
- printk(LOG_NOTE, "type = %d, bits = %d\n", type, bits);
+ printk(LOG_NOTE, "type = %d, bytes = %zu\n", type, objsize);
return sys_create(root, type, objsize, dest_cptr, dest_level, dest_slot);
}
}
static struct sysret
+handle_resize(
+ struct capability* root,
+ arch_registers_state_t* context,
+ int argc
+ )
+{
+ INVOCATION_PRELUDE(5);
+
+ capaddr_t newroot_ptr = sa->arg2;
+ capaddr_t retcn_ptr = sa->arg3;
+ cslot_t retslot = sa->arg4;
+
+ return sys_resize_l1cnode(root, newroot_ptr, retcn_ptr, retslot);
+}
+
+static struct sysret
handle_map(
struct capability *ptable,
arch_registers_state_t *context,
int argc
)
{
- assert(8 == argc);
+ assert(10 == argc);
struct registers_aarch64_syscall_args* sa = &context->syscall_args;
/* Retrieve arguments */
- capaddr_t source_cptr = (capaddr_t)sa->arg2;
- capaddr_t dest_slot = ((capaddr_t)sa->arg3) >> 16;
- int source_vbits = ((int)sa->arg3) & 0xff;
- uintptr_t flags = (uintptr_t)sa->arg4;
- uintptr_t offset = (uintptr_t)sa->arg5;
- uintptr_t pte_count = (uintptr_t)sa->arg6;
- uintptr_t *extra = (uintptr_t*)sa->arg7;
- capaddr_t mcn_addr = extra[0];
- int mcn_vbits = (int)extra[1];
- cslot_t mapping_slot = (cslot_t)extra[2];
-
-
-
- return sys_map(ptable, dest_slot, source_cptr, source_vbits,
- flags, offset, pte_count, mcn_addr, mcn_vbits,
+ capaddr_t source_root_cptr = (capaddr_t)sa->arg2;
+ capaddr_t source_cptr = (capaddr_t)sa->arg3;
+ uintptr_t flags = (uintptr_t)sa->arg4;
+ uintptr_t offset = (uintptr_t)sa->arg5;
+ uintptr_t pte_count = (uintptr_t)sa->arg6;
+ capaddr_t mcn_root = (capaddr_t)sa->arg7;
+ capaddr_t mcn_addr = (capaddr_t)sa->x8;
+ uint32_t word = sa->x9;
+ uint8_t source_level = word & 0xF;
+ uint8_t mcn_level = (word >> 4) & 0xF;
+ cslot_t mapping_slot = (word >> 8) & 0xFF;
+ cslot_t slot = (word >> 16) & 0xFFFF;
+
+ return sys_map(ptable, slot, source_root_cptr, source_cptr, source_level,
+ flags, offset, pte_count, mcn_root, mcn_addr, mcn_level,
mapping_slot);
}
/// Different handler for cap operations performed by the monitor
INVOCATION_HANDLER(monitor_handle_retype)
{
- INVOCATION_PRELUDE(8);
- errval_t err;
-
- /* lookup root cap for retype:
- * sa->arg7 is (rootcap_addr | (rootcap_vbits << 32)) */
- capaddr_t rootcap_addr = sa->arg7 & 0xFFFFFFFF;
- uint8_t rootcap_vbits = (sa->arg7 >> 32) & 0xFF;
- struct capability *root;
- err = caps_lookup_cap(&dcb_current->cspace.cap, rootcap_addr,
- rootcap_vbits, &root, CAPRIGHTS_READ);
- if (err_is_fail(err)) {
- return SYSRET(err_push(err, SYS_ERR_ROOT_CAP_LOOKUP));
- }
-
- /* XXX: this hides the last argument which retype_common doesn't know
- * about */
- return handle_retype_common(root, true, context, 8);
+ assert(argc == 11);
+ return handle_retype_common(&dcb_current->cspace.cap, true, context, argc);
}
INVOCATION_HANDLER(monitor_handle_has_descendants)
INVOCATION_HANDLER(monitor_copy_existing)
{
- INVOCATION_PRELUDE(6);
- capaddr_t cnode_cptr = sa->arg2;
- int cnode_vbits = sa->arg3;
- size_t slot = sa->arg4;
+ INVOCATION_PRELUDE(7);
+ capaddr_t croot_cptr = sa->arg2;
+ capaddr_t cnode_cptr = sa->arg3;
+ int cnode_level = sa->arg4;
+ size_t slot = sa->arg5;
// user pointer to src cap, check access
- if (!access_ok(ACCESS_READ, sa->arg5, sizeof(struct capability))) {
+ if (!access_ok(ACCESS_READ, sa->arg6, sizeof(struct capability))) {
return SYSRET(SYS_ERR_INVALID_USER_BUFFER);
}
/* Get the raw metadata of the capability to create from user pointer */
- struct capability *src = (struct capability *)sa->arg5;
+ struct capability *src = (struct capability *)sa->arg6;
- return sys_monitor_copy_existing(src, cnode_cptr, cnode_vbits, slot);
+ return sys_monitor_copy_existing(src, croot_cptr, cnode_cptr, cnode_level, slot);
}
INVOCATION_HANDLER(monitor_nullify_cap)
*/
/*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
+ * Copyright (c) 2007, 2008, 2009, 2010, 2016, ETH Zurich.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
*/
#ifndef MONITOR_INVOCATIONS_ARCH_H
#include "monitor_debug.h"
static inline errval_t
-invoke_monitor_identify_cap(capaddr_t cap, int bits, struct capability *out)
+invoke_monitor_create_cap(uint64_t *raw, capaddr_t caddr, int level, capaddr_t slot, coreid_t owner)
{
DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall5((invoke_bits << 16) | (KernelCmd_Identify_cap << 8)
- | SYSCALL_INVOKE, invoke_cptr, cap, bits,
- (uintptr_t)out).error;
-}
-
-static inline errval_t
-invoke_monitor_identify_domains_cap(capaddr_t root_cap, int root_bits,
- capaddr_t cap, int bits,
- struct capability *out)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall7((invoke_bits << 16) | (KernelCmd_Identify_domains_cap << 8)
- | SYSCALL_INVOKE, invoke_cptr, root_cap, root_bits,
- cap, bits, (uintptr_t)out).error;
-}
-
-static inline errval_t
-invoke_monitor_nullify_cap(capaddr_t cap, int bits)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall4((invoke_bits << 16) | (KernelCmd_Nullify_cap << 8)
- | SYSCALL_INVOKE, invoke_cptr, cap, bits).error;
-}
-
-static inline errval_t
-invoke_monitor_create_cap(uint64_t *raw, capaddr_t caddr, int bits, capaddr_t slot, coreid_t owner)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke6(cap_kernel, KernelCmd_Create_cap, caddr, bits, slot,
+ return cap_invoke6(cap_kernel, KernelCmd_Create_cap, caddr, level, slot,
owner, (uintptr_t)raw).error;
}
-static inline errval_t
-invoke_monitor_register(struct capref ep)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall3((invoke_bits << 16) | (KernelCmd_Register << 8)
- | SYSCALL_INVOKE, invoke_cptr, get_cap_addr(ep)).error;
-}
-
STATIC_ASSERT(ObjType_Num < 0xFFFF, "retype invocation argument packing does not truncate enum objtype");
static inline errval_t
-invoke_monitor_remote_cap_retype(capaddr_t rootcap_addr, uint8_t rootcap_vbits,
- capaddr_t src, gensize_t offset, enum objtype newtype,
- gensize_t objsize, size_t count, capaddr_t to,
- capaddr_t slot, int bits)
+invoke_monitor_remote_cap_retype(capaddr_t src_root, capaddr_t src, gensize_t offset,
+ enum objtype newtype, gensize_t objsize, size_t count,
+ capaddr_t to_cspace, capaddr_t to, capaddr_t slot,
+ int level)
{
DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- assert(bits <= 0xFF);
+ assert(newtype < ObjType_Num);
+ assert(level <= 0xFF);
assert(slot <= 0xFFFF);
- return cap_invoke8(cap_kernel, KernelCmd_Retype,
- src, offset,
- ((uint64_t)slot << 32) | ((uint64_t)bits << 16) | newtype,
- objsize, count, to,
- ((uint64_t)rootcap_addr | (uint64_t)rootcap_vbits << 32)
- ).error;
-}
-
-static inline errval_t
-invoke_monitor_get_cap_owner(capaddr_t root, int rbits, capaddr_t cap, int cbits, coreid_t *ret_owner)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- struct sysret sysret = cap_invoke5(cap_kernel, KernelCmd_Get_cap_owner,
- root, rbits, cap, cbits);
- if (err_is_ok(sysret.error)) {
- *ret_owner = sysret.value;
- }
- return sysret.error;
-}
-
-static inline errval_t
-invoke_monitor_set_cap_owner(capaddr_t root, int rbits, capaddr_t cap, int cbits, coreid_t owner)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke6(cap_kernel, KernelCmd_Set_cap_owner, root, rbits, cap, cbits, owner).error;
-}
-
-
-static inline errval_t
-invoke_monitor_remote_relations(capaddr_t root_cap, int root_bits,
- capaddr_t cap, int bits,
- uint8_t relations, uint8_t mask,
- uint8_t *ret_remote_relations)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- struct sysret r = cap_invoke6(cap_kernel, KernelCmd_Remote_relations,
- root_cap, root_bits, cap, bits,
- ((uint16_t)relations) | (((uint16_t)mask)<<8));
- if (err_is_ok(r.error) && ret_remote_relations) {
- *ret_remote_relations = r.value;
- }
- return r.error;
-}
-
-static inline errval_t
-invoke_monitor_cap_has_relations(capaddr_t caddr, uint8_t bits, uint8_t mask, uint8_t *res)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- assert(res);
- struct sysret ret = cap_invoke4(cap_kernel, KernelCmd_Cap_has_relations,
- caddr, bits, mask);
- if (err_is_ok(ret.error)) {
- *res = ret.value;
- }
- return ret.error;
-}
-
-
-static inline errval_t
-invoke_monitor_lock_cap(capaddr_t root, int rbits, capaddr_t cap, int cbits)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke5(cap_kernel, KernelCmd_Lock_cap, root, rbits, cap, cbits).error;
-}
-
-static inline errval_t
-invoke_monitor_unlock_cap(capaddr_t root, int rbits, capaddr_t cap, int cbits)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke5(cap_kernel, KernelCmd_Unlock_cap, root, rbits, cap, cbits).error;
-}
-
-static inline errval_t
-invoke_monitor_delete_last(capaddr_t root, int rbits, capaddr_t cap, int cbits,
- capaddr_t retcn, int retcnbits, cslot_t retslot)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- assert(rbits <= 0xff);
- assert(cbits <= 0xff);
- assert(retcnbits <= 0xff);
-
- return cap_invoke6(cap_kernel, KernelCmd_Delete_last, root, cap,
- retcn, retslot, ((cbits<<16)|(rbits<<8)|retcnbits)).error;
-}
-
-static inline errval_t
-invoke_monitor_delete_foreigns(capaddr_t cap, int bits)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke3(cap_kernel, KernelCmd_Delete_foreigns, cap, bits).error;
-}
-
-static inline errval_t
-invoke_monitor_revoke_mark_target(capaddr_t root, int rbits,
- capaddr_t cap, int cbits)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke5(cap_kernel, KernelCmd_Revoke_mark_target,
- root, rbits, cap, cbits).error;
+ return cap_invoke10(cap_kernel, KernelCmd_Retype,
+ src_root, src, offset, ((uint32_t)level << 16) | newtype,
+ objsize, count, to_cspace, to, slot).error;
}
static inline errval_t
}
static inline errval_t
-invoke_monitor_delete_step(capaddr_t retcn, int retcnbits, cslot_t retslot)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke4(cap_kernel, KernelCmd_Delete_step,
- retcn, retcnbits, retslot).error;
-}
-
-static inline errval_t
-invoke_monitor_clear_step(capaddr_t retcn, int retcnbits, cslot_t retslot)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- return cap_invoke4(cap_kernel, KernelCmd_Clear_step,
- retcn, retcnbits, retslot).error;
-}
-
-static inline errval_t
invoke_monitor_has_descendants(uint64_t *raw, bool *res)
{
DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
return sysret.error;
}
+static inline errval_t
+invoke_monitor_is_retypeable(uint64_t *raw, gensize_t offset,
+ gensize_t objsize, size_t count)
+{
+ assert(sizeof(struct capability) <= 4*sizeof(uint64_t));
+ return cap_invoke5(cap_kernel, KernelCmd_Is_retypeable,
+ (uintptr_t)raw, offset, objsize, count).error;
+}
/**
* \brief Set up tracing in the kernel
return LIB_ERR_NOT_IMPLEMENTED;
}
-static inline errval_t
-invoke_monitor_rck_register(struct capref kern_cap, struct capref ep,
- int chanid)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- USER_PANIC("NYI");
- return LIB_ERR_NOT_IMPLEMENTED;
-}
-
-static inline errval_t
-invoke_monitor_rck_delete(struct capref kern_cap, int chanid)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- USER_PANIC("NYI");
- return LIB_ERR_NOT_IMPLEMENTED;
-}
-
static inline errval_t invoke_monitor_sync_timer(uint64_t synctime)
{
DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall4((invoke_bits << 16) | (KernelCmd_Sync_timer << 8)
- | SYSCALL_INVOKE, invoke_cptr, synctime >> 32,
- synctime & 0xffffffff).error;
+ // XXX: could do cap_invoke1() here, as we have 64 bit GP registers
+ return cap_invoke2(cap_kernel, synctime >> 32, synctime & 0xffffffff).error;
}
static inline errval_t
-invoke_monitor_get_arch_id(uintptr_t *arch_id)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- assert(arch_id != NULL);
-
- struct sysret sysret = cap_invoke1(cap_kernel, KernelCmd_Get_arch_id);
- if (err_is_ok(sysret.error)) {
- *arch_id = sysret.value;
- }
- return sysret.error;
-}
-
-static inline errval_t
-invoke_monitor_ipi_register(struct capref ep, int chanid)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall4((invoke_bits << 16) | (KernelCmd_IPI_Register << 8)
- | SYSCALL_INVOKE, invoke_cptr,
- get_cap_addr(ep),
- chanid).error;
-}
-
-static inline errval_t
-invoke_monitor_ipi_delete(int chanid)
-{
- DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
- uint8_t invoke_bits = get_cap_valid_bits(cap_kernel);
- capaddr_t invoke_cptr = get_cap_addr(cap_kernel) >> (CPTR_BITS - invoke_bits);
-
- return syscall3((invoke_bits << 16) | (KernelCmd_IPI_Delete << 8)
- | SYSCALL_INVOKE, invoke_cptr,
- chanid).error;
-}
-
-static inline errval_t
-invoke_monitor_copy_existing(uint64_t *raw, capaddr_t cn_addr, int cn_bits, cslot_t slot)
+invoke_monitor_copy_existing(uint64_t *raw, capaddr_t croot_addr, capaddr_t cn_addr,
+ int cn_level, cslot_t slot)
{
DEBUG_INVOCATION("%s: called from %p\n", __FUNCTION__, __builtin_return_address(0));
// XXX: this is assumed in client code of this function!
assert(sizeof(struct capability) <= 4*sizeof(uint64_t));
- return cap_invoke5(cap_kernel, KernelCmd_Copy_existing,
- cn_addr, cn_bits, slot, (uintptr_t)raw).error;
-}
-
-static inline errval_t
-invoke_monitor_add_kcb(uintptr_t kcb_base)
-{
- assert(kcb_base);
- return cap_invoke2(cap_kernel, KernelCmd_Add_kcb, kcb_base).error;
-}
-
-static inline errval_t
-invoke_monitor_remove_kcb(uintptr_t kcb_base)
-{
- assert(kcb_base);
- return cap_invoke2(cap_kernel, KernelCmd_Remove_kcb, kcb_base).error;
-}
-
-static inline errval_t
-invoke_monitor_suspend_kcb_scheduler(bool suspend)
-{
- return cap_invoke2(cap_kernel, KernelCmd_Suspend_kcb_sched, suspend).error;
-}
-
-static inline errval_t invoke_get_platform_info(uintptr_t pi)
-{
- return cap_invoke2(cap_kernel, KernelCmd_Get_platform, pi).error;
+ return cap_invoke6(cap_kernel, KernelCmd_Copy_existing,
+ croot_addr, cn_addr, cn_level, slot, (uintptr_t)raw).error;
}
#endif