patch-2.4.4 linux/include/asm-s390x/ptrace.h

Next file: linux/include/asm-s390x/queue.h
Previous file: linux/include/asm-s390x/pgtable.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.3/linux/include/asm-s390x/ptrace.h linux/include/asm-s390x/ptrace.h
@@ -8,284 +8,266 @@
 
 #ifndef _S390_PTRACE_H
 #define _S390_PTRACE_H
+
+/*
+ * Offsets in the user_regs_struct. They are used for the ptrace
+ * system call and in entry.S
+ */
+#define PT_PSWMASK  0x00
+#define PT_PSWADDR  0x08
+#define PT_GPR0     0x10
+#define PT_GPR1     0x18
+#define PT_GPR2     0x20
+#define PT_GPR3     0x28
+#define PT_GPR4     0x30
+#define PT_GPR5     0x38
+#define PT_GPR6     0x40
+#define PT_GPR7     0x48
+#define PT_GPR8     0x50
+#define PT_GPR9     0x58
+#define PT_GPR10    0x60
+#define PT_GPR11    0x68
+#define PT_GPR12    0x70
+#define PT_GPR13    0x78
+#define PT_GPR14    0x80
+#define PT_GPR15    0x88
+#define PT_ACR0     0x90
+#define PT_ACR1     0x94
+#define PT_ACR2     0x98
+#define PT_ACR3     0x9C
+#define PT_ACR4	    0xA0
+#define PT_ACR5	    0xA4
+#define PT_ACR6	    0xA8
+#define PT_ACR7	    0xAC
+#define PT_ACR8	    0xB0
+#define PT_ACR9	    0xB4
+#define PT_ACR10    0xB8
+#define PT_ACR11    0xBC
+#define PT_ACR12    0xC0
+#define PT_ACR13    0xC4
+#define PT_ACR14    0xC8
+#define PT_ACR15    0xCC
+#define PT_ORIGGPR2 0xD0
+#define PT_FPC	    0xD8
+#define PT_FPR0     0xE0
+#define PT_FPR1     0xE8
+#define PT_FPR2     0xF0
+#define PT_FPR3     0xF8
+#define PT_FPR4     0x100
+#define PT_FPR5     0x108
+#define PT_FPR6     0x110
+#define PT_FPR7     0x118
+#define PT_FPR8     0x120
+#define PT_FPR9     0x128
+#define PT_FPR10    0x130
+#define PT_FPR11    0x138
+#define PT_FPR12    0x140
+#define PT_FPR13    0x148
+#define PT_FPR14    0x150
+#define PT_FPR15    0x158
+#define PT_CR_9     0x160
+#define PT_CR_10    0x168
+#define PT_CR_11    0x170
+#define PT_IEEE_IP  0x1A8
+#define PT_LASTOFF  PT_IEEE_IP
+#define PT_ENDREGS  0x1B0-1
+
+#define NUM_GPRS      16
+#define NUM_FPRS      16
+#define NUM_CRS       16
+#define NUM_ACRS      16
+#define GPR_SIZE      8
+#define FPR_SIZE      8
+#define FPC_SIZE      4
+#define FPC_PAD_SIZE  4 /* gcc insists on aligning the fpregs */
+#define CR_SIZE       8
+#define ACR_SIZE      4
+
+#define STACK_FRAME_OVERHEAD    160      /* size of minimum stack frame */
+
+#ifndef __ASSEMBLY__
 #include <linux/config.h>
-#include <asm/s390-regs-common.h>
-#include <asm/current.h>
+#include <linux/stddef.h>
 #include <linux/types.h>
+
+#include <asm/current.h>
 #include <asm/setup.h>
-#include <linux/stddef.h>
 
+/* this typedef defines how a Program Status Word looks like */
+typedef struct 
+{
+        __u64   mask;
+        __u64   addr;
+} psw_t __attribute__ ((aligned(8)));
 
-#define S390_REGS   \
-S390_REGS_COMMON    \
-addr_t orig_gpr2;
+#ifdef __KERNEL__
+#define FIX_PSW(addr) ((unsigned long)(addr))
+#define ADDR_BITS_REMOVE(addr) ((addr))
+#endif
 
+typedef union
+{
+	float   f;
+	double  d;
+	__u64   ui;
+	struct
+	{
+		__u32 hi;
+		__u32 lo;
+	} fp;
+} freg_t;
+
+typedef struct
+{
+	__u32   fpc;
+	freg_t  fprs[NUM_FPRS];              
+} s390_fp_regs;
+
+#define FPC_EXCEPTION_MASK      0xF8000000
+#define FPC_FLAGS_MASK          0x00F80000
+#define FPC_DXC_MASK            0x0000FF00
+#define FPC_RM_MASK             0x00000003
+#define FPC_VALID_MASK          0xF8F8FF03
+
+/*
+ * The first entries in pt_regs, gdb_pt_regs and user_regs_struct
+ * are common for all three structures. The s390_regs structure
+ * covers the common parts. It simplifies copying the common part
+ * between the three structures.
+ */
 typedef struct
 {
-	S390_REGS
-} __attribute__ ((packed)) s390_regs;
+	psw_t psw;
+	__u64 gprs[NUM_GPRS];
+	__u32 acrs[NUM_ACRS];
+	__u64 orig_gpr2;
+} s390_regs;
 
+/*
+ * The pt_regs struct defines the way the registers are stored on
+ * the stack during a system call.
+ */
 struct pt_regs 
 {
-	S390_REGS
+	psw_t psw;
+	__u64 gprs[NUM_GPRS];
+	__u32 acrs[NUM_ACRS];
+	__u64 orig_gpr2;
 	__u32 trap;
+	__u32 old_ilc;
 } __attribute__ ((packed));
 
+/*
+ * The gdb_pt_regs struct is used instead of the pt_regs structure
+ * if kernel remote debugging is used.
+ */
 #if CONFIG_REMOTE_DEBUG
-typedef struct
+struct gdb_pt_regs
 {
-	S390_REGS
+	psw_t psw;
+	__u64 gprs[NUM_GPRS];
+	__u32 acrs[NUM_ACRS];
+	__u64 orig_gpr2;
 	__u32 trap;
-	addr_t crs[16];
+	__u32 crs[16];
 	s390_fp_regs fp_regs;
-} __attribute__ ((packed)) gdb_pt_regs;
+};
 #endif
 
-
+/*
+ * Now for the program event recording (trace) definitions.
+ */
 typedef struct
 {
-			addr_t   cr[3];
+	__u64 cr[3];
 } per_cr_words  __attribute__((packed));
 
 #define PER_EM_MASK 0x00000000E8000000UL
+
 typedef	struct
 {
-	unsigned    :32;
-	unsigned    em_branching:1;
-	unsigned    em_instruction_fetch:1;
-	/* Switching on storage alteration automatically fixes
-	   the storage alteration event bit in the users std. */
-	unsigned    em_storage_alteration:1;
-	unsigned    em_gpr_alt_unused:1;
-	unsigned    em_store_real_address:1;
-	unsigned    :3;
-	unsigned    branch_addr_ctl:1;
-	unsigned    :1;
-	unsigned    storage_alt_space_ctl:1;
-	unsigned    :5;
-	unsigned    :16;
-	addr_t      starting_addr;
-	addr_t      ending_addr;
+	unsigned                       : 32;
+	unsigned em_branching          : 1;
+	unsigned em_instruction_fetch  : 1;
+	/*
+	 * Switching on storage alteration automatically fixes
+	 * the storage alteration event bit in the users std.
+	 */
+	unsigned em_storage_alteration : 1;
+	unsigned em_gpr_alt_unused     : 1;
+	unsigned em_store_real_address : 1;
+	unsigned                       : 3;
+	unsigned branch_addr_ctl       : 1;
+	unsigned                       : 1;
+	unsigned storage_alt_space_ctl : 1;
+	unsigned                       : 21;
+	addr_t   starting_addr;
+	addr_t   ending_addr;
 } per_cr_bits  __attribute__((packed));
 
 typedef struct
 {
-	__u16          perc_atmid;          /* 0x096 */
-	addr_t         address;             /* 0x098 */
-	__u8           access_id;           /* 0x0a1 */
+	__u16          perc_atmid;
+	addr_t         address;
+	__u8           access_id;
 } per_lowcore_words  __attribute__((packed));
 
 typedef struct
 {
-	unsigned       perc_branching:1;               /* 0x096 */
-	unsigned       perc_instruction_fetch:1;
-	unsigned       perc_storage_alteration:1;
-	unsigned       perc_gpr_alt_unused:1;
-	unsigned       perc_store_real_address:1;
-	unsigned       :3;
-	unsigned       atmid_psw_bit_31:1;
-	unsigned       atmid_validity_bit:1;
-	unsigned       atmid_psw_bit_32:1;
-	unsigned       atmid_psw_bit_5:1;
-	unsigned       atmid_psw_bit_16:1;
-	unsigned       atmid_psw_bit_17:1;
-	unsigned       ai:2;
-	addr_t         address;              /* 0x098 */
-	unsigned       :4;                   /* 0x0a1 */
-	unsigned       access_id:4;           
+	unsigned perc_branching          : 1; /* 0x096 */
+	unsigned perc_instruction_fetch  : 1;
+	unsigned perc_storage_alteration : 1;
+	unsigned perc_gpr_alt_unused     : 1;
+	unsigned perc_store_real_address : 1;
+	unsigned                         : 3;
+	unsigned atmid_psw_bit_31        : 1;
+	unsigned atmid_validity_bit      : 1;
+	unsigned atmid_psw_bit_32        : 1;
+	unsigned atmid_psw_bit_5         : 1;
+	unsigned atmid_psw_bit_16        : 1;
+	unsigned atmid_psw_bit_17        : 1;
+	unsigned si                      : 2;
+	addr_t   address;                     /* 0x098 */
+	unsigned                         : 4; /* 0x0a1 */
+	unsigned access_id               : 4;
 } per_lowcore_bits __attribute__((packed));
 
-
-typedef enum
-{
-	primary_asce,
-	ar_asce,
-	secondary_asce,
-	home_space_asce
-} per_ai_codes;
-
-
-
 typedef struct
 {
-	union
-	{
+	union {
 		per_cr_words   words;
 		per_cr_bits    bits;
 	} control_regs  __attribute__((packed));
-	/* Use these flags instead of setting em_instruction_fetch */
-	/* directly they are used so that single stepping can be */
-	/* switched on & off while not affecting other tracing */
-	unsigned  single_step:1;
-	unsigned  instruction_fetch:1;
-	unsigned  :30;
-	/* These addresses are copied into cr10 & cr11 if single stepping
-	   is switched off */
-	addr_t     starting_addr;
-	addr_t     ending_addr;
-	union
-	{
+	/*
+	 * Use these flags instead of setting em_instruction_fetch
+	 * directly they are used so that single stepping can be
+	 * switched on & off while not affecting other tracing
+	 */
+	unsigned  single_step       : 1;
+	unsigned  instruction_fetch : 1;
+	unsigned                    : 30;
+	/*
+	 * These addresses are copied into cr10 & cr11 if single
+	 * stepping is switched off
+	 */
+	addr_t    starting_addr;
+	addr_t    ending_addr;
+	union {
 		per_lowcore_words words;
 		per_lowcore_bits  bits;
 	} lowcore; 
 } per_struct __attribute__((packed));
 
-
-
-/* this struct defines the way the registers are stored on the
-   stack during a system call. If you change the pt_regs structure,
-   you'll need to change user.h too. 
-
-   N.B. if you modify the pt_regs struct the strace command also has to be
-   modified & recompiled  ( just wait till we have gdb going ).
-
-*/
-
-struct user_regs_struct
-{
-	S390_REGS
-	s390_fp_regs fp_regs;
-/* These per registers are in here so that gdb can modify them itself
- * as there is no "official" ptrace interface for hardware watchpoints.
- * this is the way intel does it
- */
-	per_struct per_info;
-	addr_t  ieee_instruction_pointer; 
-	/* Used to give failing instruction back to user for ieee exceptions */
-};
-
-typedef struct user_regs_struct user_regs_struct;
-
-typedef struct pt_regs pt_regs;
-
-#ifdef __KERNEL__
-#define user_mode(regs) (((regs)->psw.mask & PSW_PROBLEM_STATE) != 0)
-#define instruction_pointer(regs) ((regs)->psw.addr)
-extern void show_regs(struct pt_regs * regs);
-extern char *task_show_regs(struct task_struct *task, char *buffer);
-#endif
-
-
-
-
-
-#define FIX_PSW(addr) ((unsigned long)(addr))
-
-#define MULT_PROCPTR_TYPES    ((CONFIG_BINFMT_ELF)&&(CONFIG_BINFMT_TOC))
-
-typedef struct
-{
-  long addr;
-  long toc;
-} routine_descriptor;
-extern void fix_routine_descriptor_regs(routine_descriptor *rdes,pt_regs *regs);
-extern __inline__ void 
-fix_routine_descriptor_regs(routine_descriptor *rdes,pt_regs *regs)
-{
-  regs->psw.addr=FIX_PSW(rdes->addr);
-  regs->gprs[12]=rdes->toc;
-}
-
-/*
- * Compiler optimisation should save this stuff from being non optimal
- * & remove uneccessary code ( isnt gcc great DJB. )
- */
-
-/*I'm just using this an indicator of what binformat we are using
- * (DJB) N.B. this needs to stay a macro unfortunately as I am otherwise
- * dereferencing incomplete pointer types in with load_toc_binary
- */
-#if MULT_PROCPTR_TYPES
-#define uses_routine_descriptors() \
-(current->binfmt->load_binary==load_toc_binary)
-#else
-#if CONFIG_BINFMT_TOC
-#define uses_routine_descriptors() 1
-#else
-#define uses_routine_descriptors() 0
-#endif
-#endif
-
-#define pt_off(ptreg)   offsetof(user_regs_struct,ptreg)
-enum
-{
-	PT_PSWMASK=pt_off(psw.mask),
-	PT_PSWADDR=pt_off(psw.addr),
-	PT_GPR0=pt_off(gprs[0]),
-	PT_GPR1=pt_off(gprs[1]),
-	PT_GPR2=pt_off(gprs[2]),
-	PT_GPR3=pt_off(gprs[3]),
-	PT_GPR4=pt_off(gprs[4]),
-	PT_GPR5=pt_off(gprs[5]),
-	PT_GPR6=pt_off(gprs[6]),
-	PT_GPR7=pt_off(gprs[7]),
-	PT_GPR8=pt_off(gprs[8]),
-	PT_GPR9=pt_off(gprs[9]),
-	PT_GPR10=pt_off(gprs[10]),
-	PT_GPR11=pt_off(gprs[11]),
-	PT_GPR12=pt_off(gprs[12]),
-	PT_GPR13=pt_off(gprs[13]),
-	PT_GPR14=pt_off(gprs[14]),
-	PT_GPR15=pt_off(gprs[15]),
-        PT_ACR0=pt_off(acrs[0]),
-        PT_ACR1=pt_off(acrs[1]),
-        PT_ACR2=pt_off(acrs[2]),
-        PT_ACR3=pt_off(acrs[3]),
-        PT_ACR4=pt_off(acrs[4]),
-        PT_ACR5=pt_off(acrs[5]),
-        PT_ACR6=pt_off(acrs[6]),
-        PT_ACR7=pt_off(acrs[7]),
-        PT_ACR8=pt_off(acrs[8]),
-        PT_ACR9=pt_off(acrs[9]),
-        PT_ACR10=pt_off(acrs[10]),
-        PT_ACR11=pt_off(acrs[11]),
-        PT_ACR12=pt_off(acrs[12]),
-        PT_ACR13=pt_off(acrs[13]),
-        PT_ACR14=pt_off(acrs[14]),
-        PT_ACR15=pt_off(acrs[15]),
-	PT_ORIGGPR2=pt_off(orig_gpr2),
-	PT_FPC=pt_off(fp_regs.fpc),
-/*
- *      A nasty fact of life that the ptrace api
- *      only supports passing of longs.
- */
-	PT_FPR0=pt_off(fp_regs.fprs[0].d),
-	PT_FPR1=pt_off(fp_regs.fprs[1].d),
-	PT_FPR2=pt_off(fp_regs.fprs[2].d),
-	PT_FPR3=pt_off(fp_regs.fprs[3].d),
-	PT_FPR4=pt_off(fp_regs.fprs[4].d),
-	PT_FPR5=pt_off(fp_regs.fprs[5].d),
-	PT_FPR6=pt_off(fp_regs.fprs[6].d),
-	PT_FPR7=pt_off(fp_regs.fprs[7].d),
-	PT_FPR8=pt_off(fp_regs.fprs[8].d),
-	PT_FPR9=pt_off(fp_regs.fprs[9].d),
-	PT_FPR10=pt_off(fp_regs.fprs[10].d),
-	PT_FPR11=pt_off(fp_regs.fprs[11].d),
-	PT_FPR12=pt_off(fp_regs.fprs[12].d),
-	PT_FPR13=pt_off(fp_regs.fprs[13].d),
-	PT_FPR14=pt_off(fp_regs.fprs[14].d),
-	PT_FPR15=pt_off(fp_regs.fprs[15].d),
-	PT_CR_9=pt_off(per_info.control_regs.words.cr[0]),
-	PT_CR_10=pt_off(per_info.control_regs.words.cr[1]),
-	PT_CR_11=pt_off(per_info.control_regs.words.cr[2]),
-        PT_IEEE_IP=pt_off(ieee_instruction_pointer),
-        PT_LASTOFF=PT_IEEE_IP,
-        PT_ENDREGS=sizeof(user_regs_struct)-1
-};
-
-#define PTRACE_AREA \
-__u32 len;          \
-addr_t  kernel_addr; \
-addr_t  process_addr;
-
 typedef struct
 {
-	 PTRACE_AREA
+	__u32  len;
+	addr_t kernel_addr;
+	addr_t process_addr;
 } ptrace_area;
 
 /*
-  390 specific non posix ptrace requests
-  I chose unusual values so they are unlikely to clash with future ptrace definitions.
+ * S/390 specific non posix ptrace requests. I chose unusual values so
+ * they are unlikely to clash with future ptrace definitions.
  */
 #define PTRACE_PEEKUSR_AREA           0x5000
 #define PTRACE_POKEUSR_AREA           0x5001
@@ -293,7 +275,10 @@
 #define PTRACE_PEEKDATA_AREA	      0x5003
 #define PTRACE_POKETEXT_AREA	      0x5004
 #define PTRACE_POKEDATA_AREA 	      0x5005
-/* PT_PROT definition is loosely based on hppa bsd definition in gdb/hppab-nat.c */
+/*
+ * PT_PROT definition is loosely based on hppa bsd definition in
+ * gdb/hppab-nat.c
+ */
 #define PTRACE_PROT                       21
 
 typedef enum
@@ -309,18 +294,41 @@
 	addr_t           hiaddr;
 	ptprot_flags     prot;
 } ptprot_area;                     
-#endif
-
-
-
-
-
-
-
-
-
 
+/* Sequence of bytes for breakpoint illegal instruction.  */
+#define S390_BREAKPOINT     {0x0,0x1}
+#define S390_BREAKPOINT_U16 ((__u16)0x0001)
+#define S390_SYSCALL_OPCODE ((__u16)0x0a00)
+#define S390_SYSCALL_SIZE   2
 
+/*
+ * The user_regs_struct defines the way the user registers are
+ * store on the stack for signal handling.
+ */
+struct user_regs_struct
+{
+	psw_t psw;
+	__u64 gprs[NUM_GPRS];
+	__u32 acrs[NUM_ACRS];
+	__u64 orig_gpr2;
+	s390_fp_regs fp_regs;
+	/*
+	 * These per registers are in here so that gdb can modify them
+	 * itself as there is no "official" ptrace interface for hardware
+	 * watchpoints. This is the way intel does it.
+	 */
+	per_struct per_info;
+	addr_t  ieee_instruction_pointer; 
+	/* Used to give failing instruction back to user for ieee exceptions */
+};
 
+#ifdef __KERNEL__
+#define user_mode(regs) (((regs)->psw.mask & PSW_PROBLEM_STATE) != 0)
+#define instruction_pointer(regs) ((regs)->psw.addr)
+extern void show_regs(struct pt_regs * regs);
+extern char *task_show_regs(struct task_struct *task, char *buffer);
+#endif
 
+#endif /* __ASSEMBLY__ */
 
+#endif /* _S390X_PTRACE_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)