Commit 5f26f114 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'asm-generic-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic

Pull asm-generic updates from Arnd Bergmann:
 "The asm-generic changes for 5.3 consist of a cleanup series to remove
  ptrace.h from Christoph Hellwig, who explains:

    'asm-generic/ptrace.h is a little weird in that it doesn't actually
     implement any functionality, but it provided multiple layers of
     macros that just implement trivial inline functions. We implement
     those directly in the few architectures and be off with a much
     simpler design.'

  at https://lore.kernel.org/lkml/20190624054728.30966-1-hch@lst.de/"

* tag 'asm-generic-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic:
  asm-generic: remove ptrace.h
  x86: don't use asm-generic/ptrace.h
  sh: don't use asm-generic/ptrace.h
  powerpc: don't use asm-generic/ptrace.h
  arm64: don't use asm-generic/ptrace.h
parents aabfea8d 7f3a8dff
...@@ -12930,7 +12930,6 @@ F: include/linux/regset.h ...@@ -12930,7 +12930,6 @@ F: include/linux/regset.h
F: include/linux/tracehook.h F: include/linux/tracehook.h
F: include/uapi/linux/ptrace.h F: include/uapi/linux/ptrace.h
F: include/uapi/linux/ptrace.h F: include/uapi/linux/ptrace.h
F: include/asm-generic/ptrace.h
F: kernel/ptrace.c F: kernel/ptrace.c
F: arch/*/ptrace*.c F: arch/*/ptrace*.c
F: arch/*/*/ptrace*.c F: arch/*/*/ptrace*.c
......
...@@ -223,11 +223,12 @@ static inline void forget_syscall(struct pt_regs *regs) ...@@ -223,11 +223,12 @@ static inline void forget_syscall(struct pt_regs *regs)
#define fast_interrupts_enabled(regs) \ #define fast_interrupts_enabled(regs) \
(!((regs)->pstate & PSR_F_BIT)) (!((regs)->pstate & PSR_F_BIT))
#define GET_USP(regs) \ static inline unsigned long user_stack_pointer(struct pt_regs *regs)
(!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) {
if (compat_user_mode(regs))
#define SET_USP(ptregs, value) \ return regs->compat_sp;
(!compat_user_mode(regs) ? ((regs)->sp = value) : ((regs)->compat_sp = value)) return regs->sp;
}
extern int regs_query_register_offset(const char *name); extern int regs_query_register_offset(const char *name);
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
...@@ -326,13 +327,20 @@ static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs, ...@@ -326,13 +327,20 @@ static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs,
struct task_struct; struct task_struct;
int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task); int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task);
#define GET_IP(regs) ((unsigned long)(regs)->pc) static inline unsigned long instruction_pointer(struct pt_regs *regs)
#define SET_IP(regs, value) ((regs)->pc = ((u64) (value))) {
return regs->pc;
#define GET_FP(ptregs) ((unsigned long)(ptregs)->regs[29]) }
#define SET_FP(ptregs, value) ((ptregs)->regs[29] = ((u64) (value))) static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->pc = val;
}
#include <asm-generic/ptrace.h> static inline unsigned long frame_pointer(struct pt_regs *regs)
{
return regs->regs[29];
}
#define procedure_link_pointer(regs) ((regs)->regs[30]) #define procedure_link_pointer(regs) ((regs)->regs[30])
...@@ -342,7 +350,6 @@ static inline void procedure_link_pointer_set(struct pt_regs *regs, ...@@ -342,7 +350,6 @@ static inline void procedure_link_pointer_set(struct pt_regs *regs,
procedure_link_pointer(regs) = val; procedure_link_pointer(regs) = val;
} }
#undef profile_pc
extern unsigned long profile_pc(struct pt_regs *regs); extern unsigned long profile_pc(struct pt_regs *regs);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -56,11 +56,6 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) ...@@ -56,11 +56,6 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
return regs->regs[31]; return regs->regs[31];
} }
/*
* Don't use asm-generic/ptrace.h it defines FP accessors that don't make
* sense on MIPS. We rather want an error if they get invoked.
*/
static inline void instruction_pointer_set(struct pt_regs *regs, static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val) unsigned long val)
{ {
......
...@@ -111,18 +111,33 @@ struct pt_regs ...@@ -111,18 +111,33 @@ struct pt_regs
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#define GET_IP(regs) ((regs)->nip) static inline unsigned long instruction_pointer(struct pt_regs *regs)
#define GET_USP(regs) ((regs)->gpr[1]) {
#define GET_FP(regs) (0) return regs->nip;
#define SET_FP(regs, val) }
static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->nip = val;
}
static inline unsigned long user_stack_pointer(struct pt_regs *regs)
{
return regs->gpr[1];
}
static inline unsigned long frame_pointer(struct pt_regs *regs)
{
return 0;
}
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern unsigned long profile_pc(struct pt_regs *regs); extern unsigned long profile_pc(struct pt_regs *regs);
#define profile_pc profile_pc #else
#define profile_pc(regs) instruction_pointer(regs)
#endif #endif
#include <asm-generic/ptrace.h>
#define kernel_stack_pointer(regs) ((regs)->gpr[1]) #define kernel_stack_pointer(regs) ((regs)->gpr[1])
static inline int is_syscall_success(struct pt_regs *regs) static inline int is_syscall_success(struct pt_regs *regs)
{ {
......
...@@ -16,8 +16,31 @@ ...@@ -16,8 +16,31 @@
#define user_mode(regs) (((regs)->sr & 0x40000000)==0) #define user_mode(regs) (((regs)->sr & 0x40000000)==0)
#define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) #define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15])
#define GET_FP(regs) ((regs)->regs[14]) static inline unsigned long instruction_pointer(struct pt_regs *regs)
#define GET_USP(regs) ((regs)->regs[15]) {
return regs->pc;
}
static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->pc = val;
}
static inline unsigned long frame_pointer(struct pt_regs *regs)
{
return regs->regs[14];
}
static inline unsigned long user_stack_pointer(struct pt_regs *regs)
{
return regs->regs[15];
}
static inline void user_stack_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->regs[15] = val;
}
#define arch_has_single_step() (1) #define arch_has_single_step() (1)
...@@ -112,7 +135,5 @@ static inline unsigned long profile_pc(struct pt_regs *regs) ...@@ -112,7 +135,5 @@ static inline unsigned long profile_pc(struct pt_regs *regs)
return pc; return pc;
} }
#define profile_pc profile_pc
#include <asm-generic/ptrace.h>
#endif /* __ASM_SH_PTRACE_H */ #endif /* __ASM_SH_PTRACE_H */
...@@ -98,7 +98,6 @@ struct cpuinfo_x86; ...@@ -98,7 +98,6 @@ struct cpuinfo_x86;
struct task_struct; struct task_struct;
extern unsigned long profile_pc(struct pt_regs *regs); extern unsigned long profile_pc(struct pt_regs *regs);
#define profile_pc profile_pc
extern unsigned long extern unsigned long
convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
...@@ -170,11 +169,32 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) ...@@ -170,11 +169,32 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
return regs->sp; return regs->sp;
} }
#define GET_IP(regs) ((regs)->ip) static inline unsigned long instruction_pointer(struct pt_regs *regs)
#define GET_FP(regs) ((regs)->bp) {
#define GET_USP(regs) ((regs)->sp) return regs->ip;
}
static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->ip = val;
}
static inline unsigned long frame_pointer(struct pt_regs *regs)
{
return regs->bp;
}
#include <asm-generic/ptrace.h> static inline unsigned long user_stack_pointer(struct pt_regs *regs)
{
return regs->sp;
}
static inline void user_stack_pointer_set(struct pt_regs *regs,
unsigned long val)
{
regs->sp = val;
}
/* Query offset/name of register from its name/offset */ /* Query offset/name of register from its name/offset */
extern int regs_query_register_offset(const char *name); extern int regs_query_register_offset(const char *name);
......
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Common low level (register) ptrace helpers
*
* Copyright 2004-2011 Analog Devices Inc.
*/
#ifndef __ASM_GENERIC_PTRACE_H__
#define __ASM_GENERIC_PTRACE_H__
#ifndef __ASSEMBLY__
/* Helpers for working with the instruction pointer */
#ifndef GET_IP
#define GET_IP(regs) ((regs)->pc)
#endif
#ifndef SET_IP
#define SET_IP(regs, val) (GET_IP(regs) = (val))
#endif
static inline unsigned long instruction_pointer(struct pt_regs *regs)
{
return GET_IP(regs);
}
static inline void instruction_pointer_set(struct pt_regs *regs,
unsigned long val)
{
SET_IP(regs, val);
}
#ifndef profile_pc
#define profile_pc(regs) instruction_pointer(regs)
#endif
/* Helpers for working with the user stack pointer */
#ifndef GET_USP
#define GET_USP(regs) ((regs)->usp)
#endif
#ifndef SET_USP
#define SET_USP(regs, val) (GET_USP(regs) = (val))
#endif
static inline unsigned long user_stack_pointer(struct pt_regs *regs)
{
return GET_USP(regs);
}
static inline void user_stack_pointer_set(struct pt_regs *regs,
unsigned long val)
{
SET_USP(regs, val);
}
/* Helpers for working with the frame pointer */
#ifndef GET_FP
#define GET_FP(regs) ((regs)->fp)
#endif
#ifndef SET_FP
#define SET_FP(regs, val) (GET_FP(regs) = (val))
#endif
static inline unsigned long frame_pointer(struct pt_regs *regs)
{
return GET_FP(regs);
}
static inline void frame_pointer_set(struct pt_regs *regs,
unsigned long val)
{
SET_FP(regs, val);
}
#endif /* __ASSEMBLY__ */
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment