1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * This software may be distributed and modified according to the terms of
5 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
6 * See "LICENSE_GPLv2.txt" for details.
7 *
8 * @TAG(GD_GPL)
9 */
10
11#ifndef __OBJECT_OBJECTTYPE_H
12#define __OBJECT_OBJECTTYPE_H
13
14#include <types.h>
15#include <api/failures.h>
16#include <object/cnode.h>
17#include <object/structures.h>
18#include <plat/machine/hardware.h>
19#include <object/cap.h>
20#include <arch/object/objecttype.h>
21#include <object/interrupt.h>
22
23deriveCap_ret_t deriveCap(cte_t *slot, cap_t cap);
24finaliseCap_ret_t finaliseCap(cap_t cap, bool_t final, bool_t exposed);
25bool_t CONST hasCancelSendRights(cap_t cap);
26bool_t CONST sameRegionAs(cap_t cap_a, cap_t cap_b);
27bool_t CONST sameObjectAs(cap_t cap_a, cap_t cap_b);
28cap_t CONST updateCapData(bool_t preserve, word_t newData, cap_t cap);
29cap_t CONST maskCapRights(seL4_CapRights_t seL4_CapRights, cap_t cap);
30cap_t createObject(object_t t, void *regionBase, word_t, bool_t deviceMemory);
31void createNewObjects(object_t t, cte_t *parent, slot_range_t slots,
32                      void *regionBase, word_t userSize, bool_t deviceMemory);
33exception_t decodeInvocation(word_t invLabel, word_t length,
34                             cptr_t capIndex, cte_t *slot, cap_t cap,
35                             extra_caps_t excaps, bool_t block, bool_t call,
36                             word_t *buffer);
37exception_t performInvocation_Endpoint(endpoint_t *ep, word_t badge,
38                                       bool_t canGrant, bool_t block,
39                                       bool_t call);
40exception_t performInvocation_Notification(notification_t *ntfn,
41                                           word_t badge);
42exception_t performInvocation_Reply(tcb_t *thread, cte_t *slot);
43word_t getObjectSize(word_t t, word_t userObjSize);
44
45static inline void
46postCapDeletion(cap_t cap)
47{
48    if (cap_get_capType(cap) == cap_irq_handler_cap) {
49        irq_t irq = cap_irq_handler_cap_get_capIRQ(cap);
50        deletedIRQHandler(irq);
51    } else if (isArchCap(cap)) {
52        Arch_postCapDeletion(cap);
53    }
54}
55
56#endif
57