1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <types.h>
10#include <api/failures.h>
11#include <object/cnode.h>
12#include <object/structures.h>
13#include <plat/machine/hardware.h>
14#include <object/cap.h>
15#include <arch/object/objecttype.h>
16#include <object/interrupt.h>
17
18deriveCap_ret_t deriveCap(cte_t *slot, cap_t cap);
19finaliseCap_ret_t finaliseCap(cap_t cap, bool_t final, bool_t exposed);
20bool_t CONST hasCancelSendRights(cap_t cap);
21bool_t CONST sameRegionAs(cap_t cap_a, cap_t cap_b);
22bool_t CONST sameObjectAs(cap_t cap_a, cap_t cap_b);
23cap_t CONST updateCapData(bool_t preserve, word_t newData, cap_t cap);
24cap_t CONST maskCapRights(seL4_CapRights_t seL4_CapRights, cap_t cap);
25cap_t createObject(object_t t, void *regionBase, word_t, bool_t deviceMemory);
26void createNewObjects(object_t t, cte_t *parent, slot_range_t slots,
27                      void *regionBase, word_t userSize, bool_t deviceMemory);
28#ifdef CONFIG_KERNEL_MCS
29exception_t decodeInvocation(word_t invLabel, word_t length,
30                             cptr_t capIndex, cte_t *slot, cap_t cap,
31                             extra_caps_t excaps, bool_t block, bool_t call,
32                             bool_t canDonate, bool_t firstPhase, word_t *buffer);
33exception_t performInvocation_Endpoint(endpoint_t *ep, word_t badge,
34                                       bool_t canGrant, bool_t canGrantReply,
35                                       bool_t block, bool_t call, bool_t canDonate);
36exception_t performInvocation_Notification(notification_t *ntfn,
37                                           word_t badge);
38exception_t performInvocation_Reply(tcb_t *thread, reply_t *reply, bool_t canGrant);
39#else
40exception_t decodeInvocation(word_t invLabel, word_t length,
41                             cptr_t capIndex, cte_t *slot, cap_t cap,
42                             extra_caps_t excaps, bool_t block, bool_t call,
43                             word_t *buffer);
44exception_t performInvocation_Endpoint(endpoint_t *ep, word_t badge,
45                                       bool_t canGrant, bool_t canGrantReply,
46                                       bool_t block, bool_t call);
47exception_t performInvocation_Notification(notification_t *ntfn,
48                                           word_t badge);
49exception_t performInvocation_Reply(tcb_t *thread, cte_t *slot, bool_t canGrant);
50#endif
51word_t getObjectSize(word_t t, word_t userObjSize);
52
53static inline void postCapDeletion(cap_t cap)
54{
55    if (cap_get_capType(cap) == cap_irq_handler_cap) {
56        irq_t irq = IDX_TO_IRQT(cap_irq_handler_cap_get_capIRQ(cap));
57        deletedIRQHandler(irq);
58    } else if (isArchCap(cap)) {
59        Arch_postCapDeletion(cap);
60    }
61}
62
63