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. [akpm@linux-foundation.org: add comment, per Sam] [akpm@linux-foundation.org: update comment, per Andy] Signed-off-by: Andy Lutomirski <luto@kernel.org> Acked-by: David S. Miller <davem@davemloft.net> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Andy Lutomirski <luto@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5180e3e24f
commit
069923d87e
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue