ia32.h 3.5 KB
Newer Older
V
Vegard Nossum 已提交
1 2
#ifndef ASM_X86__IA32_H
#define ASM_X86__IA32_H
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16


#ifdef CONFIG_IA32_EMULATION

#include <linux/compat.h>

/*
 * 32 bit structures for IA32 support.
 */

#include <asm/sigcontext32.h>

/* signal.h */
struct sigaction32 {
17 18 19 20 21
	unsigned int  sa_handler;	/* Really a pointer, but need to deal
					   with 32 bits */
	unsigned int sa_flags;
	unsigned int sa_restorer;	/* Another 32 bit pointer */
	compat_sigset_t sa_mask;	/* A 32 bit mask */
L
Linus Torvalds 已提交
22 23 24
};

struct old_sigaction32 {
25 26 27 28 29
	unsigned int  sa_handler;	/* Really a pointer, but need to deal
					   with 32 bits */
	compat_old_sigset_t sa_mask;	/* A 32 bit mask */
	unsigned int sa_flags;
	unsigned int sa_restorer;	/* Another 32 bit pointer */
L
Linus Torvalds 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
};

typedef struct sigaltstack_ia32 {
	unsigned int	ss_sp;
	int		ss_flags;
	unsigned int	ss_size;
} stack_ia32_t;

struct ucontext_ia32 {
	unsigned int	  uc_flags;
	unsigned int 	  uc_link;
	stack_ia32_t	  uc_stack;
	struct sigcontext_ia32 uc_mcontext;
	compat_sigset_t	  uc_sigmask;	/* mask last for extensibility */
};

/* This matches struct stat64 in glibc2.2, hence the absolutely
 * insane amounts of padding around dev_t's.
 */
struct stat64 {
	unsigned long long	st_dev;
	unsigned char		__pad0[4];

#define STAT64_HAS_BROKEN_ST_INO	1
	unsigned int		__st_ino;

	unsigned int		st_mode;
	unsigned int		st_nlink;

	unsigned int		st_uid;
	unsigned int		st_gid;

	unsigned long long	st_rdev;
	unsigned char		__pad3[4];

	long long		st_size;
	unsigned int		st_blksize;

68
	long long		st_blocks;/* Number 512-byte blocks allocated */
L
Linus Torvalds 已提交
69 70 71 72 73 74 75 76 77 78 79

	unsigned 		st_atime;
	unsigned 		st_atime_nsec;
	unsigned 		st_mtime;
	unsigned 		st_mtime_nsec;
	unsigned 		st_ctime;
	unsigned 		st_ctime_nsec;

	unsigned long long	st_ino;
} __attribute__((packed));

80
typedef struct compat_siginfo {
L
Linus Torvalds 已提交
81 82 83 84 85
	int si_signo;
	int si_errno;
	int si_code;

	union {
86
		int _pad[((128 / sizeof(int)) - 3)];
L
Linus Torvalds 已提交
87 88 89 90 91 92 93 94 95

		/* kill() */
		struct {
			unsigned int _pid;	/* sender's pid */
			unsigned int _uid;	/* sender's uid */
		} _kill;

		/* POSIX.1b timers */
		struct {
96
			compat_timer_t _tid;	/* timer id */
L
Linus Torvalds 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
			int _overrun;		/* overrun count */
			compat_sigval_t _sigval;	/* same as below */
			int _sys_private;	/* not to be passed to user */
			int _overrun_incr;	/* amount to add to overrun */
		} _timer;

		/* POSIX.1b signals */
		struct {
			unsigned int _pid;	/* sender's pid */
			unsigned int _uid;	/* sender's uid */
			compat_sigval_t _sigval;
		} _rt;

		/* SIGCHLD */
		struct {
			unsigned int _pid;	/* which child */
			unsigned int _uid;	/* sender's uid */
			int _status;		/* exit code */
			compat_clock_t _utime;
			compat_clock_t _stime;
		} _sigchld;

		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
		struct {
			unsigned int _addr;	/* faulting insn/memory ref. */
		} _sigfault;

		/* SIGPOLL */
		struct {
			int _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
			int _fd;
		} _sigpoll;
	} _sifields;
} compat_siginfo_t;

132 133 134 135 136 137
struct sigframe32 {
	u32 pretcode;
	int sig;
	struct sigcontext_ia32 sc;
	struct _fpstate_ia32 fpstate;
	unsigned int extramask[_COMPAT_NSIG_WORDS-1];
L
Linus Torvalds 已提交
138 139
};

140 141 142 143 144 145 146 147
struct rt_sigframe32 {
	u32 pretcode;
	int sig;
	u32 pinfo;
	u32 puc;
	compat_siginfo_t info;
	struct ucontext_ia32 uc;
	struct _fpstate_ia32 fpstate;
L
Linus Torvalds 已提交
148 149 150
};

struct ustat32 {
151
	__u32			f_tfree;
L
Linus Torvalds 已提交
152 153 154 155 156 157 158 159
	compat_ino_t		f_tinode;
	char			f_fname[6];
	char			f_fpack[6];
};

#define IA32_STACK_TOP IA32_PAGE_OFFSET

#ifdef __KERNEL__
160 161 162
struct linux_binprm;
extern int ia32_setup_arg_pages(struct linux_binprm *bprm,
				unsigned long stack_top, int exec_stack);
163 164
struct mm_struct;
extern void ia32_pick_mmap_layout(struct mm_struct *mm);
165

L
Linus Torvalds 已提交
166 167 168
#endif

#endif /* !CONFIG_IA32_SUPPORT */
169

V
Vegard Nossum 已提交
170
#endif /* ASM_X86__IA32_H */