/* * Thread control block. * * Copyright (C) 2007, 2008 Bahadir Balban */ #ifndef __TASK_H__ #define __TASK_H__ #include #include #include INC_GLUE(memlayout.h) #include #include #include #include #include #include #include #define __TASKNAME__ __PAGERNAME__ #define ARGS_MAX DEFAULT_ENV_SIZE #define PATH_MAX PAGE_SIZE #define TASK_FILES_MAX 32 /* POSIX minimum is 4Kb */ #define DEFAULT_ENV_SIZE SZ_4K #define DEFAULT_STACK_SIZE SZ_32K #define DEFAULT_SHPAGE_SIZE PAGE_SIZE #define TASK_SIZE 0x10000000 #define TCB_NO_SHARING 0 #define TCB_SHARED_VM (1 << 0) #define TCB_SHARED_FILES (1 << 1) #define TCB_SHARED_FS (1 << 2) #define TCB_SHARED_TGROUP (1 << 3) #define TCB_SHARED_PARENT (1 << 4) struct vm_file; struct file_descriptor { unsigned long vnum; unsigned long cursor; struct vm_file *vmfile; }; struct task_fd_head { struct file_descriptor fd[TASK_FILES_MAX]; int tcb_refs; }; struct task_vma_head { struct list_head list; int tcb_refs; }; struct utcb_desc { struct list_head list; unsigned long utcb_base; struct id_pool *slots; }; struct utcb_head { struct list_head list; int tcb_refs; }; /* Stores all task information that can be kept in userspace. */ struct tcb { /* Task list */ struct list_head list; /* Fields for parent-child relations */ struct list_head child_ref; /* Child ref in parent's list */ struct list_head children; /* List of children */ struct tcb *parent; /* Parent task */ /* Task creation flags */ unsigned int clone_flags; /* Name of the task */ char name[16]; /* Task ids */ int tid; int spid; int tgid; /* Related task ids */ unsigned int pagerid; /* Task's pager */ /* Task's main address space region, usually USER_AREA_START/END */ unsigned long start; unsigned long end; /* Page aligned program segment marks, ends exclusive as usual */ unsigned long entry; unsigned long text_start; unsigned long text_end; unsigned long data_start; unsigned long data_end; unsigned long bss_start; unsigned long bss_end; unsigned long stack_start; unsigned long stack_end; unsigned long heap_start; unsigned long heap_end; unsigned long args_start; unsigned long args_end; /* Task's mmappable region */ unsigned long map_start; unsigned long map_end; /* Default ipc-shared-page information */ void *shared_page; /* Chain of utcb descriptors */ struct utcb_head *utcb_head; /* Unique utcb address of this task */ unsigned long utcb_address; /* Virtual memory areas */ struct task_vma_head *vm_area_head; /* File descriptors for this task */ struct task_fd_head *files; }; struct tcb_head { struct list_head list; int total; /* Total threads */ }; struct tcb *find_task(int tid); void global_add_task(struct tcb *task); void global_remove_task(struct tcb *task); void task_map_prefault_utcb(struct tcb *mapper, struct tcb *owner); int task_mmap_segments(struct tcb *task, struct vm_file *file, struct exec_file_desc *efd, struct args_struct *args, struct args_struct *env); int task_setup_registers(struct tcb *task, unsigned int pc, unsigned int sp, l4id_t pager); struct tcb *tcb_alloc_init(unsigned int flags); int tcb_destroy(struct tcb *task); int task_start(struct tcb *task); int copy_tcb(struct tcb *to, struct tcb *from, unsigned int flags); int task_release_vmas(struct task_vma_head *vma_head); int task_prefault_regions(struct tcb *task, struct vm_file *f); struct tcb *task_create(struct tcb *orig, struct task_ids *ids, unsigned int ctrl_flags, unsigned int alloc_flags); #endif /* __TASK_H__ */