cregit-Linux how code gets into the kernel

Release 4.12 include/linux/sched/task_stack.h

#ifndef _LINUX_SCHED_TASK_STACK_H

#define _LINUX_SCHED_TASK_STACK_H

/*
 * task->stack (kernel stack) handling interfaces:
 */

#include <linux/sched.h>
#include <linux/magic.h>

#ifdef CONFIG_THREAD_INFO_IN_TASK

/*
 * When accessing the stack of a non-current task that might exit, use
 * try_get_task_stack() instead.  task_stack_page will return a pointer
 * that could get freed out from under you.
 */

static inline void *task_stack_page(const struct task_struct *task) { return task->stack; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar19100.00%1100.00%
Total19100.00%1100.00%

#define setup_thread_stack(new,old) do { } while(0)
static inline unsigned long *end_of_stack(const struct task_struct *task) { return task->stack; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar20100.00%1100.00%
Total20100.00%1100.00%

#elif !defined(__HAVE_THREAD_FUNCTIONS) #define task_stack_page(task) ((void *)(task)->stack)
static inline void setup_thread_stack(struct task_struct *p, struct task_struct *org) { *task_thread_info(p) = *task_thread_info(org); task_thread_info(p)->task = p; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar38100.00%1100.00%
Total38100.00%1100.00%

/* * Return the address of the last usable long on the stack. * * When the stack grows down, this is just above the thread * info struct. Going any lower will corrupt the threadinfo. * * When the stack grows up, this is the highest address. * Beyond that position, we corrupt data on the next page. */
static inline unsigned long *end_of_stack(struct task_struct *p) { #ifdef CONFIG_STACK_GROWSUP return (unsigned long *)((unsigned long)task_thread_info(p) + THREAD_SIZE) - 1; #else return (unsigned long *)(task_thread_info(p) + 1); #endif }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar57100.00%1100.00%
Total57100.00%1100.00%

#endif #ifdef CONFIG_THREAD_INFO_IN_TASK
static inline void *try_get_task_stack(struct task_struct *tsk) { return atomic_inc_not_zero(&tsk->stack_refcount) ? task_stack_page(tsk) : NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar29100.00%1100.00%
Total29100.00%1100.00%

extern void put_task_stack(struct task_struct *tsk); #else
static inline void *try_get_task_stack(struct task_struct *tsk) { return task_stack_page(tsk); }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar19100.00%1100.00%
Total19100.00%1100.00%


static inline void put_task_stack(struct task_struct *tsk) {}

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar11100.00%1100.00%
Total11100.00%1100.00%

#endif #define task_stack_end_corrupted(task) \ (*(end_of_stack(task)) != STACK_END_MAGIC)
static inline int object_is_on_stack(void *obj) { void *stack = task_stack_page(current); return (obj >= stack) && (obj < (stack + THREAD_SIZE)); }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar37100.00%1100.00%
Total37100.00%1100.00%

extern void thread_stack_cache_init(void); #ifdef CONFIG_DEBUG_STACK_USAGE
static inline unsigned long stack_not_used(struct task_struct *p) { unsigned long *n = end_of_stack(p); do { /* Skip over canary */ # ifdef CONFIG_STACK_GROWSUP n--; # else n++; # endif } while (!*n); # ifdef CONFIG_STACK_GROWSUP return (unsigned long)end_of_stack(p) - (unsigned long)n; # else return (unsigned long)n - (unsigned long)end_of_stack(p); # endif }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar86100.00%1100.00%
Total86100.00%1100.00%

#endif extern void set_task_stack_end_magic(struct task_struct *tsk); #ifndef __HAVE_ARCH_KSTACK_END
static inline int kstack_end(void *addr) { /* Reliable end of stack detection: * Some APM bios versions misalign the stack */ return !(((unsigned long)addr+sizeof(void*)-1) & (THREAD_SIZE-sizeof(void*))); }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar42100.00%1100.00%
Total42100.00%1100.00%

#endif #endif /* _LINUX_SCHED_TASK_STACK_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar456100.00%4100.00%
Total456100.00%4100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.