~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/mips/include/asm/dsemul.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-or-later */
  2 /*
  3  * Copyright (C) 2016 Imagination Technologies
  4  * Author: Paul Burton <paul.burton@mips.com>
  5  */
  6 
  7 #ifndef __MIPS_ASM_DSEMUL_H__
  8 #define __MIPS_ASM_DSEMUL_H__
  9 
 10 #include <asm/break.h>
 11 #include <asm/inst.h>
 12 
 13 /* Break instruction with special math emu break code set */
 14 #define BREAK_MATH(micromips)   (((micromips) ? 0x7 : 0xd) | (BRK_MEMU << 16))
 15 
 16 /* When used as a frame index, indicates the lack of a frame */
 17 #define BD_EMUFRAME_NONE        ((int)BIT(31))
 18 
 19 struct mm_struct;
 20 struct pt_regs;
 21 struct task_struct;
 22 
 23 /**
 24  * mips_dsemul() - 'Emulate' an instruction from a branch delay slot
 25  * @regs:       User thread register context.
 26  * @ir:         The instruction to be 'emulated'.
 27  * @branch_pc:  The PC of the branch instruction.
 28  * @cont_pc:    The PC to continue at following 'emulation'.
 29  *
 30  * Emulate or execute an arbitrary MIPS instruction within the context of
 31  * the current user thread. This is used primarily to handle instructions
 32  * in the delay slots of emulated branch instructions, for example FP
 33  * branch instructions on systems without an FPU.
 34  *
 35  * Return: Zero on success, negative if ir is a NOP, signal number on failure.
 36  */
 37 extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir,
 38                        unsigned long branch_pc, unsigned long cont_pc);
 39 
 40 /**
 41  * do_dsemulret() - Return from a delay slot 'emulation' frame
 42  * @xcp:        User thread register context.
 43  *
 44  * Call in response to the BRK_MEMU break instruction used to return to
 45  * the kernel from branch delay slot 'emulation' frames following a call
 46  * to mips_dsemul(). Restores the user thread PC to the value that was
 47  * passed as the cpc parameter to mips_dsemul().
 48  *
 49  * Return: True if an emulation frame was returned from, else false.
 50  */
 51 #ifdef CONFIG_MIPS_FP_SUPPORT
 52 extern bool do_dsemulret(struct pt_regs *xcp);
 53 #else
 54 static inline bool do_dsemulret(struct pt_regs *xcp)
 55 {
 56         return false;
 57 }
 58 #endif
 59 
 60 /**
 61  * dsemul_thread_cleanup() - Cleanup thread 'emulation' frame
 62  * @tsk: The task structure associated with the thread
 63  *
 64  * If the thread @tsk has a branch delay slot 'emulation' frame
 65  * allocated to it then free that frame.
 66  *
 67  * Return: True if a frame was freed, else false.
 68  */
 69 #ifdef CONFIG_MIPS_FP_SUPPORT
 70 extern bool dsemul_thread_cleanup(struct task_struct *tsk);
 71 #else
 72 static inline bool dsemul_thread_cleanup(struct task_struct *tsk)
 73 {
 74         return false;
 75 }
 76 #endif
 77 /**
 78  * dsemul_thread_rollback() - Rollback from an 'emulation' frame
 79  * @regs:       User thread register context.
 80  *
 81  * If the current thread, whose register context is represented by @regs,
 82  * is executing within a delay slot 'emulation' frame then exit that
 83  * frame. The PC will be rolled back to the branch if the instruction
 84  * that was being 'emulated' has not yet executed, or advanced to the
 85  * continuation PC if it has.
 86  *
 87  * Return: True if a frame was exited, else false.
 88  */
 89 #ifdef CONFIG_MIPS_FP_SUPPORT
 90 extern bool dsemul_thread_rollback(struct pt_regs *regs);
 91 #else
 92 static inline bool dsemul_thread_rollback(struct pt_regs *regs)
 93 {
 94         return false;
 95 }
 96 #endif
 97 
 98 /**
 99  * dsemul_mm_cleanup() - Cleanup per-mm delay slot 'emulation' state
100  * @mm:         The struct mm_struct to cleanup state for.
101  *
102  * Cleanup state for the given @mm, ensuring that any memory allocated
103  * for delay slot 'emulation' book-keeping is freed. This is to be called
104  * before @mm is freed in order to avoid memory leaks.
105  */
106 #ifdef CONFIG_MIPS_FP_SUPPORT
107 extern void dsemul_mm_cleanup(struct mm_struct *mm);
108 #else
109 static inline void dsemul_mm_cleanup(struct mm_struct *mm)
110 {
111         /* no-op */
112 }
113 #endif
114 
115 #endif /* __MIPS_ASM_DSEMUL_H__ */
116 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php