path: root/arch/sparc
diff options
authorAndy Lutomirski <>2016-03-22 14:24:46 -0700
committerLinus Torvalds <>2016-03-22 15:36:02 -0700
commit069923d87e97a26d5f4ee2d53829f2d3cd05294b (patch)
treed39d5bf65d75410821be53897d9f2d643df5defa /arch/sparc
parent5180e3e24fd3e8e7ea46fbe21e10f5ea3fb1edaa (diff)
sparc/compat: provide an accurate in_compat_syscall implementation
On sparc64 compat-enabled kernels, any task can make 32-bit and 64-bit syscalls. is_compat_task returns true in 32-bit tasks, which does not necessarily imply that the current syscall is 32-bit. Provide an in_compat_syscall implementation that checks whether the current syscall is compat. As far as I know, sparc is the only architecture on which is_compat_task checks the compat status of the task and on which the compat status of a syscall can differ from the compat status of the task. On x86, is_compat_task checks the syscall type, not the task type. [ add comment, per Sam] [ update comment, per Andy] Signed-off-by: Andy Lutomirski <> Acked-by: David S. Miller <> Cc: Sam Ravnborg <> Cc: Andy Lutomirski <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
Diffstat (limited to 'arch/sparc')
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/sparc/include/asm/compat.h b/arch/sparc/include/asm/compat.h
index 830502fe62b4..6f251c4d613e 100644
--- a/arch/sparc/include/asm/compat.h
+++ b/arch/sparc/include/asm/compat.h
@@ -307,4 +307,11 @@ static inline int is_compat_task(void)
return test_thread_flag(TIF_32BIT);
+static inline bool in_compat_syscall(void)
+ /* Vector 0x110 is LINUX_32BIT_SYSCALL_TRAP */
+ return pt_regs_trap_type(current_pt_regs()) == 0x110;
+#define in_compat_syscall in_compat_syscall
#endif /* _ASM_SPARC64_COMPAT_H */