OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [include/] [l4/] [generic/] [tcb.h] - Rev 7

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * Thread Control Block, kernel portion.
 *
 * Copyright (C) 2007-2009 Bahadir Bilgehan Balban
 */
#ifndef __TCB_H__
#define __TCB_H__
 
#include <l4/lib/list.h>
#include <l4/lib/mutex.h>
#include <l4/lib/spinlock.h>
#include <l4/generic/scheduler.h>
#include <l4/generic/resource.h>
#include <l4/generic/capability.h>
#include <l4/generic/space.h>
#include INC_GLUE(memory.h)
#include INC_GLUE(syscall.h)
#include INC_GLUE(message.h)
#include INC_GLUE(context.h)
#include INC_SUBARCH(mm.h)
 
 
/*
 * These are a mixture of flags that indicate the task is
 * in a transitional state that could include one or more
 * scheduling states.
 */
#define TASK_INTERRUPTED		(1 << 0)
#define TASK_SUSPENDING			(1 << 1)
#define TASK_RESUMING			(1 << 2)
#define TASK_PENDING_SIGNAL		(TASK_SUSPENDING)
#define TASK_REALTIME			(1 << 5)
 
/*
 * This is to indicate a task (either current or one of
 * its children) exit has occured and cleanup needs to be
 * called
 */
#define TASK_EXITED			(1 << 3)
 
/* Task states */
enum task_state {
	TASK_INACTIVE	= 0,
	TASK_SLEEPING	= 1,
	TASK_RUNNABLE	= 2,
};
 
#define TASK_CID_MASK			0xFF000000
#define TASK_ID_MASK			0x00FFFFFF
#define TASK_CID_SHIFT			24
 
static inline l4id_t tid_to_cid(l4id_t tid)
{
	return (tid & TASK_CID_MASK) >> TASK_CID_SHIFT;
}
 
/* Values that rather have special meaning instead of an id value */
static inline int tid_special_value(l4id_t id)
{
	/* Special ids have top 2 nibbles all set */
	return (id & TASK_CID_MASK) == TASK_CID_MASK;
}
 
#define TASK_ID_INVALID			0xFFFFFFFF
struct task_ids {
	l4id_t tid;
	l4id_t spid;
	l4id_t tgid;
};
 
struct container;
 
struct ktcb {
	/* User context */
	task_context_t context;
 
	/*
	 * Reference to the context on stack
	 * saved at the beginning of a syscall trap.
	 */
	syscall_context_t *syscall_regs;
 
	/* Runqueue related */
	struct link rq_list;
	struct runqueue *rq;
 
	/* Thread Id information (See space for space id) */
	l4id_t tid;		/* Global thread id */
	l4id_t tgid;		/* Global thread group id */
 
	/* CPU affinity */
	int affinity;
 
	/* Other related threads */
	l4id_t pagerid;
 
	/* Flags to indicate various task status */
	unsigned int flags;
 
	/* IPC flags */
	unsigned int ipc_flags;
 
	/* Lock for blocking thread state modifications via a syscall */
	struct mutex thread_control_lock;
 
	/* To protect against thread deletion/modification */
	struct spinlock thread_lock;
 
	u32 ts_need_resched;	/* Scheduling flag */
	enum task_state state;
 
	struct link task_list; /* Global task list. */
 
	/* UTCB related, see utcb.txt in docs */
	unsigned long utcb_address;	/* Virtual ref to task's utcb area */
 
	/* Thread times */
	u32 kernel_time;	/* Ticks spent in kernel */
	u32 user_time;		/* Ticks spent in userland */
	u32 ticks_left;		/* Timeslice ticks left for reschedule */
	u32 ticks_assigned;	/* Ticks assigned to this task on this HZ */
	u32 sched_granule;	/* Granularity ticks left for reschedule */
	int priority;		/* Task's fixed, default priority */
 
	/* Number of locks the task currently has acquired */
	int nlocks;
 
	/* Task exit code */
	unsigned int exit_code;
 
	/* Page table information */
	struct address_space *space;
 
	/* Container */
	struct container *container;
	struct pager *pager;
 
	/* Capability lists */
	struct cap_list cap_list; /* Own private capabilities */
 
	/* Fields for ipc rendezvous */
	struct waitqueue_head wqh_recv;
	struct waitqueue_head wqh_send;
	l4id_t expected_sender;
 
	/* Waitqueue for notifiactions */
	struct waitqueue_head wqh_notify;
 
	/* Waitqueue for pagers to wait for task states */
	struct waitqueue_head wqh_pager;
 
	/* Tells where we are when we sleep */
	struct spinlock waitlock;
	struct waitqueue_head *waiting_on;
	struct waitqueue *wq;
 
	/*
	 * Extended ipc size and buffer that
	 * points to the space after ktcb
	 */
	unsigned long extended_ipc_size;
	char extended_ipc_buffer[];
};
 
/* Per thread kernel stack unified on a single page. */
union ktcb_union {
	struct ktcb ktcb;
	char kstack[PAGE_SIZE];
};
 
/*
 * Each task is allocated a unique global id. A thread group can only belong to
 * a single leader, and every thread can only belong to a single thread group.
 * These rules allow the fact that every global id can be used to define a
 * unique thread group id. Thread local ids are used as an index into the thread
 * group's utcb area to discover the per-thread utcb structure.
 */
static inline void set_task_ids(struct ktcb *task, struct task_ids *ids)
{
	task->tid = ids->tid;
	task->tgid = ids->tgid;
}
 
struct ktcb *tcb_find(l4id_t tid);
struct ktcb *tcb_find_lock(l4id_t tid);
void tcb_add(struct ktcb *tcb);
void tcb_remove(struct ktcb *tcb);
 
void tcb_init(struct ktcb *tcb);
struct ktcb *tcb_alloc_init(l4id_t cid);
void tcb_delete(struct ktcb *tcb);
void tcb_delete_zombies(void);
 
void ktcb_list_remove(struct ktcb *task, struct ktcb_list *ktcb_list);
void ktcb_list_add(struct ktcb *new, struct ktcb_list *ktcb_list);
void init_ktcb_list(struct ktcb_list *ktcb_list);
void task_update_utcb(struct ktcb *task);
int tcb_check_and_lazy_map_utcb(struct ktcb *task, int page_in);
 
#endif /* __TCB_H__ */
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.