linux/arch/powerpc/include/asm/switch_to.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
   3 */
   4#ifndef _ASM_POWERPC_SWITCH_TO_H
   5#define _ASM_POWERPC_SWITCH_TO_H
   6
   7#include <asm/reg.h>
   8
   9struct thread_struct;
  10struct task_struct;
  11struct pt_regs;
  12
  13extern struct task_struct *__switch_to(struct task_struct *,
  14        struct task_struct *);
  15#define switch_to(prev, next, last)     ((last) = __switch_to((prev), (next)))
  16
  17extern struct task_struct *_switch(struct thread_struct *prev,
  18                                   struct thread_struct *next);
  19
  20extern void switch_booke_debug_regs(struct debug_reg *new_debug);
  21
  22extern int emulate_altivec(struct pt_regs *);
  23
  24extern void flush_all_to_thread(struct task_struct *);
  25extern void giveup_all(struct task_struct *);
  26
  27#ifdef CONFIG_PPC_FPU
  28extern void enable_kernel_fp(void);
  29extern void flush_fp_to_thread(struct task_struct *);
  30extern void giveup_fpu(struct task_struct *);
  31extern void save_fpu(struct task_struct *);
  32static inline void disable_kernel_fp(void)
  33{
  34        msr_check_and_clear(MSR_FP);
  35}
  36#else
  37static inline void __giveup_fpu(struct task_struct *t) { }
  38static inline void save_fpu(struct task_struct *t) { }
  39static inline void flush_fp_to_thread(struct task_struct *t) { }
  40#endif
  41
  42#ifdef CONFIG_ALTIVEC
  43extern void enable_kernel_altivec(void);
  44extern void flush_altivec_to_thread(struct task_struct *);
  45extern void giveup_altivec(struct task_struct *);
  46extern void save_altivec(struct task_struct *);
  47static inline void disable_kernel_altivec(void)
  48{
  49        msr_check_and_clear(MSR_VEC);
  50}
  51#else
  52static inline void save_altivec(struct task_struct *t) { }
  53static inline void __giveup_altivec(struct task_struct *t) { }
  54#endif
  55
  56#ifdef CONFIG_VSX
  57extern void enable_kernel_vsx(void);
  58extern void flush_vsx_to_thread(struct task_struct *);
  59static inline void disable_kernel_vsx(void)
  60{
  61        msr_check_and_clear(MSR_FP|MSR_VEC|MSR_VSX);
  62}
  63#endif
  64
  65#ifdef CONFIG_SPE
  66extern void enable_kernel_spe(void);
  67extern void flush_spe_to_thread(struct task_struct *);
  68extern void giveup_spe(struct task_struct *);
  69extern void __giveup_spe(struct task_struct *);
  70static inline void disable_kernel_spe(void)
  71{
  72        msr_check_and_clear(MSR_SPE);
  73}
  74#else
  75static inline void __giveup_spe(struct task_struct *t) { }
  76#endif
  77
  78static inline void clear_task_ebb(struct task_struct *t)
  79{
  80#ifdef CONFIG_PPC_BOOK3S_64
  81    /* EBB perf events are not inherited, so clear all EBB state. */
  82    t->thread.ebbrr = 0;
  83    t->thread.ebbhr = 0;
  84    t->thread.bescr = 0;
  85    t->thread.mmcr2 = 0;
  86    t->thread.mmcr0 = 0;
  87    t->thread.siar = 0;
  88    t->thread.sdar = 0;
  89    t->thread.sier = 0;
  90    t->thread.used_ebb = 0;
  91#endif
  92}
  93
  94#endif /* _ASM_POWERPC_SWITCH_TO_H */
  95