Skip to content
Snippets Groups Projects
Commit f86435c0 authored by Adrian Danis's avatar Adrian Danis
Browse files

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
parent 2972de78
No related branches found
No related tags found
No related merge requests found
......@@ -19,146 +19,12 @@
#include <arch/machine/hardware.h>
#include <arch/machine/registerset.h>
/* Arch-independent object types */
enum endpoint_state {
EPState_Idle = 0,
EPState_Send = 1,
EPState_Recv = 2
};
typedef uint32_t endpoint_state_t;
/* Object sizes */
#define EP_SIZE_BITS 4
#define EP_PTR(r) ((endpoint_t *)r)
#define EP_REF(p) ((unsigned int)p)
enum async_endpoint_state {
AEPState_Idle = 0,
AEPState_Waiting = 1,
AEPState_Active = 2
};
typedef uint32_t async_endpoint_state_t;
#define AEP_SIZE_BITS 4
#define AEP_PTR(r) ((async_endpoint_t *)r)
#define AEP_REF(p) ((unsigned int)p)
#define CTE_SIZE_BITS 4
#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_BLOCK_SIZE_BITS (TCB_SIZE_BITS+1)
#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 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): size = 16 bytes */
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,
* such that they fill a 512-byte aligned block. The CNode comes first. */
enum tcb_cnode_index {
/* CSpace root, 16 bytes */
tcbCTable = 0,
/* VSpace root, 16 bytes */
tcbVTable = 1,
/* Reply cap slot, 16 bytes */
tcbReply = 2,
/* TCB of most recent IPC sender, 16 bytes */
tcbCaller = 3,
/* IPC buffer cap slot, 16 bytes */
tcbBuffer = 4,
tcbCNodeEntries
};
typedef uint32_t tcb_cnode_index_t;
/* TCB CNode: size = 256 bytes */
/* typedef cte_t[16] tcb_cnode; */
......@@ -212,18 +78,6 @@ enum vm_rights {
};
typedef uint32_t vm_rights_t;
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;
}
#define PDE_SIZE_BITS 2
#define PDE_PTR(r) ((pde_t *)(r))
#define PDE_REF(p) ((unsigned int)p)
......@@ -253,9 +107,6 @@ typedef uint32_t pde_type_t;
#define PT_REF(p) ((unsigned int)p)
#define WORD_SIZE_BITS 2
#define WORD_BITS (8 * sizeof(word_t))
#define WORD_PTR(r) ((word_t *)(r))
#define WORD_REF(p) ((unsigned int)p)
struct user_data {
word_t words[BIT(ARMSmallPageBits) / sizeof(word_t)];
......@@ -560,15 +411,6 @@ cap_get_capPtr(cap_t cap)
}
}
static inline vm_attributes_t CONST
vmAttributesFromWord(word_t w)
{
vm_attributes_t attr;
attr.words[0] = w;
return attr;
}
static inline word_t CONST
isArchCap(cap_t cap)
{
......
......@@ -20,144 +20,11 @@
#include <arch/machine/hardware.h>
#include <arch/machine/registerset.h>
/* Arch-independent object types */
enum endpoint_state {
EPState_Idle = 0,
EPState_Send = 1,
EPState_Recv = 2
};
typedef uint32_t endpoint_state_t;
/* Object sizes*/
#define EP_SIZE_BITS 4
#define EP_PTR(r) ((endpoint_t *)r)
#define EP_REF(p) ((unsigned int)p)
enum async_endpoint_state {
AEPState_Idle = 0,
AEPState_Waiting = 1,
AEPState_Active = 2
};
typedef uint32_t async_endpoint_state_t;
#define AEP_SIZE_BITS 4
#define AEP_PTR(r) ((async_endpoint_t *)r)
#define AEP_REF(p) ((unsigned int)p)
#define CTE_SIZE_BITS 4
#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_BLOCK_SIZE_BITS 10
#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 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 3;
}
return type;
}
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): size = 16 bytes */
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,
* such that they fill a 1024-byte aligned block. The CNode comes first. */
enum tcb_cnode_index {
/* CSpace root, 16 bytes */
tcbCTable = 0,
/* VSpace root, 16 bytes */
tcbVTable = 1,
/* Reply cap slot, 16 bytes */
tcbReply = 2,
/* TCB of most recent IPC sender, 16 bytes */
tcbCaller = 3,
/* IPC buffer cap slot, 16 bytes */
tcbBuffer = 4,
tcbCNodeEntries
};
typedef uint32_t tcb_cnode_index_t;
/* TCB CNode: size = 256 bytes */
/* typedef cte_t[16] tcb_cnode; */
......@@ -204,10 +71,6 @@ struct tcb {
};
typedef struct tcb tcb_t;
/* Ensure TCB size is sane. */
compile_assert(tcb_size_sane,
(1 << TCB_SIZE_BITS) + sizeof(tcb_t) <= (1 << TCB_BLOCK_SIZE_BITS))
/* IA32-specific object types */
#define GDT_NULL 0
......@@ -297,9 +160,6 @@ compile_assert(gdt_idt_ptr_packed,
sizeof(gdt_idt_ptr_t) == sizeof(uint16_t) * 3)
#define WORD_SIZE_BITS 2
#define WORD_BITS (8 * sizeof(word_t))
#define WORD_PTR(r) ((word_t *)(r))
#define WORD_REF(p) ((unsigned int)(p))
enum vm_rights {
VMKernelOnly = 1,
......@@ -308,18 +168,6 @@ enum vm_rights {
};
typedef uint32_t vm_rights_t;
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;
}
enum asidSizeConstants {
asidHighBits = 6,
asidLowBits = 10
......@@ -534,15 +382,6 @@ cap_get_capPtr(cap_t cap)
}
}
static inline vm_attributes_t CONST
vmAttributesFromWord(word_t w)
{
vm_attributes_t attr;
attr.words[0] = w;
return attr;
}
static inline word_t CONST
isArchCap(cap_t cap)
{
......
......@@ -13,6 +13,7 @@
#include <api/types.h>
#include <stdint.h>
#include <arch/object/structures_gen.h>
enum irq_state {
IRQInactive = 0,
......@@ -27,6 +28,176 @@ typedef struct dschedule {
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment