PRE(sys_prctl)
{
*flags |= SfMayBlock;
- PRINT( "prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 );
- // XXX: too simplistic, often not all args are used
- // Nb: can't use "ARG2".."ARG5" here because that's our own macro...
- PRE_REG_READ5(long, "prctl",
- int, option, unsigned long, arg2, unsigned long, arg3,
- unsigned long, arg4, unsigned long, arg5);
- // XXX: totally wrong... we need to look at the 'option' arg, and do
- // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
+ PRINT( "sys_prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 );
+ switch (ARG1) {
+ case VKI_PR_SET_PDEATHSIG:
+ PRE_REG_READ2(int, "prctl", int, option, int, signal);
+ break;
+ case VKI_PR_GET_PDEATHSIG:
+ PRE_REG_READ2(int, "prctl", int, option, int *, signal);
+ PRE_MEM_WRITE("prctl(get-death-signal)", ARG2, sizeof(Int));
+ break;
+ case VKI_PR_GET_DUMPABLE:
+ PRE_REG_READ1(int, "prctl", int, option);
+ break;
+ case VKI_PR_SET_DUMPABLE:
+ PRE_REG_READ2(int, "prctl", int, option, int, dump);
+ break;
+ case VKI_PR_GET_UNALIGN:
+ PRE_REG_READ2(int, "prctl", int, option, int *, value);
+ PRE_MEM_WRITE("prctl(get-unalign)", ARG2, sizeof(Int));
+ break;
+ case VKI_PR_SET_UNALIGN:
+ PRE_REG_READ2(int, "prctl", int, option, int, value);
+ break;
+ case VKI_PR_GET_KEEPCAPS:
+ PRE_REG_READ1(int, "prctl", int, option);
+ break;
+ case VKI_PR_SET_KEEPCAPS:
+ PRE_REG_READ2(int, "prctl", int, option, int, keepcaps);
+ break;
+ case VKI_PR_GET_FPEMU:
+ PRE_REG_READ2(int, "prctl", int, option, int *, value);
+ PRE_MEM_WRITE("prctl(get-fpemu)", ARG2, sizeof(Int));
+ break;
+ case VKI_PR_SET_FPEMU:
+ PRE_REG_READ2(int, "prctl", int, option, int, value);
+ break;
+ case VKI_PR_GET_FPEXC:
+ PRE_REG_READ2(int, "prctl", int, option, int *, value);
+ PRE_MEM_WRITE("prctl(get-fpexc)", ARG2, sizeof(Int));
+ break;
+ case VKI_PR_SET_FPEXC:
+ PRE_REG_READ2(int, "prctl", int, option, int, value);
+ break;
+ case VKI_PR_GET_TIMING:
+ PRE_REG_READ1(int, "prctl", int, option);
+ break;
+ case VKI_PR_SET_TIMING:
+ PRE_REG_READ2(int, "prctl", int, option, int, timing);
+ break;
+ case VKI_PR_SET_NAME:
+ PRE_REG_READ2(int, "prctl", int, option, char *, name);
+ PRE_MEM_RASCIIZ("prctl(set-name)", ARG2);
+ break;
+ case VKI_PR_GET_NAME:
+ PRE_REG_READ2(int, "prctl", int, option, char *, name);
+ PRE_MEM_WRITE("prctl(get-name)", ARG2, VKI_TASK_COMM_LEN);
+ break;
+ case VKI_PR_GET_ENDIAN:
+ PRE_REG_READ2(int, "prctl", int, option, int *, value);
+ PRE_MEM_WRITE("prctl(get-endian)", ARG2, sizeof(Int));
+ break;
+ case VKI_PR_SET_ENDIAN:
+ PRE_REG_READ2(int, "prctl", int, option, int, value);
+ break;
+ default:
+ PRE_REG_READ5(long, "prctl",
+ int, option, unsigned long, arg2, unsigned long, arg3,
+ unsigned long, arg4, unsigned long, arg5);
+ break;
+ }
+}
+POST(sys_prctl)
+{
+ switch (ARG1) {
+ case VKI_PR_GET_PDEATHSIG:
+ POST_MEM_WRITE(ARG2, sizeof(Int));
+ break;
+ case VKI_PR_GET_UNALIGN:
+ POST_MEM_WRITE(ARG2, sizeof(Int));
+ break;
+ case VKI_PR_GET_FPEMU:
+ POST_MEM_WRITE(ARG2, sizeof(Int));
+ break;
+ case VKI_PR_GET_FPEXC:
+ POST_MEM_WRITE(ARG2, sizeof(Int));
+ break;
+ case VKI_PR_GET_NAME:
+ POST_MEM_WRITE(ARG2, VKI_TASK_COMM_LEN);
+ break;
+ case VKI_PR_GET_ENDIAN:
+ POST_MEM_WRITE(ARG2, sizeof(Int));
+ break;
+ }
}
PRE(sys_sendfile)
int sched_priority;
};
+#define VKI_TASK_COMM_LEN 16
+
//----------------------------------------------------------------------
// From linux-2.6.8.1/include/asm-generic/siginfo.h
//----------------------------------------------------------------------
int reserved[9];
};
-#endif // __VKI_LINUX_H
-
//----------------------------------------------------------------------
// From linux-2.6.16/include/linux/vt.h
//----------------------------------------------------------------------
#define VKI_VT_LOCKSWITCH 0x560B /* disallow vt switching */
#define VKI_VT_UNLOCKSWITCH 0x560C /* allow vt switching */
+//----------------------------------------------------------------------
+// From linux-2.6.19/include/linux/prctl.h
+//----------------------------------------------------------------------
+
+#define VKI_PR_SET_PDEATHSIG 1 /* Second arg is a signal */
+#define VKI_PR_GET_PDEATHSIG 2 /* Second arg is a ptr to return the signal */
+
+#define VKI_PR_GET_DUMPABLE 3
+#define VKI_PR_SET_DUMPABLE 4
+
+#define VKI_PR_GET_UNALIGN 5
+#define VKI_PR_SET_UNALIGN 6
+# define VKI_PR_UNALIGN_NOPRINT 1 /* silently fix up unaligned user accesses */
+# define VKI_PR_UNALIGN_SIGBUS 2 /* generate SIGBUS on unaligned user access */
+
+#define VKI_PR_GET_KEEPCAPS 7
+#define VKI_PR_SET_KEEPCAPS 8
+
+#define VKI_PR_GET_FPEMU 9
+#define VKI_PR_SET_FPEMU 10
+# define VKI_PR_FPEMU_NOPRINT 1 /* silently emulate fp operations accesses */
+# define VKI_PR_FPEMU_SIGFPE 2 /* don't emulate fp operations, send SIGFPE instead */
+
+#define VKI_PR_GET_FPEXC 11
+#define VKI_PR_SET_FPEXC 12
+# define VKI_PR_FP_EXC_SW_ENABLE 0x80 /* Use FPEXC for FP exception enables */
+# define VKI_PR_FP_EXC_DIV 0x010000 /* floating point divide by zero */
+# define VKI_PR_FP_EXC_OVF 0x020000 /* floating point overflow */
+# define VKI_PR_FP_EXC_UND 0x040000 /* floating point underflow */
+# define VKI_PR_FP_EXC_RES 0x080000 /* floating point inexact result */
+# define VKI_PR_FP_EXC_INV 0x100000 /* floating point invalid operation */
+# define VKI_PR_FP_EXC_DISABLED 0 /* FP exceptions disabled */
+# define VKI_PR_FP_EXC_NONRECOV 1 /* async non-recoverable exc. mode */
+# define VKI_PR_FP_EXC_ASYNC 2 /* async recoverable exception mode */
+# define VKI_PR_FP_EXC_PRECISE 3 /* precise exception mode */
+
+#define VKI_PR_GET_TIMING 13
+#define VKI_PR_SET_TIMING 14
+# define VKI_PR_TIMING_STATISTICAL 0 /* Normal, traditional,
+ statistical process timing */
+# define VKI_PR_TIMING_TIMESTAMP 1 /* Accurate timestamp based
+ process timing */
+
+#define VKI_PR_SET_NAME 15 /* Set process name */
+#define VKI_PR_GET_NAME 16 /* Get process name */
+
+#define VKI_PR_GET_ENDIAN 19
+#define VKI_PR_SET_ENDIAN 20
+# define VKI_PR_ENDIAN_BIG 0
+# define VKI_PR_ENDIAN_LITTLE 1 /* True little endian mode */
+# define VKI_PR_ENDIAN_PPC_LITTLE 2 /* "PowerPC" pseudo little endian */
+
+#endif // __VKI_LINUX_H
+
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/