/* Initialize a dde26 thread. * * - Allocate thread data, as well as a Linux task struct, * - Fill in default values for thread_info, and task, * - Adapt task struct's thread_info backreference * - Initialize the DDE sleep lock */ static dde26_thread_data *init_dde26_thread(void) { /* * Virtual PID counter */ static atomic_t pid_counter = ATOMIC_INIT(0); dde26_thread_data *t = vmalloc(sizeof(dde26_thread_data)); Assert(t); memcpy(&t->_vpid, &init_struct_pid, sizeof(struct pid)); t->_vpid.numbers[0].nr = atomic_inc_return(&pid_counter); memcpy(&LX_THREAD(t), &init_thread, sizeof(struct thread_info)); LX_TASK(t) = vmalloc(sizeof(struct task_struct)); Assert(LX_TASK(t)); memcpy(LX_TASK(t), &init_task, sizeof(struct task_struct)); /* nice: Linux backreferences a task`s thread_info from the * task struct (which in turn can be found using the * thread_info...) */ LX_TASK(t)->stack = &LX_THREAD(t); /* initialize this thread's sleep lock */ SLEEP_LOCK(t) = ddekit_sem_init(0); return t; }
/** * Initialize a DDE Linux 2.6 thread * * - Allocate thread data, as well as a Linux task struct, * - Fill in default values for thread_info, and task, * - Adapt task struct's thread_info backreference * - Initialize the DDE sleep lock */ static inline dde_linux26_thread_data *init_dde_linux26_thread(void) { dde_linux26_thread_data *t = vmalloc(sizeof(dde_linux26_thread_data)); dde_kit_assert(t); memcpy(&LX_THREAD(t), &init_thread, sizeof(struct thread_info)); LX_TASK(t) = vmalloc(sizeof(struct task_struct)); dde_kit_assert(LX_TASK(t)); memcpy(LX_TASK(t), &init_task, sizeof(struct task_struct)); /* nice: Linux backreferences a task`s thread_info from the * task struct (which in turn can be found using the * thread_info...) */ LX_TASK(t)->thread_info = &LX_THREAD(t); /* initialize this thread's sleep lock */ SLEEP_LOCK(t) = dde_kit_sem_init(0); return t; }
/***************************************************************************** ** Current() implementation ** *****************************************************************************/ struct thread_info *current_thread_info(void) { dde_linux26_thread_data *cur = (dde_linux26_thread_data *)dde_kit_thread_get_my_data(); return &LX_THREAD(cur); }