root/arch/sh/kernel/process.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. arch_dup_task_struct
  2. free_thread_xstate
  3. arch_release_task_struct
  4. arch_task_cache_init
  5. init_thread_xstate

   1 // SPDX-License-Identifier: GPL-2.0
   2 #include <linux/mm.h>
   3 #include <linux/kernel.h>
   4 #include <linux/slab.h>
   5 #include <linux/sched/signal.h>
   6 #include <linux/sched/task_stack.h>
   7 #include <linux/export.h>
   8 #include <linux/stackprotector.h>
   9 #include <asm/fpu.h>
  10 #include <asm/ptrace.h>
  11 
  12 struct kmem_cache *task_xstate_cachep = NULL;
  13 unsigned int xstate_size;
  14 
  15 #ifdef CONFIG_STACKPROTECTOR
  16 unsigned long __stack_chk_guard __read_mostly;
  17 EXPORT_SYMBOL(__stack_chk_guard);
  18 #endif
  19 
  20 /*
  21  * this gets called so that we can store lazy state into memory and copy the
  22  * current task into the new thread.
  23  */
  24 int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  25 {
  26 #ifdef CONFIG_SUPERH32
  27         unlazy_fpu(src, task_pt_regs(src));
  28 #endif
  29         *dst = *src;
  30 
  31         if (src->thread.xstate) {
  32                 dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep,
  33                                                       GFP_KERNEL);
  34                 if (!dst->thread.xstate)
  35                         return -ENOMEM;
  36                 memcpy(dst->thread.xstate, src->thread.xstate, xstate_size);
  37         }
  38 
  39         return 0;
  40 }
  41 
  42 void free_thread_xstate(struct task_struct *tsk)
  43 {
  44         if (tsk->thread.xstate) {
  45                 kmem_cache_free(task_xstate_cachep, tsk->thread.xstate);
  46                 tsk->thread.xstate = NULL;
  47         }
  48 }
  49 
  50 void arch_release_task_struct(struct task_struct *tsk)
  51 {
  52         free_thread_xstate(tsk);
  53 }
  54 
  55 void arch_task_cache_init(void)
  56 {
  57         if (!xstate_size)
  58                 return;
  59 
  60         task_xstate_cachep = kmem_cache_create("task_xstate", xstate_size,
  61                                                __alignof__(union thread_xstate),
  62                                                SLAB_PANIC, NULL);
  63 }
  64 
  65 #ifdef CONFIG_SH_FPU_EMU
  66 # define HAVE_SOFTFP    1
  67 #else
  68 # define HAVE_SOFTFP    0
  69 #endif
  70 
  71 void init_thread_xstate(void)
  72 {
  73         if (boot_cpu_data.flags & CPU_HAS_FPU)
  74                 xstate_size = sizeof(struct sh_fpu_hard_struct);
  75         else if (HAVE_SOFTFP)
  76                 xstate_size = sizeof(struct sh_fpu_soft_struct);
  77         else
  78                 xstate_size = 0;
  79 }

/* [<][>][^][v][top][bottom][index][help] */