seL4/include/object/structures.h
Adrian Danis f86435c0f8 Refactor some common elements across arm and x86 structures.h files.
This change purely changes the ordering of C symbols, as well as
adding some extra checking
2015-06-15 17:17:07 +10:00

203 lines
5 KiB
C

/*
* Copyright 2014, General Dynamics C4 Systems
*
* This software may be distributed and modified according to the terms of
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
* See "LICENSE_GPLv2.txt" for details.
*
* @TAG(GD_GPL)
*/
#ifndef __OBJECT_STRUCTURES_H
#define __OBJECT_STRUCTURES_H
#include <api/types.h>
#include <stdint.h>
#include <arch/object/structures_gen.h>
enum irq_state {
IRQInactive = 0,
IRQNotifyAEP = 1,
IRQTimer = 2,
IRQReserved = 3,
};
typedef uint32_t irq_state_t;
typedef struct dschedule {
dom_t domain;
uint32_t length;
} dschedule_t;
/* Arch-independent object types */
enum endpoint_state {
EPState_Idle = 0,
EPState_Send = 1,
EPState_Recv = 2
};
typedef uint32_t endpoint_state_t;
enum async_endpoint_state {
AEPState_Idle = 0,
AEPState_Waiting = 1,
AEPState_Active = 2
};
typedef uint32_t async_endpoint_state_t;
/* Declare object casts. As the sizes of objects may
* differ by architecture, they are declared in the
* arch structures.h
*/
#define EP_PTR(r) ((endpoint_t *)(r))
#define EP_REF(p) ((unsigned int)(p))
#define AEP_PTR(r) ((async_endpoint_t *)(r))
#define AEP_REF(p) ((unsigned int)(p))
#define CTE_PTR(r) ((cte_t *)(r))
#define CTE_REF(p) ((unsigned int)(p))
#define CNODE_MIN_BITS 1
#define CNODE_PTR(r) (CTE_PTR(r))
#define CNODE_REF(p) (CTE_REF(p)>>CNODE_MIN_BITS)
#define TCB_CNODE_RADIX 4
#define TCB_SIZE_BITS (TCB_CNODE_RADIX + CTE_SIZE_BITS)
#define TCB_OFFSET (1 << TCB_SIZE_BITS)
/* Generate a tcb_t or cte_t pointer from a tcb block reference */
#define TCB_PTR(r) ((tcb_t *)(r))
#define TCB_CTE_PTR(r,i) (((cte_t *)(r))+(i))
#define TCB_REF(p) ((unsigned int)(p))
/* Generate a cte_t pointer from a tcb_t pointer */
#define TCB_PTR_CTE_PTR(p,i) \
(((cte_t *)((unsigned int)(p)&~MASK(TCB_BLOCK_SIZE_BITS)))+(i))
#define WORD_BITS (8 * sizeof(word_t))
#define WORD_PTR(r) ((word_t *)(r))
#define WORD_REF(p) ((unsigned int)(p))
#define ZombieType_ZombieTCB BIT(5)
#define ZombieType_ZombieCNode(n) ((n) & MASK(5))
static inline cap_t CONST
Zombie_new(uint32_t number, uint32_t type, uint32_t ptr)
{
uint32_t mask;
if (type == ZombieType_ZombieTCB) {
mask = MASK(TCB_CNODE_RADIX + 1);
} else {
mask = MASK(type + 1);
}
return cap_zombie_cap_new((ptr & ~mask) | (number & mask), type);
}
static inline uint32_t CONST
cap_zombie_cap_get_capZombieBits(cap_t cap)
{
uint32_t type = cap_zombie_cap_get_capZombieType(cap);
if (type == ZombieType_ZombieTCB) {
return TCB_CNODE_RADIX;
}
return ZombieType_ZombieCNode(type); /* cnode radix */
}
static inline uint32_t CONST
cap_zombie_cap_get_capZombieNumber(cap_t cap)
{
uint32_t radix = cap_zombie_cap_get_capZombieBits(cap);
return cap_zombie_cap_get_capZombieID(cap) & MASK(radix + 1);
}
static inline uint32_t CONST
cap_zombie_cap_get_capZombiePtr(cap_t cap)
{
uint32_t radix = cap_zombie_cap_get_capZombieBits(cap);
return cap_zombie_cap_get_capZombieID(cap) & ~MASK(radix + 1);
}
static inline cap_t CONST
cap_zombie_cap_set_capZombieNumber(cap_t cap, uint32_t n)
{
uint32_t radix = cap_zombie_cap_get_capZombieBits(cap);
uint32_t ptr = cap_zombie_cap_get_capZombieID(cap) & ~MASK(radix + 1);
return cap_zombie_cap_set_capZombieID(cap, ptr | (n & MASK(radix + 1)));
}
/* Capability table entry (CTE) */
struct cte {
cap_t cap;
mdb_node_t cteMDBNode;
};
typedef struct cte cte_t;
#define nullMDBNode mdb_node_new(0, false, false, 0)
/* Thread state */
enum _thread_state {
ThreadState_Inactive = 0,
ThreadState_Running,
ThreadState_Restart,
ThreadState_BlockedOnReceive,
ThreadState_BlockedOnSend,
ThreadState_BlockedOnReply,
ThreadState_BlockedOnAsyncEvent,
ThreadState_IdleThreadState
};
typedef uint32_t _thread_state_t;
/* A TCB CNode and a TCB are always allocated together, and adjacently.
* The CNode comes first. */
enum tcb_cnode_index {
/* CSpace root */
tcbCTable = 0,
/* VSpace root */
tcbVTable = 1,
/* Reply cap slot */
tcbReply = 2,
/* TCB of most recent IPC sender */
tcbCaller = 3,
/* IPC buffer cap slot */
tcbBuffer = 4,
tcbCNodeEntries
};
typedef uint32_t tcb_cnode_index_t;
#include <arch/object/structures.h>
static inline word_t CONST
wordFromVMRights(vm_rights_t vm_rights)
{
return (word_t)vm_rights;
}
static inline vm_rights_t CONST
vmRightsFromWord(word_t w)
{
return (vm_rights_t)w;
}
static inline vm_attributes_t CONST
vmAttributesFromWord(word_t w)
{
vm_attributes_t attr;
attr.words[0] = w;
return attr;
}
/* Ensure object sizes are sane */
compile_assert(cte_size_sane, sizeof(cte_t) <= (1 << CTE_SIZE_BITS))
compile_assert(tcb_size_sane,
(1 << TCB_SIZE_BITS) + sizeof(tcb_t) <= (1 << TCB_BLOCK_SIZE_BITS))
compile_assert(ep_size_sane, sizeof(endpoint_t) <= (1 << EP_SIZE_BITS))
compile_assert(aep_size_sane, sizeof(async_endpoint_t) <= (1 << AEP_SIZE_BITS))
#endif