Subject: Re: [2.6 patch] asm/ptrace.h userspace headers cleanup

From: Greg Ungerer <[email-masked]>
Date: Tue, 24 Jun 2008 10:15:52 +1000

Hi Adrian,

Adrian Bunk wrote:
> This patch contains the following cleanups for the asm/ptrace.h 
> userspace headers:
> - include/asm-generic/Kbuild.asm already lists ptrace.h, remove
>   the superfluous listings in the Kbuild files of the following
>   architectures:
>   - cris
>   - frv
>   - powerpc
>   - x86
> - don't expose function prototypes and macros to userspace:
>   - arm
>   - blackfin
>   - cris
>   - mn10300
>   - parisc
> - remove #ifdef CONFIG_'s around #define's:
>   - blackfin
>   - m68knommu
> - sh: AFAIK __SH5__ should work in both kernel and userspace,
>       no need to leak CONFIG_SUPERH64 to userspace
> - xtensa: cosmetical change to remove empty
>             #ifndef __ASSEMBLY__ #else #endif
>           from the userspace headers
> 
> Signed-off-by: Adrian Bunk <[email-masked]>

The m68knommu looks ok.

Acked-by: Greg Ungerer <[email-masked]>

> ---
> 
> Not changed by this patch is the fact that the following architectures 
> have a different struct pt_regs depending on CONFIG_ variables:
> - h8300
> - m68knommu
> - mips
> 
> This does not work in userspace.

Let me do something about that for m68knommu.

Regards
Greg

>  include/asm-arm/ptrace.h           |    6 ++----
>  include/asm-blackfin/ptrace.h      |    6 ++++--
>  include/asm-cris/arch-v10/Kbuild   |    1 -
>  include/asm-cris/arch-v10/ptrace.h |    4 ++++
>  include/asm-cris/arch-v32/Kbuild   |    1 -
>  include/asm-cris/arch-v32/ptrace.h |    4 ++++
>  include/asm-cris/ptrace.h          |    4 +++-
>  include/asm-frv/Kbuild             |    1 -
>  include/asm-m68knommu/ptrace.h     |    2 --
>  include/asm-mn10300/ptrace.h       |    8 ++++++--
>  include/asm-parisc/ptrace.h        |    4 +++-
>  include/asm-powerpc/Kbuild         |    1 -
>  include/asm-sh/ptrace.h            |    2 +-
>  include/asm-x86/Kbuild             |    1 -
>  include/asm-xtensa/ptrace.h        |   10 +++++-----
>  15 files changed, 32 insertions(+), 23 deletions(-)
> 
> fc14755b77cff7af5ff00e938a4c493a669e25cd diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h
> index 7aaa206..8382b75 100644
> --- a/include/asm-arm/ptrace.h
> +++ b/include/asm-arm/ptrace.h
> @@ -139,8 +139,6 @@ static inline int valid_user_regs(struct pt_regs *regs)
>  	return 0;
>  }
>  
> -#endif	/* __KERNEL__ */
> -
>  #define pc_pointer(v) \
>  	((v) & ~PCMASK)
>  
> @@ -153,10 +151,10 @@ extern unsigned long profile_pc(struct pt_regs *regs);
>  #define profile_pc(regs) instruction_pointer(regs)
>  #endif
>  
> -#ifdef __KERNEL__
>  #define predicate(x)		((x) & 0xf0000000)
>  #define PREDICATE_ALWAYS	0xe0000000
> -#endif
> +
> +#endif /* __KERNEL__ */
>  
>  #endif /* __ASSEMBLY__ */
>  
> diff --git a/include/asm-blackfin/ptrace.h b/include/asm-blackfin/ptrace.h
> index b8346cd..a45a80e 100644
> --- a/include/asm-blackfin/ptrace.h
> +++ b/include/asm-blackfin/ptrace.h
> @@ -83,14 +83,14 @@ struct pt_regs {
>  #define PTRACE_GETREGS            12
>  #define PTRACE_SETREGS            13	/* ptrace signal  */
>  
> -#ifdef CONFIG_BINFMT_ELF_FDPIC
>  #define PTRACE_GETFDPIC           31
>  #define PTRACE_GETFDPIC_EXEC      0
>  #define PTRACE_GETFDPIC_INTERP    1
> -#endif
>  
>  #define PS_S  (0x0002)
>  
> +#ifdef __KERNEL__
> +
>  /* user_mode returns true if only one bit is set in IPEND, other than the
>     master interrupt enable.  */
>  #define user_mode(regs) (!(((regs)->ipend & ~0x10) & (((regs)->ipend & ~0x10) - 1)))
> @@ -98,6 +98,8 @@ struct pt_regs {
>  #define profile_pc(regs) instruction_pointer(regs)
>  extern void show_regs(struct pt_regs *);
>  
> +#endif  /*  __KERNEL__  */
> +
>  #endif				/* __ASSEMBLY__ */
>  
>  /*
> diff --git a/include/asm-cris/arch-v10/Kbuild b/include/asm-cris/arch-v10/Kbuild
> index 60e7e1b..7a192e1 100644
> --- a/include/asm-cris/arch-v10/Kbuild
> +++ b/include/asm-cris/arch-v10/Kbuild
> @@ -1,4 +1,3 @@
> -header-y += ptrace.h
>  header-y += user.h
>  header-y += svinto.h
>  header-y += sv_addr_ag.h
> diff --git a/include/asm-cris/arch-v10/ptrace.h b/include/asm-cris/arch-v10/ptrace.h
> index fb14c5e..2f464ea 100644
> --- a/include/asm-cris/arch-v10/ptrace.h
> +++ b/include/asm-cris/arch-v10/ptrace.h
> @@ -106,10 +106,14 @@ struct switch_stack {
>  	unsigned long return_ip; /* ip that _resume will return to */
>  };
>  
> +#ifdef __KERNEL__
> +
>  /* bit 8 is user-mode flag */
>  #define user_mode(regs) (((regs)->dccr & 0x100) != 0)
>  #define instruction_pointer(regs) ((regs)->irp)
>  #define profile_pc(regs) instruction_pointer(regs)
>  extern void show_regs(struct pt_regs *);
>  
> +#endif  /*  __KERNEL__  */
> +
>  #endif
> diff --git a/include/asm-cris/arch-v32/Kbuild b/include/asm-cris/arch-v32/Kbuild
> index a0ec545..35f2fc4 100644
> --- a/include/asm-cris/arch-v32/Kbuild
> +++ b/include/asm-cris/arch-v32/Kbuild
> @@ -1,3 +1,2 @@
> -header-y += ptrace.h
>  header-y += user.h
>  header-y += cryptocop.h
> diff --git a/include/asm-cris/arch-v32/ptrace.h b/include/asm-cris/arch-v32/ptrace.h
> index 516cc70..41f4e86 100644
> --- a/include/asm-cris/arch-v32/ptrace.h
> +++ b/include/asm-cris/arch-v32/ptrace.h
> @@ -106,9 +106,13 @@ struct switch_stack {
>  	unsigned long return_ip; /* ip that _resume will return to */
>  };
>  
> +#ifdef __KERNEL__
> +
>  #define user_mode(regs) (((regs)->ccs & (1 << (U_CCS_BITNR + CCS_SHIFT))) != 0)
>  #define instruction_pointer(regs) ((regs)->erp)
>  extern void show_regs(struct pt_regs *);
>  #define profile_pc(regs) instruction_pointer(regs)
>  
> +#endif  /*  __KERNEL__  */
> +
>  #endif
> diff --git a/include/asm-cris/ptrace.h b/include/asm-cris/ptrace.h
> index 1ec69a7..d910925 100644
> --- a/include/asm-cris/ptrace.h
> +++ b/include/asm-cris/ptrace.h
> @@ -4,11 +4,13 @@
>  #include <asm/arch/ptrace.h>
>  
>  #ifdef __KERNEL__
> +
>  /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
>  #define PTRACE_GETREGS            12
>  #define PTRACE_SETREGS            13
> -#endif
>  
>  #define profile_pc(regs) instruction_pointer(regs)
>  
> +#endif /* __KERNEL__ */
> +
>  #endif /* _CRIS_PTRACE_H */
> diff --git a/include/asm-frv/Kbuild b/include/asm-frv/Kbuild
> index bc3f12c..0f8956d 100644
> --- a/include/asm-frv/Kbuild
> +++ b/include/asm-frv/Kbuild
> @@ -3,4 +3,3 @@ include include/asm-generic/Kbuild.asm
>  header-y += registers.h
>  
>  unifdef-y += termios.h
> -unifdef-y += ptrace.h
> diff --git a/include/asm-m68knommu/ptrace.h b/include/asm-m68knommu/ptrace.h
> index 47258e8..8c9194b 100644
> --- a/include/asm-m68knommu/ptrace.h
> +++ b/include/asm-m68knommu/ptrace.h
> @@ -68,10 +68,8 @@ struct switch_stack {
>  /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
>  #define PTRACE_GETREGS            12
>  #define PTRACE_SETREGS            13
> -#ifdef CONFIG_FPU
>  #define PTRACE_GETFPREGS          14
>  #define PTRACE_SETFPREGS          15
> -#endif
>  
>  #ifdef __KERNEL__
>  
> diff --git a/include/asm-mn10300/ptrace.h b/include/asm-mn10300/ptrace.h
> index b368468..7b06cc6 100644
> --- a/include/asm-mn10300/ptrace.h
> +++ b/include/asm-mn10300/ptrace.h
> @@ -88,12 +88,16 @@ extern struct pt_regs *__frame; /* current frame pointer */
>  /* options set using PTRACE_SETOPTIONS */
>  #define PTRACE_O_TRACESYSGOOD     0x00000001
>  
> -#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
> +#if defined(__KERNEL__)
> +
> +#if !defined(__ASSEMBLY__)
>  #define user_mode(regs)			(((regs)->epsw & EPSW_nSL) == EPSW_nSL)
>  #define instruction_pointer(regs)	((regs)->pc)
>  extern void show_regs(struct pt_regs *);
> -#endif
> +#endif  /*  !__ASSEMBLY  */
>  
>  #define profile_pc(regs) ((regs)->pc)
>  
> +#endif  /*  __KERNEL__  */
> +
>  #endif /* _ASM_PTRACE_H */
> diff --git a/include/asm-parisc/ptrace.h b/include/asm-parisc/ptrace.h
> index 93f990e..3e94c5d 100644
> --- a/include/asm-parisc/ptrace.h
> +++ b/include/asm-parisc/ptrace.h
> @@ -33,7 +33,6 @@ struct pt_regs {
>  	unsigned long ipsw;	/* CR22 */
>  };
>  
> -#define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
>  /*
>   * The numbers chosen here are somewhat arbitrary but absolutely MUST
>   * not overlap with any of the number assigned in <linux/ptrace.h>.
> @@ -43,8 +42,11 @@ struct pt_regs {
>   * since we have taken branch traps too)
>   */
>  #define PTRACE_SINGLEBLOCK	12	/* resume execution until next branch */
> +
>  #ifdef __KERNEL__
>  
> +#define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
> +
>  /* XXX should we use iaoq[1] or iaoq[0] ? */
>  #define user_mode(regs)			(((regs)->iaoq[0] & 3) ? 1 : 0)
>  #define user_space(regs)		(((regs)->iasq[1] != 0) ? 1 : 0)
> diff --git a/include/asm-powerpc/Kbuild b/include/asm-powerpc/Kbuild
> index 7381916..6920904 100644
> --- a/include/asm-powerpc/Kbuild
> +++ b/include/asm-powerpc/Kbuild
> @@ -32,7 +32,6 @@ unifdef-y += elf.h
>  unifdef-y += nvram.h
>  unifdef-y += param.h
>  unifdef-y += posix_types.h
> -unifdef-y += ptrace.h
>  unifdef-y += seccomp.h
>  unifdef-y += signal.h
>  unifdef-y += spu_info.h
> diff --git a/include/asm-sh/ptrace.h b/include/asm-sh/ptrace.h
> index 8d6c92b..7d36dc3 100644
> --- a/include/asm-sh/ptrace.h
> +++ b/include/asm-sh/ptrace.h
> @@ -5,7 +5,7 @@
>   * Copyright (C) 1999, 2000  Niibe Yutaka
>   *
>   */
> -#if defined(__SH5__) || defined(CONFIG_SUPERH64)
> +#if defined(__SH5__)
>  struct pt_regs {
>  	unsigned long long pc;
>  	unsigned long long sr;
> diff --git a/include/asm-x86/Kbuild b/include/asm-x86/Kbuild
> index 1e35545..00473f7 100644
> --- a/include/asm-x86/Kbuild
> +++ b/include/asm-x86/Kbuild
> @@ -19,7 +19,6 @@ unifdef-y += msr.h
>  unifdef-y += mtrr.h
>  unifdef-y += posix_types_32.h
>  unifdef-y += posix_types_64.h
> -unifdef-y += ptrace.h
>  unifdef-y += unistd_32.h
>  unifdef-y += unistd_64.h
>  unifdef-y += vm86.h
> diff --git a/include/asm-xtensa/ptrace.h b/include/asm-xtensa/ptrace.h
> index 422c73e..089b0db 100644
> --- a/include/asm-xtensa/ptrace.h
> +++ b/include/asm-xtensa/ptrace.h
> @@ -73,10 +73,10 @@
>  #define PTRACE_GETXTREGS	18
>  #define PTRACE_SETXTREGS	19
>  
> -#ifndef __ASSEMBLY__
> -
>  #ifdef __KERNEL__
>  
> +#ifndef __ASSEMBLY__
> +
>  /*
>   * This struct defines the way the registers are stored on the
>   * kernel stack during a system call or other kernel entry.
> @@ -122,14 +122,14 @@ extern void show_regs(struct pt_regs *);
>  # ifndef CONFIG_SMP
>  #  define profile_pc(regs) instruction_pointer(regs)
>  # endif
> -#endif /* __KERNEL__ */
>  
>  #else	/* __ASSEMBLY__ */
>  
> -#ifdef __KERNEL__
>  # include <asm/asm-offsets.h>
>  #define PT_REGS_OFFSET	  (KERNEL_STACK_SIZE - PT_USER_SIZE)
> -#endif
>  
>  #endif	/* !__ASSEMBLY__ */
> +
> +#endif  /* __KERNEL__ */
> +
>  #endif	/* _XTENSA_PTRACE_H */
> 
> 

-- 
------------------------------------------------------------------------
Greg Ungerer  --  Chief Software Dude       EMAIL:     [email-masked]
Secure Computing Corporation                PHONE:       +61 7 3435 2888
825 Stanley St,                             FAX:         +61 7 3891 3630
Woolloongabba, QLD, 4102, Australia         WEB: http://www.SnapGear.com