mirror of
https://github.com/drasko/codezero.git
synced 2026-02-28 09:43:14 +01:00
Added posix code
This commit is contained in:
157
conts/posix/mm0/include/task.h
Normal file
157
conts/posix/mm0/include/task.h
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Thread control block.
|
||||
*
|
||||
* Copyright (C) 2007, 2008 Bahadir Balban
|
||||
*/
|
||||
#ifndef __TASK_H__
|
||||
#define __TASK_H__
|
||||
|
||||
#include <l4/macros.h>
|
||||
#include <l4/types.h>
|
||||
#include INC_GLUE(memlayout.h)
|
||||
#include <l4/lib/list.h>
|
||||
#include <l4lib/arch/types.h>
|
||||
#include <l4lib/arch/syscalls.h>
|
||||
#include <l4lib/utcb.h>
|
||||
#include <lib/addr.h>
|
||||
#include <l4/api/kip.h>
|
||||
#include <exec.h>
|
||||
|
||||
#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 link list;
|
||||
int tcb_refs;
|
||||
};
|
||||
|
||||
struct utcb_desc {
|
||||
struct link list;
|
||||
unsigned long utcb_base;
|
||||
struct id_pool *slots;
|
||||
};
|
||||
|
||||
struct utcb_head {
|
||||
struct link list;
|
||||
int tcb_refs;
|
||||
};
|
||||
|
||||
|
||||
/* Stores all task information that can be kept in userspace. */
|
||||
struct tcb {
|
||||
/* Task list */
|
||||
struct link list;
|
||||
|
||||
/* Fields for parent-child relations */
|
||||
struct link child_ref; /* Child ref in parent's list */
|
||||
struct link 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 link 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__ */
|
||||
Reference in New Issue
Block a user