2 #include <linux/kernel.h>
3 #include <linux/slab.h>
4 #include <linux/sched/signal.h>
5 #include <linux/sched/task_stack.h>
6 #include <linux/export.h>
7 #include <linux/stackprotector.h>
9 #include <asm/ptrace.h>
11 struct kmem_cache
*task_xstate_cachep
= NULL
;
12 unsigned int xstate_size
;
14 #ifdef CONFIG_CC_STACKPROTECTOR
15 unsigned long __stack_chk_guard __read_mostly
;
16 EXPORT_SYMBOL(__stack_chk_guard
);
20 * this gets called so that we can store lazy state into memory and copy the
21 * current task into the new thread.
23 int arch_dup_task_struct(struct task_struct
*dst
, struct task_struct
*src
)
25 #ifdef CONFIG_SUPERH32
26 unlazy_fpu(src
, task_pt_regs(src
));
30 if (src
->thread
.xstate
) {
31 dst
->thread
.xstate
= kmem_cache_alloc(task_xstate_cachep
,
33 if (!dst
->thread
.xstate
)
35 memcpy(dst
->thread
.xstate
, src
->thread
.xstate
, xstate_size
);
41 void free_thread_xstate(struct task_struct
*tsk
)
43 if (tsk
->thread
.xstate
) {
44 kmem_cache_free(task_xstate_cachep
, tsk
->thread
.xstate
);
45 tsk
->thread
.xstate
= NULL
;
49 void arch_release_task_struct(struct task_struct
*tsk
)
51 free_thread_xstate(tsk
);
54 void arch_task_cache_init(void)
59 task_xstate_cachep
= kmem_cache_create("task_xstate", xstate_size
,
60 __alignof__(union thread_xstate
),
61 SLAB_PANIC
| SLAB_NOTRACK
, NULL
);
64 #ifdef CONFIG_SH_FPU_EMU
65 # define HAVE_SOFTFP 1
67 # define HAVE_SOFTFP 0
70 void init_thread_xstate(void)
72 if (boot_cpu_data
.flags
& CPU_HAS_FPU
)
73 xstate_size
= sizeof(struct sh_fpu_hard_struct
);
75 xstate_size
= sizeof(struct sh_fpu_soft_struct
);