You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
1
(22) |
2
(19) |
3
(8) |
4
(34) |
5
(14) |
6
(14) |
|
7
(12) |
8
(15) |
9
(15) |
10
(10) |
11
(10) |
12
(28) |
13
(11) |
|
14
(22) |
15
(29) |
16
(20) |
17
(15) |
18
(39) |
19
(11) |
20
(12) |
|
21
(8) |
22
(9) |
23
(8) |
24
(10) |
25
(9) |
26
(7) |
27
(7) |
|
28
(6) |
29
(6) |
30
(11) |
|
|
|
|
|
From: Julian S. <js...@ac...> - 2004-11-17 23:29:04
|
Hi Josef, > I have a strange problem with VG and Suse 9.2. I did not do a bug report, > as the bug seems to be in the kernel (?). That's with 2.2.0. Does the current CVS head also behave like that? I believe Tom / Nick have fixed some bugs with segfault potential recently. J |
|
From: Josef W. <Jos...@gm...> - 2004-11-17 19:55:55
|
Hi, I have a strange problem with VG and Suse 9.2. I did not do a bug report, as the bug seems to be in the kernel (?). > uname -a Linux acer 2.6.8-24.3-default #1 Tue Oct 26 14:40:54 UTC 2004 i686 i686 i386 GNU/Linux As user, almost any VG execution terminates with a SEGFAULT. The same is working just fine as root. Example: As root (in an empty directory): # valgrind --tool=none --trace-signals=yes ls ==10021== Nulgrind, a binary JIT-compiler for x86-linux. ==10021== Copyright (C) 2002-2004, and GNU GPL'd, by Nicholas Nethercote. ==10021== Using valgrind-2.2.0, a program supervision framework for x86-linux. ==10021== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. snaffling handler 0x0 for signal 1 snaffling handler 0x0 for signal 2 [Skipped] --10021-- setting ksig 63 to: hdlr 0xB003166C, flags 0x1C000004, mask(63..0) 0xFFFFFFFF 0xFFFBFEFF --10021-- setting ksig 64 to: hdlr 0xB003166C, flags 0x1C000004, mask(63..0) 0xFFFFFFFF 0xFFFBFEFF ==10021== For more details, rerun with: -v ==10021== --10021-- signal 11 arrived ... si_code=1 --10021-- SIGSEGV: si_code=1 faultaddr=0xAFEFCFB8 tid=1 esp=0xAFEFCFB8 seg=0xAFEFD000-0xAFEFF000 fl=60 shad=0xB0000000-0xB0000000 ==10021== Same as user (in an empty directory): > valgrind --tool=none --trace-signals=yes ls ==10081== Nulgrind, a binary JIT-compiler for x86-linux. ==10081== Copyright (C) 2002-2004, and GNU GPL'd, by Nicholas Nethercote. ==10081== Using valgrind-2.2.0, a program supervision framework for x86-linux. ==10081== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. snaffling handler 0x0 for signal 1 snaffling handler 0x0 for signal 2 [Skipped] --10081-- setting ksig 64 to: hdlr 0xB003166C, flags 0x1C000004, mask(63..0) 0xFFFFFFFF 0xFFFBFEFF ==10081== For more details, rerun with: -v ==10081== --10081-- signal 11 arrived ... si_code=0 --10081-- SIGSEGV: si_code=0 faultaddr=0x0 tid=1 esp=0xAFEFCFFC seg=0x8048000-0x805A000 fl=318 shad=0xB0000000-0xB0000000 --10081-- delivering signal 11 (SIGSEGV) to thread 1 --10081-- delivering 11 to default handler terminate+core ==10081== ==10081== Process terminating with default action of signal 11 (SIGSEGV) ==10081== at 0x3A975710: __libc_memalign (in /lib/ld-2.3.3.so) ==10081== by 0x3A9758A2: calloc (in /lib/ld-2.3.3.so) ==10081== by 0x3A96D1D3: _dl_new_object (in /lib/ld-2.3.3.so) ==10081== by 0x3A969B9A: _dl_map_object_from_fd (in /lib/ld-2.3.3.so) ==10081== Speicherzugriffsfehler I checked it with attaching GDB to stage2, and the segfaults happens when accessing 0xAFEFCFB8, like in the root case. I.e. the stack simply has to be expanded by VGs segfault handler. The strange thing is that for VG, the faultaddr=0x0, and therefore the segfault is forwarded to the client. Any idea how to track this down further or even to solve this? Josef |
|
From: Nicholas N. <nj...@ca...> - 2004-11-17 18:42:24
|
CVS commit by nethercote:
Convert a whole bunch of "(UWord)NULL" occurrences to 0, which is easier to
read and understand.
M +34 -35 vg_syscalls.c 1.223
M +6 -6 linux/syscalls.c 1.3
--- valgrind/coregrind/vg_syscalls.c #1.222:1.223
@@ -1483,5 +1483,5 @@ PRE(sys_sched_setscheduler, 0)
PRE_REG_READ3(long, "sched_setscheduler",
vki_pid_t, pid, int, policy, struct sched_param *, p);
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_READ( "sched_setscheduler(p)",
arg3, sizeof(struct vki_sched_param));
@@ -1681,7 +1681,7 @@ PRE(sys_execve, Special)
char *, filename, char **, argv, char **, envp);
PRE_MEM_RASCIIZ( "execve(filename)", arg1 );
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
pre_argv_envp( arg2, tid, "execve(argv)", "execve(argv[i])" );
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
pre_argv_envp( arg3, tid, "execve(envp)", "execve(envp[i])" );
@@ -2441,5 +2441,5 @@ PRE(sys_ipc, 0)
PRE_MEM_READ( "semtimedop(sops)", arg5,
arg3 * sizeof(struct vki_sembuf) );
- if (arg6 != (UWord)NULL)
+ if (arg6 != 0)
PRE_MEM_READ( "semtimedop(timeout)", arg6,
sizeof(struct vki_timespec) );
@@ -4255,5 +4255,5 @@ PRE(sys_nanosleep, MayBlock|PostOnFail)
struct timespec *, req, struct timespec *, rem);
PRE_MEM_READ( "nanosleep(req)", arg1, sizeof(struct vki_timespec) );
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_WRITE( "nanosleep(rem)", arg2, sizeof(struct vki_timespec) );
}
@@ -4261,5 +4261,5 @@ PRE(sys_nanosleep, MayBlock|PostOnFail)
POST(sys_nanosleep)
{
- if (arg2 != (UWord)NULL && res == -VKI_EINTR)
+ if (arg2 != 0 && res == -VKI_EINTR)
POST_MEM_WRITE( arg2, sizeof(struct vki_timespec) );
}
@@ -4429,5 +4429,5 @@ PRE(sys_readv, MayBlock)
PRE_MEM_READ( "readv(vector)", arg2, arg3 * sizeof(struct vki_iovec) );
- if (arg2 != (UWord)NULL) {
+ if (arg2 != 0) {
/* ToDo: don't do any of the following if the vector is invalid */
vec = (struct vki_iovec *)arg2;
@@ -4915,6 +4915,5 @@ POST(sys_socketcall)
case VKI_SYS_RECV:
- if (res >= 0
- && ((UWord*)arg2)[1] != (UWord)NULL) {
+ if (res >= 0 && ((UWord*)arg2)[1] != 0) {
POST_MEM_WRITE( ((UWord*)arg2)[1], /* buf */
((UWord*)arg2)[2] /* len */ );
@@ -5060,5 +5059,5 @@ PRE(sys_time, 0)
PRINT("sys_time ( %p )",arg1);
PRE_REG_READ1(long, "time", int *, t);
- if (arg1 != (UWord)NULL) {
+ if (arg1 != 0) {
PRE_MEM_WRITE( "time(t)", arg1, sizeof(vki_time_t) );
}
@@ -5067,5 +5066,5 @@ PRE(sys_time, 0)
POST(sys_time)
{
- if (arg1 != (UWord)NULL) {
+ if (arg1 != 0) {
POST_MEM_WRITE( arg1, sizeof(vki_time_t) );
}
@@ -5081,5 +5080,5 @@ PRE(sys_times, 0)
POST(sys_times)
{
- if (arg1 != (UWord)NULL) {
+ if (arg1 != 0) {
POST_MEM_WRITE( arg1, sizeof(struct vki_tms) );
}
@@ -5108,5 +5107,5 @@ PRE(sys_newuname, 0)
POST(sys_newuname)
{
- if (arg1 != (UWord)NULL) {
+ if (arg1 != 0) {
POST_MEM_WRITE( arg1, sizeof(struct vki_new_utsname) );
}
@@ -5118,5 +5117,5 @@ PRE(sys_utime, MayBlock)
PRE_REG_READ2(long, "utime", char *, filename, struct utimbuf *, buf);
PRE_MEM_RASCIIZ( "utime(filename)", arg1 );
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "utime(buf)", arg2, sizeof(struct vki_utimbuf) );
}
@@ -5173,5 +5172,5 @@ PRE(sys_writev, MayBlock)
PRE_MEM_READ( "writev(vector)",
arg2, arg3 * sizeof(struct vki_iovec) );
- if (arg2 != (UWord)NULL) {
+ if (arg2 != 0) {
/* ToDo: don't do any of the following if the vector is invalid */
vec = (struct vki_iovec *)arg2;
@@ -5188,5 +5187,5 @@ PRE(sys_utimes, 0)
PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp);
PRE_MEM_RASCIIZ( "utimes(filename)", arg1 );
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "utimes(tvp)", arg2, sizeof(struct vki_timeval) );
}
@@ -5267,7 +5266,7 @@ PRE(sys_rt_sigtimedwait, MayBlock)
const vki_sigset_t *, set, vki_siginfo_t *, info,
const struct timespec *, timeout, vki_size_t, sigsetsize);
- if (arg1 != (UWord)NULL)
+ if (arg1 != 0)
PRE_MEM_READ( "rt_sigtimedwait(set)", arg1, sizeof(vki_sigset_t));
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_WRITE( "rt_sigtimedwait(info)", arg2, sizeof(vki_siginfo_t) );
PRE_MEM_READ( "rt_sigtimedwait(timeout)",
@@ -5277,5 +5276,5 @@ PRE(sys_rt_sigtimedwait, MayBlock)
POST(sys_rt_sigtimedwait)
{
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
POST_MEM_WRITE( arg2, sizeof(vki_siginfo_t) );
}
@@ -5286,5 +5285,5 @@ PRE(sys_rt_sigqueueinfo, 0)
PRE_REG_READ3(long, "rt_sigqueueinfo",
int, pid, int, sig, vki_siginfo_t *, uinfo);
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", arg3, sizeof(vki_siginfo_t) );
}
@@ -5316,8 +5315,8 @@ PRE(sys_sigaltstack, SIG_SIM)
PRE_REG_READ2(int, "sigaltstack",
const vki_stack_t *, ss, vki_stack_t *, oss);
- if (arg1 != (UWord)NULL) {
+ if (arg1 != 0) {
PRE_MEM_READ( "sigaltstack(ss)", arg1, sizeof(vki_stack_t) );
}
- if (arg2 != (UWord)NULL) {
+ if (arg2 != 0) {
PRE_MEM_WRITE( "sigaltstack(oss)", arg2, sizeof(vki_stack_t) );
}
@@ -5329,5 +5328,5 @@ PRE(sys_sigaltstack, SIG_SIM)
POST(sys_sigaltstack)
{
- if (res == 0 && arg2 != (UWord)NULL)
+ if (res == 0 && arg2 != 0)
POST_MEM_WRITE( arg2, sizeof(vki_stack_t));
}
@@ -5340,7 +5339,7 @@ PRE(sys_sigaction, SIG_SIM)
int, signum, const struct old_sigaction *, act,
struct old_sigaction *, oldact)
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "sigaction(act)", arg2, sizeof(struct vki_old_sigaction));
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "sigaction(oldact)", arg3, sizeof(struct vki_old_sigaction));
@@ -5351,5 +5350,5 @@ PRE(sys_sigaction, SIG_SIM)
POST(sys_sigaction)
{
- if (res == 0 && arg3 != (UWord)NULL)
+ if (res == 0 && arg3 != 0)
POST_MEM_WRITE( arg3, sizeof(struct vki_old_sigaction));
}
@@ -5363,7 +5362,7 @@ PRE(sys_rt_sigaction, SIG_SIM)
struct sigaction *, oldact, vki_size_t, sigsetsize);
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "rt_sigaction(act)", arg2, sizeof(struct vki_sigaction));
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "rt_sigaction(oldact)", arg3, sizeof(struct vki_sigaction));
@@ -5375,5 +5374,5 @@ PRE(sys_rt_sigaction, SIG_SIM)
POST(sys_rt_sigaction)
{
- if (res == 0 && arg3 != (UWord)NULL)
+ if (res == 0 && arg3 != 0)
POST_MEM_WRITE( arg3, sizeof(struct vki_sigaction));
}
@@ -5384,7 +5383,7 @@ PRE(sys_sigprocmask, SIG_SIM)
PRE_REG_READ3(long, "sigprocmask",
int, how, vki_old_sigset_t *, set, vki_old_sigset_t *, oldset);
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "sigprocmask(set)", arg2, sizeof(vki_old_sigset_t));
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "sigprocmask(oldset)", arg3, sizeof(vki_old_sigset_t));
@@ -5412,5 +5411,5 @@ PRE(sys_sigprocmask, SIG_SIM)
POST(sys_sigprocmask)
{
- if (res == 0 && arg3 != (UWord)NULL)
+ if (res == 0 && arg3 != 0)
POST_MEM_WRITE( arg3, sizeof(vki_old_sigset_t));
}
@@ -5422,7 +5421,7 @@ PRE(sys_rt_sigprocmask, SIG_SIM)
int, how, vki_sigset_t *, set, vki_sigset_t *, oldset,
vki_size_t, sigsetsize);
- if (arg2 != (UWord)NULL)
+ if (arg2 != 0)
PRE_MEM_READ( "rt_sigprocmask(set)", arg2, sizeof(vki_sigset_t));
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "rt_sigprocmask(oldset)", arg3, sizeof(vki_sigset_t));
@@ -5439,5 +5438,5 @@ PRE(sys_rt_sigprocmask, SIG_SIM)
POST(sys_rt_sigprocmask)
{
- if (res == 0 && arg3 != (UWord)NULL)
+ if (res == 0 && arg3 != 0)
POST_MEM_WRITE( arg3, sizeof(vki_sigset_t));
}
--- valgrind/coregrind/linux/syscalls.c #1.2:1.3
@@ -346,5 +346,5 @@ PRE(sys_sendfile, MayBlock)
int, out_fd, int, in_fd, vki_off_t *, offset,
vki_size_t, count);
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "sendfile(offset)", arg3, sizeof(vki_off_t) );
}
@@ -361,5 +361,5 @@ PRE(sys_sendfile64, MayBlock)
int, out_fd, int, in_fd, vki_loff_t *, offset,
vki_size_t, count);
- if (arg3 != (UWord)NULL)
+ if (arg3 != 0)
PRE_MEM_WRITE( "sendfile64(offset)", arg3, sizeof(vki_loff_t) );
}
@@ -367,5 +367,5 @@ PRE(sys_sendfile64, MayBlock)
POST(sys_sendfile64)
{
- if (arg3 != (UWord)NULL ) {
+ if (arg3 != 0 ) {
POST_MEM_WRITE( arg3, sizeof(vki_loff_t) );
}
@@ -379,5 +379,5 @@ PRE(sys_futex, MayBlock)
struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
PRE_MEM_READ( "futex(futex)", arg1, sizeof(int) );
- if (arg2 == VKI_FUTEX_WAIT && arg4 != (UWord)NULL)
+ if (arg2 == VKI_FUTEX_WAIT && arg4 != 0)
PRE_MEM_READ( "futex(timeout)", arg4, sizeof(struct vki_timespec) );
if (arg2 == VKI_FUTEX_REQUEUE)
@@ -520,5 +520,5 @@ PRE(sys_io_getevents, MayBlock)
PRE_MEM_WRITE( "io_getevents(events)",
arg4, sizeof(struct vki_io_event)*arg3 );
- if (arg5 != (UWord)NULL)
+ if (arg5 != 0)
PRE_MEM_READ( "io_getevents(timeout)",
arg5, sizeof(struct vki_timespec));
@@ -561,5 +561,5 @@ PRE(sys_io_submit, 0)
struct iocb **, iocbpp);
PRE_MEM_READ( "io_submit(iocbpp)", arg3, arg2*sizeof(struct vki_iocb *) );
- if (arg3 != (UWord)NULL) {
+ if (arg3 != 0) {
for (i = 0; i < arg2; i++) {
struct vki_iocb *cb = ((struct vki_iocb **)arg3)[i];
|
|
From: Nicholas N. <nj...@ca...> - 2004-11-17 18:24:20
|
CVS commit by nethercote:
Add explanatory comment to set_tid_address wrapper.
M +8 -0 vg_syscalls.c 1.222
--- valgrind/coregrind/vg_syscalls.c #1.221:1.222
@@ -1129,4 +1129,12 @@ POST(sys_ptrace)
PRE(sys_set_tid_address, Special)
{
+ // We don't let this syscall run, and don't do anything to simulate it
+ // ourselves -- it becomes a no-op! Why? Tom says:
+ //
+ // I suspect this is deliberate given that all the user level threads
+ // are running in the same kernel thread under valgrind so we probably
+ // don't want to be calling the actual system call here.
+ //
+ // Hmm.
PRINT("sys_set_tid_address ( %p )", arg1);
PRE_REG_READ1(long, "set_tid_address", int *, tidptr);
|
|
From: Nicholas N. <nj...@ca...> - 2004-11-17 18:22:50
|
CVS commit by nethercote:
Arch-abstraction:
- Moved some more syscall wrappers into linux/syscalls.c and
x86-linux/syscalls.c. There are still heaps of wrappers that probably aren't
generic, but I'm not sure, so they're staying in vg_syscalls.c for now.
Let's worry about that when we do an OS port.
M +0 -1 Makefile.am 1.105
M +50 -63 core.h 1.54
M +73 -240 vg_syscalls.c 1.221
M +8 -0 linux/core_os.h 1.2
M +105 -1 linux/syscalls.c 1.2
M +270 -208 x86-linux/syscalls.c 1.6
--- valgrind/coregrind/Makefile.am #1.104:1.105
@@ -24,5 +24,4 @@
core.h \
core_asm.h \
- syscall_wrappers.h \
ume.h \
vg_symtab2.h \
--- valgrind/coregrind/core.h #1.53:1.54
@@ -1408,4 +1408,9 @@ Bool VG_(valid_client_addr)(Addr start,
const Char *syscallname);
+// Return true if we're allowed to use or create this fd.
+Bool VG_(fd_allowed)(Int fd, const Char *syscallname, ThreadId tid, Bool soft);
+
+void VG_(record_fd_open)(Int tid, Int fd, char *pathname);
+
// Flags describing syscall wrappers
#define Special (1 << 0)
@@ -1425,6 +1430,6 @@ Bool VG_(valid_client_addr)(Addr start,
// POSIX or something like that; those that are not POSIX are annotated
// with what standards they are part of, as stated in the Linux man pages.
-// Unless otherwise indicated, all those here are generic across all
-// architectures at least for Linux.
+// For many of them, it's unclear if they are generic, or Linux-specific, or
+// x86/Linux-specific, or something else again.
//
// Nb: This list may change over time... ones thought at first to be generic
@@ -1446,5 +1451,5 @@ GEN_SYSCALL_WRAPPER(sys_creat);
GEN_SYSCALL_WRAPPER(sys_link);
GEN_SYSCALL_WRAPPER(sys_unlink);
-GEN_SYSCALL_WRAPPER(sys_execve); // 11 (*??) P
+GEN_SYSCALL_WRAPPER(sys_execve); // (*??) P
GEN_SYSCALL_WRAPPER(sys_chdir);
GEN_SYSCALL_WRAPPER(sys_time);
@@ -1496,4 +1501,5 @@ GEN_SYSCALL_WRAPPER(sys_getgid);
GEN_SYSCALL_WRAPPER(sys_geteuid);
GEN_SYSCALL_WRAPPER(sys_getegid);
+GEN_SYSCALL_WRAPPER(sys_getpgid);
GEN_SYSCALL_WRAPPER(sys_fsync);
GEN_SYSCALL_WRAPPER(sys_wait4);
@@ -1509,4 +1515,12 @@ GEN_SYSCALL_WRAPPER(sys_clock_gettime);
GEN_SYSCALL_WRAPPER(sys_clock_getres);
GEN_SYSCALL_WRAPPER(sys_getcwd);
+GEN_SYSCALL_WRAPPER(sys_symlink);
+GEN_SYSCALL_WRAPPER(sys_getgroups);
+GEN_SYSCALL_WRAPPER(sys_setgroups); // SVr4, SVID, X/OPEN, 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_chown);
+GEN_SYSCALL_WRAPPER(sys_setuid);
+GEN_SYSCALL_WRAPPER(sys_gettimeofday);
+GEN_SYSCALL_WRAPPER(sys_madvise);
+GEN_SYSCALL_WRAPPER(sys_sigpending);
// These ones aren't POSIX, but are in some standard and look reasonably
@@ -1517,5 +1531,21 @@ GEN_SYSCALL_WRAPPER(sys_brk); // 4
GEN_SYSCALL_WRAPPER(sys_acct); // SVR4, non-POSIX
GEN_SYSCALL_WRAPPER(sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN
-
+GEN_SYSCALL_WRAPPER(sys_readlink); // X/OPEN, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_fchdir); // SVr4, SVID, POSIX, X/OPEN, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_getdents); // SVr4,SVID
+GEN_SYSCALL_WRAPPER(sys_select); // 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_flock); // 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_poll); // XPG4-UNIX
+GEN_SYSCALL_WRAPPER(sys_getrusage); // SVr4, 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
+GEN_SYSCALL_WRAPPER(sys_getpriority); // SVr4, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_setpriority); // SVr4, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_setitimer); // SVr4, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_getitimer); // SVr4, 4.4BSD
+GEN_SYSCALL_WRAPPER(sys_setreuid); // 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_setregid); // 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_fchown); // SVr4,4.3BSD
+GEN_SYSCALL_WRAPPER(sys_setgid); // SVr4,SVID
+GEN_SYSCALL_WRAPPER(sys_utimes); // 4.3BSD
// These ones may be Linux specific... not sure. They use 16-bit gid_t and
@@ -1535,61 +1565,34 @@ GEN_SYSCALL_WRAPPER(sys_fchown16);
GEN_SYSCALL_WRAPPER(sys_chown16); // ## P
-GEN_SYSCALL_WRAPPER(sys_ptrace); // (x86?) (almost-P)
-
+// Linux's funny many-in-one socketcall is certainly not generic, but I
+// didn't want to move it until necessary because it's big and has a lot of
+// associated junk.
+GEN_SYSCALL_WRAPPER(sys_socketcall);
// Some archs on Linux do not match the generic wrapper for sys_pipe().
GEN_SYSCALL_WRAPPER(sys_pipe);
-GEN_SYSCALL_WRAPPER(sys_ioctl); // */x86 (various)
-
-
// May not be generic for every architecture under Linux.
GEN_SYSCALL_WRAPPER(sys_sigaction); // (x86) P
-GEN_SYSCALL_WRAPPER(sys_sigsuspend); // POSIX, but LLL (proto varies across archs)
-GEN_SYSCALL_WRAPPER(sys_sigpending);
-GEN_SYSCALL_WRAPPER(sys_setrlimit); // SVr4, 4.3BSD
-
-GEN_SYSCALL_WRAPPER(sys_old_getrlimit); // SVr4, 4.3BSD LLL?
-
-GEN_SYSCALL_WRAPPER(sys_getrusage); // SVr4, 4.3BSD
-GEN_SYSCALL_WRAPPER(sys_gettimeofday);
-GEN_SYSCALL_WRAPPER(sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
-
-GEN_SYSCALL_WRAPPER(old_select); // (x86) (4.4BSD) LLL
-
-GEN_SYSCALL_WRAPPER(sys_symlink);
-GEN_SYSCALL_WRAPPER(sys_readlink); // * (X/OPEN,4.4BSD)
-GEN_SYSCALL_WRAPPER(old_mmap); // (x86) (P but not...)
-GEN_SYSCALL_WRAPPER(sys_getpriority); // SVr4,4.4BSD
-GEN_SYSCALL_WRAPPER(sys_setpriority); // SVr4,4.4BSD
-GEN_SYSCALL_WRAPPER(sys_statfs); // * L?
-GEN_SYSCALL_WRAPPER(sys_fstatfs); // * L?
-
-// Linux's funny many-in-one socketcall is certainly not generic, but I
-// didn't want to move it until necessary because it's big and has a lot of
-// associated junk.
-GEN_SYSCALL_WRAPPER(sys_socketcall);
-
-GEN_SYSCALL_WRAPPER(sys_setitimer); // * (SVr4,4.4BSD)
-GEN_SYSCALL_WRAPPER(sys_getitimer); // * (SVr4,4.4BSD)
-
-// XXX: funny names...
+// Funny names, not sure...
GEN_SYSCALL_WRAPPER(sys_newstat); // * P
GEN_SYSCALL_WRAPPER(sys_newlstat); // *
GEN_SYSCALL_WRAPPER(sys_newfstat); // * P (SVr4,BSD4.3)
+// For the remainder, not really sure yet
+GEN_SYSCALL_WRAPPER(old_mmap); // x86, weird arg passing
+GEN_SYSCALL_WRAPPER(sys_ptrace); // (x86?) (almost-P)
+GEN_SYSCALL_WRAPPER(sys_sigsuspend); // POSIX, but L (proto varies across archs)
+GEN_SYSCALL_WRAPPER(sys_setrlimit); // SVr4, 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_ioctl); // x86? (various)
+GEN_SYSCALL_WRAPPER(sys_old_getrlimit); // SVr4, 4.3BSD L?
+GEN_SYSCALL_WRAPPER(sys_statfs); // * L?
+GEN_SYSCALL_WRAPPER(sys_fstatfs); // * L?
GEN_SYSCALL_WRAPPER(sys_iopl); // (x86/amd64) L
GEN_SYSCALL_WRAPPER(sys_ipc); // (x86) L
-GEN_SYSCALL_WRAPPER(sys_clone); // (x86/Linux) TTT
GEN_SYSCALL_WRAPPER(sys_newuname); // * P
GEN_SYSCALL_WRAPPER(sys_init_module); // * L?
GEN_SYSCALL_WRAPPER(sys_quotactl); // * (?)
-GEN_SYSCALL_WRAPPER(sys_getpgid);
-GEN_SYSCALL_WRAPPER(sys_fchdir); // * (almost-P)
-GEN_SYSCALL_WRAPPER(sys_getdents); // * (SVr4,SVID)
-GEN_SYSCALL_WRAPPER(sys_select); // * (4.4BSD...)
-GEN_SYSCALL_WRAPPER(sys_flock); // * (4.4BSD...)
-GEN_SYSCALL_WRAPPER(sys_poll); // * (XPG4-UNIX)
GEN_SYSCALL_WRAPPER(sys_rt_sigaction); // (x86) ()
GEN_SYSCALL_WRAPPER(sys_rt_sigprocmask); // * ?
@@ -1603,5 +1606,4 @@ GEN_SYSCALL_WRAPPER(sys_capget);
GEN_SYSCALL_WRAPPER(sys_capset); // * L?
GEN_SYSCALL_WRAPPER(sys_sigaltstack); // (x86) (XPG4-UNIX)
-GEN_SYSCALL_WRAPPER(sys_sendfile); // * L
GEN_SYSCALL_WRAPPER(sys_getpmsg); // (?) (?)
GEN_SYSCALL_WRAPPER(sys_putpmsg); // (?) (?)
@@ -1614,14 +1616,5 @@ GEN_SYSCALL_WRAPPER(sys_lstat64);
GEN_SYSCALL_WRAPPER(sys_fstat64); // %% (?)
GEN_SYSCALL_WRAPPER(sys_lchown); // * (L?)
-GEN_SYSCALL_WRAPPER(sys_setreuid); // * (BSD4.3)
-GEN_SYSCALL_WRAPPER(sys_setregid); // * (BSD4.3)
-GEN_SYSCALL_WRAPPER(sys_getgroups); // * P
-GEN_SYSCALL_WRAPPER(sys_setgroups); // * almost-P
-GEN_SYSCALL_WRAPPER(sys_fchown); // * (SVr4,BSD4.3)
-GEN_SYSCALL_WRAPPER(sys_chown); // * P
-GEN_SYSCALL_WRAPPER(sys_setuid); // *
-GEN_SYSCALL_WRAPPER(sys_setgid); // * (SVr4,SVID)
-GEN_SYSCALL_WRAPPER(sys_mincore); // * non-P?
-GEN_SYSCALL_WRAPPER(sys_madvise); // * P
+GEN_SYSCALL_WRAPPER(sys_mincore); // * L?
GEN_SYSCALL_WRAPPER(sys_getdents64); // * (SVr4,SVID?)
GEN_SYSCALL_WRAPPER(sys_fcntl64); // * P?
@@ -1638,17 +1631,11 @@ GEN_SYSCALL_WRAPPER(sys_removexattr);
GEN_SYSCALL_WRAPPER(sys_lremovexattr); // * L?
GEN_SYSCALL_WRAPPER(sys_fremovexattr); // * L?
-GEN_SYSCALL_WRAPPER(sys_sendfile64); // * L
-GEN_SYSCALL_WRAPPER(sys_futex); // * L
GEN_SYSCALL_WRAPPER(sys_sched_setaffinity); // * L?
GEN_SYSCALL_WRAPPER(sys_sched_getaffinity); // * L?
-GEN_SYSCALL_WRAPPER(sys_exit_group); // *
+GEN_SYSCALL_WRAPPER(sys_exit_group); // * ?
GEN_SYSCALL_WRAPPER(sys_lookup_dcookie); // (*/32/64) L
-GEN_SYSCALL_WRAPPER(sys_epoll_create); // * L
-GEN_SYSCALL_WRAPPER(sys_epoll_ctl); // * L
-GEN_SYSCALL_WRAPPER(sys_epoll_wait); // * L
GEN_SYSCALL_WRAPPER(sys_set_tid_address); // * ?
GEN_SYSCALL_WRAPPER(sys_statfs64); // * (?)
GEN_SYSCALL_WRAPPER(sys_fstatfs64); // * (?)
-GEN_SYSCALL_WRAPPER(sys_utimes); // * (4.3BSD)
GEN_SYSCALL_WRAPPER(sys_mq_open); // * P?
GEN_SYSCALL_WRAPPER(sys_mq_unlink); // * P?
--- valgrind/coregrind/vg_syscalls.c #1.220:1.221
@@ -43,6 +43,4 @@
*/
-#include "syscall_wrappers.h"
-
/* ---------------------------------------------------------------------
A simple atfork() facility for Valgrind's internal use
@@ -435,6 +433,5 @@ void record_fd_close(Int tid, Int fd)
so just overwrite the existing one. */
-static
-void record_fd_open(Int tid, Int fd, char *pathname)
+void VG_(record_fd_open)(Int tid, Int fd, char *pathname)
{
OpenFd *i;
@@ -614,5 +611,5 @@ void do_hacky_preopened()
for (i = 0; i < count; i++)
if(VG_(fcntl)(i, VKI_F_GETFL, 0) != -1)
- record_fd_open(-1, i, NULL);
+ VG_(record_fd_open)(-1, i, NULL);
}
@@ -640,5 +637,5 @@ void VG_(init_preopened_fds)()
if(fno != f)
if(VG_(clo_track_fds))
- record_fd_open(-1, fno, VG_(resolve_filename)(fno));
+ VG_(record_fd_open)(-1, fno, VG_(resolve_filename)(fno));
}
@@ -765,6 +762,6 @@ void check_cmsg_for_fds(Int tid, struct
if(VG_(clo_track_fds))
// XXX: must we check the range on these fds with
- // fd_allowed()?
- record_fd_open (tid, fds[i], VG_(resolve_filename)(fds[i]));
+ // VG_(fd_allowed)()?
+ VG_(record_fd_open) (tid, fds[i], VG_(resolve_filename)(fds[i]));
}
@@ -960,5 +957,5 @@ static Addr do_brk(Addr newbrk)
/* Return true if we're allowed to use or create this fd */
-static Bool fd_allowed(Int fd, const Char *syscallname, ThreadId tid, Bool soft)
+Bool VG_(fd_allowed)(Int fd, const Char *syscallname, ThreadId tid, Bool soft)
{
if (fd < 0 || fd >= VG_(fd_hard_limit) || fd == VG_(clo_log_fd)) {
@@ -1537,36 +1534,4 @@ PRE(sys_setregid16, 0)
}
-PRE(sys_sendfile, MayBlock)
-{
- PRINT("sys_sendfile ( %d, %d, %p, %llu )", arg1,arg2,arg3,(ULong)arg4);
- PRE_REG_READ4(ssize_t, "sendfile",
- int, out_fd, int, in_fd, vki_off_t *, offset,
- vki_size_t, count);
- if (arg3 != (UWord)NULL)
- PRE_MEM_WRITE( "sendfile(offset)", arg3, sizeof(vki_off_t) );
-}
-
-POST(sys_sendfile)
-{
- POST_MEM_WRITE( arg3, sizeof( vki_off_t ) );
-}
-
-PRE(sys_sendfile64, MayBlock)
-{
- PRINT("sendfile64 ( %d, %d, %p, %llu )",arg1,arg2,arg3,(ULong)arg4);
- PRE_REG_READ4(ssize_t, "sendfile64",
- int, out_fd, int, in_fd, vki_loff_t *, offset,
- vki_size_t, count);
- if (arg3 != (UWord)NULL)
- PRE_MEM_WRITE( "sendfile64(offset)", arg3, sizeof(vki_loff_t) );
-}
-
-POST(sys_sendfile64)
-{
- if (arg3 != (UWord)NULL ) {
- POST_MEM_WRITE( arg3, sizeof(vki_loff_t) );
- }
-}
-
// XXX: only for 32-bit archs
PRE(sys_pwrite64, MayBlock)
@@ -1911,5 +1876,5 @@ PRE(sys_close, 0)
/* Detect and negate attempts by the client to close Valgrind's log fd */
- if (!fd_allowed(arg1, "close", tid, False))
+ if (!VG_(fd_allowed)(arg1, "close", tid, False))
set_result( -VKI_EBADF );
}
@@ -1928,10 +1893,10 @@ PRE(sys_dup, 0)
POST(sys_dup)
{
- if (!fd_allowed(res, "dup", tid, True)) {
+ if (!VG_(fd_allowed)(res, "dup", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(resolve_filename)(res));
+ VG_(record_fd_open)(tid, res, VG_(resolve_filename)(res));
}
}
@@ -1941,5 +1906,5 @@ PRE(sys_dup2, 0)
PRINT("sys_dup2 ( %d, %d )", arg1,arg2);
PRE_REG_READ2(long, "dup2", unsigned int, oldfd, unsigned int, newfd);
- if (!fd_allowed(arg2, "dup2", tid, True))
+ if (!VG_(fd_allowed)(arg2, "dup2", tid, True))
set_result( -VKI_EBADF );
}
@@ -1948,5 +1913,5 @@ POST(sys_dup2)
{
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(resolve_filename)(res));
+ VG_(record_fd_open)(tid, res, VG_(resolve_filename)(res));
}
@@ -1963,10 +1928,10 @@ POST(sys_fcntl)
{
if (arg2 == VKI_F_DUPFD) {
- if (!fd_allowed(res, "fcntl(DUPFD)", tid, True)) {
+ if (!VG_(fd_allowed)(res, "fcntl(DUPFD)", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(resolve_filename)(res));
+ VG_(record_fd_open)(tid, res, VG_(resolve_filename)(res));
}
}
@@ -2012,10 +1977,10 @@ POST(sys_fcntl64)
{
if (arg2 == VKI_F_DUPFD) {
- if (!fd_allowed(res, "fcntl64(DUPFD)", tid, True)) {
+ if (!VG_(fd_allowed)(res, "fcntl64(DUPFD)", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(resolve_filename)(res));
+ VG_(record_fd_open)(tid, res, VG_(resolve_filename)(res));
}
}
@@ -2079,30 +2044,4 @@ POST(sys_fork)
}
-// XXX: x86-specific
-PRE(sys_clone, Special)
-{
- PRINT("sys_clone ( %d, %p, %p, %p, %p )",arg1,arg2,arg3,arg4,arg5);
- // XXX: really not sure about the last two args... if they are really
- // there, we should do PRE_MEM_READs for both of them...
- PRE_REG_READ4(int, "clone",
- unsigned long, flags, void *, child_stack,
- int *, parent_tidptr, int *, child_tidptr);
-
- if (arg2 == 0 &&
- (arg1 == (VKI_CLONE_CHILD_CLEARTID|VKI_CLONE_CHILD_SETTID|VKI_SIGCHLD)
- || arg1 == (VKI_CLONE_PARENT_SETTID|VKI_SIGCHLD)))
- {
- VGA_(gen_sys_fork_before)(tid, tst);
- set_result( VG_(do_syscall)(SYSNO, arg1, arg2, arg3, arg4, arg5) );
- VGA_(gen_sys_fork_after) (tid, tst);
- } else {
- VG_(unimplemented)
- ("clone(): not supported by Valgrind.\n "
- "We do support programs linked against\n "
- "libpthread.so, though. Re-run with -v and ensure that\n "
- "you are picking up Valgrind's implementation of libpthread.so.");
- }
-}
-
PRE(sys_ftruncate, MayBlock)
{
@@ -4172,36 +4111,4 @@ PRE(sys_mkdir, MayBlock)
}
-PRE(sys_mmap2, 0)
-{
- // Exactly like old_mmap() except:
- // - all 6 args are passed in regs, rather than in a memory-block.
- // - the file offset is specified in pagesize units rather than bytes,
- // so that it can be used for files bigger than 2^32 bytes.
- PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
- arg1, (ULong)arg2, arg3, arg4, arg5, arg6 );
- PRE_REG_READ6(long, "mmap2",
- unsigned long, start, unsigned long, length,
- unsigned long, prot, unsigned long, flags,
- unsigned long, fd, unsigned long, offset);
-
- if (arg4 & VKI_MAP_FIXED) {
- if (!VG_(valid_client_addr)(arg1, arg2, tid, "mmap2"))
- set_result( -VKI_ENOMEM );
- } else {
- arg1 = VG_(find_map_space)(arg1, arg2, True);
- if (arg1 == 0)
- set_result( -VKI_ENOMEM );
- else
- arg4 |= VKI_MAP_FIXED;
- }
-}
-
-POST(sys_mmap2)
-{
- vg_assert(VG_(valid_client_addr)(res, arg2, tid, "mmap2"));
- mmap_segment( (Addr)res, arg2, arg3, arg4, arg5,
- arg6 * (ULong)VKI_PAGE_SIZE );
-}
-
PRE(old_mmap, Special)
{
@@ -4245,4 +4152,36 @@ PRE(old_mmap, Special)
}
+PRE(sys_mmap2, 0)
+{
+ // Exactly like old_mmap() except:
+ // - all 6 args are passed in regs, rather than in a memory-block.
+ // - the file offset is specified in pagesize units rather than bytes,
+ // so that it can be used for files bigger than 2^32 bytes.
+ PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
+ arg1, (ULong)arg2, arg3, arg4, arg5, arg6 );
+ PRE_REG_READ6(long, "mmap2",
+ unsigned long, start, unsigned long, length,
+ unsigned long, prot, unsigned long, flags,
+ unsigned long, fd, unsigned long, offset);
+
+ if (arg4 & VKI_MAP_FIXED) {
+ if (!VG_(valid_client_addr)(arg1, arg2, tid, "mmap2"))
+ set_result( -VKI_ENOMEM );
+ } else {
+ arg1 = VG_(find_map_space)(arg1, arg2, True);
+ if (arg1 == 0)
+ set_result( -VKI_ENOMEM );
+ else
+ arg4 |= VKI_MAP_FIXED;
+ }
+}
+
+POST(sys_mmap2)
+{
+ vg_assert(VG_(valid_client_addr)(res, arg2, tid, "mmap2"));
+ mmap_segment( (Addr)res, arg2, arg3, arg4, arg5,
+ arg6 * (ULong)VKI_PAGE_SIZE );
+}
+
PRE(sys_mprotect, 0)
{
@@ -4336,10 +4275,10 @@ PRE(sys_open, MayBlock)
POST(sys_open)
{
- if (!fd_allowed(res, "open", tid, True)) {
+ if (!VG_(fd_allowed)(res, "open", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
+ VG_(record_fd_open)(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
}
}
@@ -4351,5 +4290,5 @@ PRE(sys_read, MayBlock)
unsigned int, fd, char *, buf, size_t, count);
- if (!fd_allowed(arg1, "read", tid, False))
+ if (!VG_(fd_allowed)(arg1, "read", tid, False))
set_result( -VKI_EBADF );
else
@@ -4367,5 +4306,5 @@ PRE(sys_write, MayBlock)
PRE_REG_READ3(ssize_t, "write",
unsigned int, fd, const char *, buf, size_t, count);
- if (!fd_allowed(arg1, "write", tid, False))
+ if (!VG_(fd_allowed)(arg1, "write", tid, False))
set_result( -VKI_EBADF );
else
@@ -4382,10 +4321,10 @@ PRE(sys_creat, MayBlock)
POST(sys_creat)
{
- if (!fd_allowed(res, "creat", tid, True)) {
+ if (!VG_(fd_allowed)(res, "creat", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
+ VG_(record_fd_open)(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
}
}
@@ -4404,6 +4343,6 @@ POST(sys_pipe)
Int *p = (Int *)arg1;
- if (!fd_allowed(p[0], "pipe", tid, True) ||
- !fd_allowed(p[1], "pipe", tid, True)) {
+ if (!VG_(fd_allowed)(p[0], "pipe", tid, True) ||
+ !VG_(fd_allowed)(p[1], "pipe", tid, True)) {
VG_(close)(p[0]);
VG_(close)(p[1]);
@@ -4412,6 +4351,6 @@ POST(sys_pipe)
POST_MEM_WRITE( arg1, 2*sizeof(int) );
if (VG_(clo_track_fds)) {
- record_fd_open(tid, p[0], NULL);
- record_fd_open(tid, p[1], NULL);
+ VG_(record_fd_open)(tid, p[0], NULL);
+ VG_(record_fd_open)(tid, p[1], NULL);
}
}
@@ -4455,50 +4394,4 @@ POST(sys_poll)
}
-PRE(sys_epoll_create, 0)
-{
- PRINT("sys_epoll_create ( %d )", arg1);
- PRE_REG_READ1(long, "epoll_create", int, size);
-}
-
-POST(sys_epoll_create)
-{
- if (!fd_allowed(res, "epoll_create", tid, True)) {
- VG_(close)(res);
- set_result( -VKI_EMFILE );
- } else {
- if (VG_(clo_track_fds))
- record_fd_open (tid, res, NULL);
- }
-}
-
-PRE(sys_epoll_ctl, 0)
-{
- static const char* epoll_ctl_s[3] = {
- "EPOLL_CTL_ADD",
- "EPOLL_CTL_DEL",
- "EPOLL_CTL_MOD"
- };
- PRINT("sys_epoll_ctl ( %d, %s, %d, %p )",
- arg1, ( arg2<3 ? epoll_ctl_s[arg2] : "?" ), arg3, arg4);
- PRE_REG_READ4(long, "epoll_ctl",
- int, epfd, int, op, int, fd, struct epoll_event *, event);
- PRE_MEM_READ( "epoll_ctl(event)", arg4, sizeof(struct epoll_event) );
-}
-
-PRE(sys_epoll_wait, MayBlock)
-{
- PRINT("sys_epoll_wait ( %d, %p, %d, %d )", arg1, arg2, arg3, arg4);
- PRE_REG_READ4(long, "epoll_wait",
- int, epfd, struct epoll_event *, events,
- int, maxevents, int, timeout);
- PRE_MEM_WRITE( "epoll_wait(events)", arg2, sizeof(struct epoll_event)*arg3);
-}
-
-POST(sys_epoll_wait)
-{
- if (res > 0)
- POST_MEM_WRITE( arg2, sizeof(struct epoll_event)*res ) ;
-}
-
PRE(sys_readlink, 0)
{
@@ -4523,5 +4416,5 @@ PRE(sys_readv, MayBlock)
unsigned long, fd, const struct iovec *, vector,
unsigned long, count);
- if (!fd_allowed(arg1, "readv", tid, False)) {
+ if (!VG_(fd_allowed)(arg1, "readv", tid, False)) {
set_result( -VKI_EBADF );
} else {
@@ -4597,37 +4490,4 @@ POST(sys_sched_getparam)
}
-PRE(old_select, MayBlock)
-{
- /* struct sel_arg_struct {
- unsigned long n;
- fd_set *inp, *outp, *exp;
- struct timeval *tvp;
- };
- */
- PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
- PRE_MEM_READ( "old_select(args)", arg1, 5*sizeof(UWord) );
-
- {
- UInt* arg_struct = (UInt*)arg1;
- UInt a1, a2, a3, a4, a5;
-
- a1 = arg_struct[0];
- a2 = arg_struct[1];
- a3 = arg_struct[2];
- a4 = arg_struct[3];
- a5 = arg_struct[4];
-
- PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
- if (a2 != (Addr)NULL)
- PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
- if (a3 != (Addr)NULL)
- PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
- if (a4 != (Addr)NULL)
- PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
- if (a5 != (Addr)NULL)
- PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
- }
-}
-
PRE(sys_select, MayBlock)
{
@@ -4974,6 +4834,6 @@ POST(sys_socketcall)
Int fd2 = ((Int*)((UWord*)arg2)[3])[1];
POST_MEM_WRITE( ((UWord*)arg2)[3], 2*sizeof(int) );
- if (!fd_allowed(fd1, "socketcall.socketpair", tid, True) ||
- !fd_allowed(fd2, "socketcall.socketpair", tid, True)) {
+ if (!VG_(fd_allowed)(fd1, "socketcall.socketpair", tid, True) ||
+ !VG_(fd_allowed)(fd2, "socketcall.socketpair", tid, True)) {
VG_(close)(fd1);
VG_(close)(fd2);
@@ -4982,6 +4842,6 @@ POST(sys_socketcall)
POST_MEM_WRITE( ((UWord*)arg2)[3], 2*sizeof(int) );
if (VG_(clo_track_fds)) {
- record_fd_open(tid, fd1, NULL);
- record_fd_open(tid, fd2, NULL);
+ VG_(record_fd_open)(tid, fd1, NULL);
+ VG_(record_fd_open)(tid, fd2, NULL);
}
}
@@ -4990,10 +4850,10 @@ POST(sys_socketcall)
case VKI_SYS_SOCKET:
- if (!fd_allowed(res, "socket", tid, True)) {
+ if (!VG_(fd_allowed)(res, "socket", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, NULL);
+ VG_(record_fd_open)(tid, res, NULL);
}
break;
@@ -5010,5 +4870,5 @@ POST(sys_socketcall)
case VKI_SYS_ACCEPT: {
/* int accept(int s, struct sockaddr *addr, int *addrlen); */
- if (!fd_allowed(res, "accept", tid, True)) {
+ if (!VG_(fd_allowed)(res, "accept", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
@@ -5021,5 +4881,5 @@ POST(sys_socketcall)
"socketcall.accept(addrlen_out)" );
if (VG_(clo_track_fds))
- record_fd_open(tid, res, NULL);
+ VG_(record_fd_open)(tid, res, NULL);
}
break;
@@ -5300,5 +5160,5 @@ PRE(sys_writev, MayBlock)
unsigned long, fd, const struct iovec *, vector,
unsigned long, count);
- if (!fd_allowed(arg1, "writev", tid, False)) {
+ if (!VG_(fd_allowed)(arg1, "writev", tid, False)) {
set_result( -VKI_EBADF );
} else {
@@ -5324,31 +5184,4 @@ PRE(sys_utimes, 0)
}
-PRE(sys_futex, MayBlock)
-{
- PRINT("sys_futex ( %p, %d, %d, %p, %p )", arg1,arg2,arg3,arg4,arg5);
- PRE_REG_READ6(long, "futex",
- vki_u32 *, futex, int, op, int, val,
- struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
- PRE_MEM_READ( "futex(futex)", arg1, sizeof(int) );
- if (arg2 == VKI_FUTEX_WAIT && arg4 != (UWord)NULL)
- PRE_MEM_READ( "futex(timeout)", arg4, sizeof(struct vki_timespec) );
- if (arg2 == VKI_FUTEX_REQUEUE)
- PRE_MEM_READ( "futex(futex2)", arg4, sizeof(int) );
-}
-
-POST(sys_futex)
-{
- POST_MEM_WRITE( arg1, sizeof(int) );
- if (arg2 == VKI_FUTEX_FD) {
- if (!fd_allowed(res, "futex", tid, True)) {
- VG_(close)(res);
- set_result( -VKI_EMFILE );
- } else {
- if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
- }
- }
-}
-
PRE(sys_sched_setaffinity, 0)
{
@@ -5646,10 +5479,10 @@ PRE(sys_mq_open, 0)
POST(sys_mq_open)
{
- if (!fd_allowed(res, "mq_open", tid, True)) {
+ if (!VG_(fd_allowed)(res, "mq_open", tid, True)) {
VG_(close)(res);
set_result( -VKI_EMFILE );
} else {
if (VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
+ VG_(record_fd_open)(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
}
}
@@ -5669,5 +5502,5 @@ PRE(sys_mq_timedsend, MayBlock)
vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
unsigned int, msg_prio, const struct timespec *, abs_timeout);
- if (!fd_allowed(arg1, "mq_timedsend", tid, False)) {
+ if (!VG_(fd_allowed)(arg1, "mq_timedsend", tid, False)) {
set_result( -VKI_EBADF );
} else {
@@ -5687,5 +5520,5 @@ PRE(sys_mq_timedreceive, MayBlock)
unsigned int *, msg_prio,
const struct timespec *, abs_timeout);
- if (!fd_allowed(arg1, "mq_timedreceive", tid, False)) {
+ if (!VG_(fd_allowed)(arg1, "mq_timedreceive", tid, False)) {
set_result( -VKI_EBADF );
} else {
@@ -5712,5 +5545,5 @@ PRE(sys_mq_notify, 0)
PRE_REG_READ2(long, "mq_notify",
vki_mqd_t, mqdes, const struct sigevent *, notification);
- if (!fd_allowed(arg1, "mq_notify", tid, False))
+ if (!VG_(fd_allowed)(arg1, "mq_notify", tid, False))
set_result( -VKI_EBADF );
else if (arg2 != 0)
@@ -5725,5 +5558,5 @@ PRE(sys_mq_getsetattr, 0)
vki_mqd_t, mqdes, const struct mq_attr *, mqstat,
struct mq_attr *, omqstat);
- if (!fd_allowed(arg1, "mq_getsetattr", tid, False)) {
+ if (!VG_(fd_allowed)(arg1, "mq_getsetattr", tid, False)) {
set_result( -VKI_EBADF );
} else {
--- valgrind/coregrind/linux/core_os.h #1.1:1.2
@@ -68,4 +68,12 @@ LINUX_SYSCALL_WRAPPER(sys_sysctl);
LINUX_SYSCALL_WRAPPER(sys_prctl);
+LINUX_SYSCALL_WRAPPER(sys_sendfile);
+LINUX_SYSCALL_WRAPPER(sys_sendfile64);
+LINUX_SYSCALL_WRAPPER(sys_futex);
+
+LINUX_SYSCALL_WRAPPER(sys_epoll_create);
+LINUX_SYSCALL_WRAPPER(sys_epoll_ctl);
+LINUX_SYSCALL_WRAPPER(sys_epoll_wait);
+
LINUX_SYSCALL_WRAPPER(sys_io_setup);
LINUX_SYSCALL_WRAPPER(sys_io_destroy);
--- valgrind/coregrind/linux/syscalls.c #1.1:1.2
@@ -30,5 +30,4 @@
#include "core.h"
-#include "syscall_wrappers.h"
/* ---------------------------------------------------------------------
@@ -341,4 +340,109 @@ PRE(sys_prctl, MayBlock)
}
+PRE(sys_sendfile, MayBlock)
+{
+ PRINT("sys_sendfile ( %d, %d, %p, %llu )", arg1,arg2,arg3,(ULong)arg4);
+ PRE_REG_READ4(ssize_t, "sendfile",
+ int, out_fd, int, in_fd, vki_off_t *, offset,
+ vki_size_t, count);
+ if (arg3 != (UWord)NULL)
+ PRE_MEM_WRITE( "sendfile(offset)", arg3, sizeof(vki_off_t) );
+}
+
+POST(sys_sendfile)
+{
+ POST_MEM_WRITE( arg3, sizeof( vki_off_t ) );
+}
+
+PRE(sys_sendfile64, MayBlock)
+{
+ PRINT("sendfile64 ( %d, %d, %p, %llu )",arg1,arg2,arg3,(ULong)arg4);
+ PRE_REG_READ4(ssize_t, "sendfile64",
+ int, out_fd, int, in_fd, vki_loff_t *, offset,
+ vki_size_t, count);
+ if (arg3 != (UWord)NULL)
+ PRE_MEM_WRITE( "sendfile64(offset)", arg3, sizeof(vki_loff_t) );
+}
+
+POST(sys_sendfile64)
+{
+ if (arg3 != (UWord)NULL ) {
+ POST_MEM_WRITE( arg3, sizeof(vki_loff_t) );
+ }
+}
+
+PRE(sys_futex, MayBlock)
+{
+ PRINT("sys_futex ( %p, %d, %d, %p, %p )", arg1,arg2,arg3,arg4,arg5);
+ PRE_REG_READ6(long, "futex",
+ vki_u32 *, futex, int, op, int, val,
+ struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
+ PRE_MEM_READ( "futex(futex)", arg1, sizeof(int) );
+ if (arg2 == VKI_FUTEX_WAIT && arg4 != (UWord)NULL)
+ PRE_MEM_READ( "futex(timeout)", arg4, sizeof(struct vki_timespec) );
+ if (arg2 == VKI_FUTEX_REQUEUE)
+ PRE_MEM_READ( "futex(futex2)", arg4, sizeof(int) );
+}
+
+POST(sys_futex)
+{
+ POST_MEM_WRITE( arg1, sizeof(int) );
+ if (arg2 == VKI_FUTEX_FD) {
+ if (!VG_(fd_allowed)(res, "futex", tid, True)) {
+ VG_(close)(res);
+ set_result( -VKI_EMFILE );
+ } else {
+ if (VG_(clo_track_fds))
+ VG_(record_fd_open)(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
+ }
+ }
+}
+
+PRE(sys_epoll_create, 0)
+{
+ PRINT("sys_epoll_create ( %d )", arg1);
+ PRE_REG_READ1(long, "epoll_create", int, size);
+}
+
+POST(sys_epoll_create)
+{
+ if (!VG_(fd_allowed)(res, "epoll_create", tid, True)) {
+ VG_(close)(res);
+ set_result( -VKI_EMFILE );
+ } else {
+ if (VG_(clo_track_fds))
+ VG_(record_fd_open) (tid, res, NULL);
+ }
+}
+
+PRE(sys_epoll_ctl, 0)
+{
+ static const char* epoll_ctl_s[3] = {
+ "EPOLL_CTL_ADD",
+ "EPOLL_CTL_DEL",
+ "EPOLL_CTL_MOD"
+ };
+ PRINT("sys_epoll_ctl ( %d, %s, %d, %p )",
+ arg1, ( arg2<3 ? epoll_ctl_s[arg2] : "?" ), arg3, arg4);
+ PRE_REG_READ4(long, "epoll_ctl",
+ int, epfd, int, op, int, fd, struct epoll_event *, event);
+ PRE_MEM_READ( "epoll_ctl(event)", arg4, sizeof(struct epoll_event) );
+}
+
+PRE(sys_epoll_wait, MayBlock)
+{
+ PRINT("sys_epoll_wait ( %d, %p, %d, %d )", arg1, arg2, arg3, arg4);
+ PRE_REG_READ4(long, "epoll_wait",
+ int, epfd, struct epoll_event *, events,
+ int, maxevents, int, timeout);
+ PRE_MEM_WRITE( "epoll_wait(events)", arg2, sizeof(struct epoll_event)*arg3);
+}
+
+POST(sys_epoll_wait)
+{
+ if (res > 0)
+ POST_MEM_WRITE( arg2, sizeof(struct epoll_event)*res ) ;
+}
+
// Nb: this wrapper is "Special" because we have to pad/unpad memory around
// the syscall itself, and this allows us to control exactly the code that
--- valgrind/coregrind/x86-linux/syscalls.c #1.5:1.6
@@ -31,6 +31,4 @@
#include "core.h"
-#include "syscall_wrappers.h"
-
/* We need our own copy of VG_(do_syscall)() to handle a special
race-condition. If we've got signals unblocked, and we take a
@@ -199,4 +197,62 @@ void VGA_(restart_syscall)(arch_thread_t
VG_(printf)(format, ## args)
+PRE(old_select, MayBlock)
+{
+ /* struct sel_arg_struct {
+ unsigned long n;
+ fd_set *inp, *outp, *exp;
+ struct timeval *tvp;
+ };
+ */
+ PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
+ PRE_MEM_READ( "old_select(args)", arg1, 5*sizeof(UWord) );
+
+ {
+ UInt* arg_struct = (UInt*)arg1;
+ UInt a1, a2, a3, a4, a5;
+
+ a1 = arg_struct[0];
+ a2 = arg_struct[1];
+ a3 = arg_struct[2];
+ a4 = arg_struct[3];
+ a5 = arg_struct[4];
+
+ PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
+ if (a2 != (Addr)NULL)
+ PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
+ if (a3 != (Addr)NULL)
+ PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
+ if (a4 != (Addr)NULL)
+ PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
+ if (a5 != (Addr)NULL)
+ PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
+ }
+}
+
+PRE(sys_clone, Special)
+{
+ PRINT("sys_clone ( %d, %p, %p, %p, %p )",arg1,arg2,arg3,arg4,arg5);
+ // XXX: really not sure about the last two args... if they are really
+ // there, we should do PRE_MEM_READs for both of them...
+ PRE_REG_READ4(int, "clone",
+ unsigned long, flags, void *, child_stack,
+ int *, parent_tidptr, int *, child_tidptr);
+
+ if (arg2 == 0 &&
+ (arg1 == (VKI_CLONE_CHILD_CLEARTID|VKI_CLONE_CHILD_SETTID|VKI_SIGCHLD)
+ || arg1 == (VKI_CLONE_PARENT_SETTID|VKI_SIGCHLD)))
+ {
+ VGA_(gen_sys_fork_before)(tid, tst);
+ set_result( VG_(do_syscall)(SYSNO, arg1, arg2, arg3, arg4, arg5) );
+ VGA_(gen_sys_fork_after) (tid, tst);
+ } else {
+ VG_(unimplemented)
+ ("clone(): not supported by Valgrind.\n "
+ "We do support programs linked against\n "
+ "libpthread.so, though. Re-run with -v and ensure that\n "
+ "you are picking up Valgrind's implementation of libpthread.so.");
+ }
+}
+
PRE(sys_modify_ldt, Special)
{
@@ -283,6 +339,12 @@ PRE(sys_get_thread_area, Special)
x86_linux_##name##_after }
-// This table maps from __NR_xxx syscall numbers to the appropriate
-// PRE/POST sys_foo() wrappers on x86.
+// This table maps from __NR_xxx syscall numbers (from
+// linux/include/asm-i386/unistd.h) to the appropriate PRE/POST sys_foo()
+// wrappers on x86 (as per sys_call_table in linux/arch/i386/kernel/entry.S).
+//
+// For those syscalls not handled by Valgrind, the annotation indicate its
+// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
+// (unknown).
+
const struct SyscallTableEntry VGA_(syscall_table)[] = {
// (restart_syscall) // 0
@@ -299,5 +361,5 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_unlink, sys_unlink), // 10
- GENX_(__NR_execve, sys_execve), // 11 (*??) P
+ GENX_(__NR_execve, sys_execve), // 11
GENX_(__NR_chdir, sys_chdir), // 12
GENXY(__NR_time, sys_time), // 13
@@ -306,6 +368,6 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_chmod, sys_chmod), // 15
// (__NR_lchown, sys_lchown16), // 16 ## P
- GENX_(__NR_break, sys_ni_syscall), // 17 -- unimplemented
- // (__NR_oldstat, sys_stat), // 18 * L -- obsolete
+ GENX_(__NR_break, sys_ni_syscall), // 17
+ // (__NR_oldstat, sys_stat), // 18 (obsolete)
GENX_(__NR_lseek, sys_lseek), // 19
@@ -317,17 +379,17 @@ const struct SyscallTableEntry VGA_(sysc
// (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
- GENXY(__NR_ptrace, sys_ptrace), // 26 (x86?) (L?)
- GENX_(__NR_alarm, sys_alarm), // 27 * P
+ GENXY(__NR_ptrace, sys_ptrace), // 26
+ GENX_(__NR_alarm, sys_alarm), // 27
// (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
- GENX_(__NR_pause, sys_pause), // 29 * P
+ GENX_(__NR_pause, sys_pause), // 29
- GENX_(__NR_utime, sys_utime), // 30 * P
- GENX_(__NR_stty, sys_ni_syscall), // 31 -- unimplemented
- GENX_(__NR_gtty, sys_ni_syscall), // 32 -- unimplemented
- GENX_(__NR_access, sys_access), // 33 * P
- GENX_(__NR_nice, sys_nice), // 34 * (almost P)
+ GENX_(__NR_utime, sys_utime), // 30
+ GENX_(__NR_stty, sys_ni_syscall), // 31
+ GENX_(__NR_gtty, sys_ni_syscall), // 32
+ GENX_(__NR_access, sys_access), // 33
+ GENX_(__NR_nice, sys_nice), // 34
- GENX_(__NR_ftime, sys_ni_syscall), // 35 -- unimplemented
- GENX_(__NR_sync, sys_sync), // 36 * (almost P)
+ GENX_(__NR_ftime, sys_ni_syscall), // 35
+ GENX_(__NR_sync, sys_sync), // 36
GENXY(__NR_kill, sys_kill), // 37
GENX_(__NR_rename, sys_rename), // 38
@@ -336,29 +398,29 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_rmdir, sys_rmdir), // 40
GENXY(__NR_dup, sys_dup), // 41
- GENXY(__NR_pipe, sys_pipe), // 42 (x86) P
+ GENXY(__NR_pipe, sys_pipe), // 42
GENXY(__NR_times, sys_times), // 43
- GENX_(__NR_prof, sys_ni_syscall), // 44 -- unimplemented
+ GENX_(__NR_prof, sys_ni_syscall), // 44
- GENX_(__NR_brk, sys_brk), // 45 * non-P
- GENX_(__NR_setgid, sys_setgid16), // 46 ## (SVr4,SVID)
- GENX_(__NR_getgid, sys_getgid16), // 47 ## P
- // (__NR_signal, sys_signal), // 48 * (ANSI C?)
- GENX_(__NR_geteuid, sys_geteuid16), // 49 ## P
+ GENX_(__NR_brk, sys_brk), // 45
+ GENX_(__NR_setgid, sys_setgid16), // 46
+ GENX_(__NR_getgid, sys_getgid16), // 47
+ // (__NR_signal, sys_signal), // 48 */* (ANSI C)
+ GENX_(__NR_geteuid, sys_geteuid16), // 49
- GENX_(__NR_getegid, sys_getegid16), // 50 ## (P16)
- GENX_(__NR_acct, sys_acct), // 51 * (SVR4, non-POSIX)
+ GENX_(__NR_getegid, sys_getegid16), // 50
+ GENX_(__NR_acct, sys_acct), // 51
LINX_(__NR_umount2, sys_umount), // 52
- GENX_(__NR_lock, sys_ni_syscall), // 53 -- unimplemented
- GENXY(__NR_ioctl, sys_ioctl), // 54 */x86 (varying)
+ GENX_(__NR_lock, sys_ni_syscall), // 53
+ GENXY(__NR_ioctl, sys_ioctl), // 54
GENXY(__NR_fcntl, sys_fcntl), // 55
- GENX_(__NR_mpx, sys_ni_syscall), // 56 -- unimplemented
- GENXY(__NR_setpgid, sys_setpgid), // 57 * P
- GENX_(__NR_ulimit, sys_ni_syscall), // 58 -- unimplemented
- // (__NR_oldolduname, sys_olduname), // 59 (?) L -- obsolete
+ GENX_(__NR_mpx, sys_ni_syscall), // 56
+ GENXY(__NR_setpgid, sys_setpgid), // 57
+ GENX_(__NR_ulimit, sys_ni_syscall), // 58
+ // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
GENX_(__NR_umask, sys_umask), // 60
- GENX_(__NR_chroot, sys_chroot), // 61 * (almost P)
- // (__NR_ustat, sys_ustat) // 62 * (SVr4) -- deprecated
+ GENX_(__NR_chroot, sys_chroot), // 61
+ // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
GENXY(__NR_dup2, sys_dup2), // 63
GENX_(__NR_getppid, sys_getppid), // 64
@@ -366,33 +428,33 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_getpgrp, sys_getpgrp), // 65
GENX_(__NR_setsid, sys_setsid), // 66
- GENXY(__NR_sigaction, sys_sigaction), // 67 (x86) P
- // (__NR_sgetmask, sys_sgetmask), // 68 * (ANSI C)
- // (__NR_ssetmask, sys_ssetmask), // 69 * (ANSI C)
+ GENXY(__NR_sigaction, sys_sigaction), // 67
+ // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
+ // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
- GENX_(__NR_setreuid, sys_setreuid16), // 70 ## (BSD4.3)
- GENX_(__NR_setregid, sys_setregid16), // 71 ## (BSD4.3)
- GENX_(__NR_sigsuspend, sys_sigsuspend), // 72 () P
- GENXY(__NR_sigpending, sys_sigpending), // 73 * P
- // (__NR_sethostname, sys_sethostname), // 74 * (almost P)
+ GENX_(__NR_setreuid, sys_setreuid16), // 70
+ GENX_(__NR_setregid, sys_setregid16), // 71
+ GENX_(__NR_sigsuspend, sys_sigsuspend), // 72
+ GENXY(__NR_sigpending, sys_sigpending), // 73
+ // (__NR_sethostname, sys_sethostname), // 74 */*
- GENX_(__NR_setrlimit, sys_setrlimit), // 75 * (SVr4,BSD4.3)
- GENXY(__NR_getrlimit, sys_old_getrlimit), // 76 * (SVr4,BSD4.3)
- GENXY(__NR_getrusage, sys_getrusage), // 77 * (SVr4,BSD4.3)
- GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 * P
- GENX_(__NR_settimeofday, sys_settimeofday), // 79 * almost-P
+ GENX_(__NR_setrlimit, sys_setrlimit), // 75
+ GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
+ GENXY(__NR_getrusage, sys_getrusage), // 77
+ GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
+ GENX_(__NR_settimeofday, sys_settimeofday), // 79
- GENXY(__NR_getgroups, sys_getgroups16), // 80 ## P
- GENX_(__NR_setgroups, sys_setgroups16), // 81 ## almost-P
- GENX_(__NR_select, old_select), // 82 (x86) (4.4BSD)
- GENX_(__NR_symlink, sys_symlink), // 83 * P
- // (__NR_oldlstat, sys_lstat), // 84 * L -- obsolete
+ GENXY(__NR_getgroups, sys_getgroups16), // 80
+ GENX_(__NR_setgroups, sys_setgroups16), // 81
+ PLAX_(__NR_select, old_select), // 82
+ GENX_(__NR_symlink, sys_symlink), // 83
+ // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
- GENXY(__NR_readlink, sys_readlink), // 85 * (X/OPEN,4.4BSD)
- // (__NR_uselib, sys_uselib), // 86 * L
- // (__NR_swapon, sys_swapon), // 87 * L
- // (__NR_reboot, sys_reboot), // 88 * L
- // (__NR_readdir, old_readdir), // 89 () L -- superseded
+ GENXY(__NR_readlink, sys_readlink), // 85
+ // (__NR_uselib, sys_uselib), // 86 */Linux
+ // (__NR_swapon, sys_swapon), // 87 */Linux
+ // (__NR_reboot, sys_reboot), // 88 */Linux
+ // (__NR_readdir, old_readdir), // 89 -- superseded
- GENX_(__NR_mmap, old_mmap), // 90 (x86) (P but not...)
+ GENX_(__NR_mmap, old_mmap), // 90
GENXY(__NR_munmap, sys_munmap), // 91
GENX_(__NR_truncate, sys_truncate), // 92
@@ -400,70 +462,70 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_fchmod, sys_fchmod), // 94
- GENX_(__NR_fchown, sys_fchown16), // 95 ## (SVr4,BSD4.3)
- GENX_(__NR_getpriority, sys_getpriority), // 96 * (SVr4,4.4BSD)
- GENX_(__NR_setpriority, sys_setpriority), // 97 * (SVr4,4.4BSD)
- GENX_(__NR_profil, sys_ni_syscall), // 98 -- unimplemented
- GENXY(__NR_statfs, sys_statfs), // 99 * (P-ish)
+ GENX_(__NR_fchown, sys_fchown16), // 95
+ GENX_(__NR_getpriority, sys_getpriority), // 96
+ GENX_(__NR_setpriority, sys_setpriority), // 97
+ GENX_(__NR_profil, sys_ni_syscall), // 98
+ GENXY(__NR_statfs, sys_statfs), // 99
- GENXY(__NR_fstatfs, sys_fstatfs), // 100 * (P-ish)
- LINX_(__NR_ioperm, sys_ioperm), // 101 * L
- GENXY(__NR_socketcall, sys_socketcall), // 102 */Linux (?)
+ GENXY(__NR_fstatfs, sys_fstatfs), // 100
+ LINX_(__NR_ioperm, sys_ioperm), // 101
+ GENXY(__NR_socketcall, sys_socketcall), // 102
LINXY(__NR_syslog, sys_syslog), // 103
- GENXY(__NR_setitimer, sys_setitimer), // 104 * (SVr4,4.4BSD)
+ GENXY(__NR_setitimer, sys_setitimer), // 104
- GENXY(__NR_getitimer, sys_getitimer), // 105 * (SVr4,4.4BSD)
- GENXY(__NR_stat, sys_newstat), // 106 * P
- GENXY(__NR_lstat, sys_newlstat), // 107 *
- GENXY(__NR_fstat, sys_newfstat), // 108 * P (SVr4,BSD4.3)
- // (__NR_olduname, sys_uname), // 109 (?) L -- obsolete
+ GENXY(__NR_getitimer, sys_getitimer), // 105
+ GENXY(__NR_stat, sys_newstat), // 106
+ GENXY(__NR_lstat, sys_newlstat), // 107
+ GENXY(__NR_fstat, sys_newfstat), // 108
+ // (__NR_olduname, sys_uname), // 109 -- obsolete
- GENX_(__NR_iopl, sys_iopl), // 110 (x86/amd64) L
+ GENX_(__NR_iopl, sys_iopl), // 110
LINX_(__NR_vhangup, sys_vhangup), // 111
- GENX_(__NR_idle, sys_ni_syscall), // 112 -- unimplemented
+ GENX_(__NR_idle, sys_ni_syscall), // 112
// (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
- GENXY(__NR_wait4, sys_wait4), // 114 * P
+ GENXY(__NR_wait4, sys_wait4), // 114
// (__NR_swapoff, sys_swapoff), // 115 */Linux
LINXY(__NR_sysinfo, sys_sysinfo), // 116
- GENXY(__NR_ipc, sys_ipc), // 117 (x86) L
+ GENXY(__NR_ipc, sys_ipc), // 117
GENX_(__NR_fsync, sys_fsync), // 118
- // (__NR_sigreturn, sys_sigreturn), // 119 () L
+ // (__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
- GENX_(__NR_clone, sys_clone), // 120 (x86) L
- // (__NR_setdomainname, sys_setdomainname), // 121 * (non-P?)
- GENXY(__NR_uname, sys_newuname), // 122 * P
- PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123 (x86,amd64) L
- LINXY(__NR_adjtimex, sys_adjtimex), // 124 * L
+ PLAX_(__NR_clone, sys_clone), // 120
+ // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
+ GENXY(__NR_uname, sys_newuname), // 122
+ PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
+ LINXY(__NR_adjtimex, sys_adjtimex), // 124
- GENXY(__NR_mprotect, sys_mprotect), // 125 * P
- GENXY(__NR_sigprocmask, sys_sigprocmask), // 126 * P
+ GENXY(__NR_mprotect, sys_mprotect), // 125
+ GENXY(__NR_sigprocmask, sys_sigprocmask), // 126
// Nb: create_module() was removed 2.4-->2.6
- GENX_(__NR_create_module, sys_ni_syscall), // 127 -- unimplemented
- GENX_(__NR_init_module, sys_init_module), // 128 * L?
- // (__NR_delete_module, sys_delete_module), // 129 () (L?)
+ GENX_(__NR_create_module, sys_ni_syscall), // 127
+ GENX_(__NR_init_module, sys_init_module), // 128
+ // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)?
// Nb: get_kernel_syms() was removed 2.4-->2.6
- GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130 -- unimplemented
- GENX_(__NR_quotactl, sys_quotactl), // 131 * (?)
+ GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
+ GENX_(__NR_quotactl, sys_quotactl), // 131
GENX_(__NR_getpgid, sys_getpgid), // 132
- GENX_(__NR_fchdir, sys_fchdir), // 133 * (almost-P)
- // (__NR_bdflush, sys_bdflush), // 134 * L
+ GENX_(__NR_fchdir, sys_fchdir), // 133
+ // (__NR_bdflush, sys_bdflush), // 134 */Linux
- // (__NR_sysfs, sys_sysfs), // 135 * (SVr4)
+ // (__NR_sysfs, sys_sysfs), // 135 SVr4
LINX_(__NR_personality, sys_personality), // 136
- GENX_(__NR_afs_syscall, sys_ni_syscall), // 137 -- unimplemented
- LINX_(__NR_setfsuid, sys_setfsuid16), // 138 ## L
- LINX_(__NR_setfsgid, sys_setfsgid16), // 139 ## L
+ GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
+ LINX_(__NR_setfsuid, sys_setfsuid16), // 138
+ LINX_(__NR_setfsgid, sys_setfsgid16), // 139
LINXY(__NR__llseek, sys_llseek), // 140
- GENXY(__NR_getdents, sys_getdents), // 141 * (SVr4,SVID)
- GENX_(__NR__newselect, sys_select), // 142 * (4.4BSD...)
- GENX_(__NR_flock, sys_flock), // 143 * (4.4BSD...)
- GENX_(__NR_msync, sys_msync), // 144 * P
+ GENXY(__NR_getdents, sys_getdents), // 141
+ GENX_(__NR__newselect, sys_select), // 142
+ GENX_(__NR_flock, sys_flock), // 143
+ GENX_(__NR_msync, sys_msync), // 144
- GENXY(__NR_readv, sys_readv), // 145 * P
- GENX_(__NR_writev, sys_writev), // 146 * P
- GENX_(__NR_getsid, sys_getsid), // 147 * P
- GENX_(__NR_fdatasync, sys_fdatasync), // 148 * P
+ GENXY(__NR_readv, sys_readv), // 145
+ GENX_(__NR_writev, sys_writev), // 146
+ GENX_(__NR_getsid, sys_getsid), // 147
+ GENX_(__NR_fdatasync, sys_fdatasync), // 148
LINXY(__NR__sysctl, sys_sysctl), // 149
@@ -481,5 +543,5 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
- // (__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 (gen)
+ // (__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
GENXY(__NR_nanosleep, sys_nanosleep), // 162
GENX_(__NR_mremap, sys_mremap), // 163
@@ -488,43 +550,43 @@ const struct SyscallTableEntry VGA_(sysc
LINXY(__NR_getresuid, sys_getresuid16), // 165
// (__NR_vm86, sys_vm86), // 166 x86/Linux-only
- GENX_(__NR_query_module, sys_ni_syscall), // 167 -- unimplemented
- GENXY(__NR_poll, sys_poll), // 168 * (XPG4-UNIX)
- // (__NR_nfsservctl, sys_nfsservctl), // 169 * L
+ GENX_(__NR_query_module, sys_ni_syscall), // 167
+ GENXY(__NR_poll, sys_poll), // 168
+ // (__NR_nfsservctl, sys_nfsservctl), // 169 */Linux
LINX_(__NR_setresgid, sys_setresgid16), // 170
LINXY(__NR_getresgid, sys_getresgid16), // 171
LINX_(__NR_prctl, sys_prctl), // 172
- // (__NR_rt_sigreturn, sys_rt_sigreturn), // 173 (x86) ()
- GENXY(__NR_rt_sigaction, sys_rt_sigaction), // 174 (x86) ()
+ // (__NR_rt_sigreturn, sys_rt_sigreturn), // 173 x86/Linux only?
+ GENXY(__NR_rt_sigaction, sys_rt_sigaction), // 174
- GENXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175 * ?
- GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 * ?
- GENXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177 * ?
- GENXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178 * ?
- GENX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 () ()
- GENXY(__NR_pread64, sys_pread64), // 180 * (Unix98?)
+ GENXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175
+ GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 176
+ GENXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177
+ GENXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178
+ GENX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179
- GENX_(__NR_pwrite64, sys_pwrite64), // 181 * (Unix98?)
- GENX_(__NR_chown, sys_chown16), // 182 * P
- GENXY(__NR_getcwd, sys_getcwd), // 183 * P
- GENXY(__NR_capget, sys_capget), // 184 * L?
+ GENXY(__NR_pread64, sys_pread64), // 180
+ GENX_(__NR_pwrite64, sys_pwrite64), // 181
+ GENX_(__NR_chown, sys_chown16), // 182
+ GENXY(__NR_getcwd, sys_getcwd), // 183
+ GENXY(__NR_capget, sys_capget), // 184
- GENX_(__NR_capset, sys_capset), // 185 * L?
- GENXY(__NR_sigaltstack, sys_sigaltstack), // 186 (x86) (XPG4-UNIX)
- GENXY(__NR_sendfile, sys_sendfile), // 187 * L
- GENXY(__NR_getpmsg, sys_getpmsg), // 188 (?) (?)
- GENX_(__NR_putpmsg, sys_putpmsg), // 189 (?) (?)
+ GENX_(__NR_capset, sys_capset), // 185
+ GENXY(__NR_sigaltstack, sys_sigaltstack), // 186
+ LINXY(__NR_sendfile, sys_sendfile), // 187
+ GENXY(__NR_getpmsg, sys_getpmsg), // 188
+ GENX_(__NR_putpmsg, sys_putpmsg), // 189
// Nb: we convert vfork() to fork() in VG_(pre_syscall)().
- // (__NR_vfork, sys_vfork), // 190 -- Valgrind avoids
- GENXY(__NR_ugetrlimit, sys_getrlimit), // 191 * (?)
- GENXY(__NR_mmap2, sys_mmap2), // 192 (x86?) P?
- GENX_(__NR_truncate64, sys_truncate64), // 193 %% (P?)
- GENX_(__NR_ftruncate64, sys_ftruncate64), // 194 %% (P?)
+ // (__NR_vfork, sys_vfork), // 190
+ GENXY(__NR_ugetrlimit, sys_getrlimit), // 191
+ GENXY(__NR_mmap2, sys_mmap2), // 192
+ GENX_(__NR_truncate64, sys_truncate64), // 193
+ GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
- GENXY(__NR_stat64, sys_stat64), // 195 %% (?)
- GENXY(__NR_lstat64, sys_lstat64), // 196 %% (?)
- GENXY(__NR_fstat64, sys_fstat64), // 197 %% (?)
- GENX_(__NR_lchown32, sys_lchown), // 198 * (L?)
+ GENXY(__NR_stat64, sys_stat64), // 195
+ GENXY(__NR_lstat64, sys_lstat64), // 196
+ GENXY(__NR_fstat64, sys_fstat64), // 197
+ GENX_(__NR_lchown32, sys_lchown), // 198
GENX_(__NR_getuid32, sys_getuid), // 199
@@ -532,10 +594,10 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_geteuid32, sys_geteuid), // 201
GENX_(__NR_getegid32, sys_getegid), // 202
- GENX_(__NR_setreuid32, sys_setreuid), // 203 * (BSD4.3)
- GENX_(__NR_setregid32, sys_setregid), // 204 * (BSD4.3)
+ GENX_(__NR_setreuid32, sys_setreuid), // 203
+ GENX_(__NR_setregid32, sys_setregid), // 204
- GENXY(__NR_getgroups32, sys_getgroups), // 205 * P
- GENX_(__NR_setgroups32, sys_setgroups), // 206 * almost-P
- GENX_(__NR_fchown32, sys_fchown), // 207 * (SVr4,BSD4.3)
+ GENXY(__NR_getgroups32, sys_getgroups), // 205
+ GENX_(__NR_setgroups32, sys_setgroups), // 206
+ GENX_(__NR_fchown32, sys_fchown), // 207
LINX_(__NR_setresuid32, sys_setresuid), // 208
LINXY(__NR_getresuid32, sys_getresuid), // 209
@@ -543,41 +605,41 @@ const struct SyscallTableEntry VGA_(sysc
LINX_(__NR_setresgid32, sys_setresgid), // 210
LINXY(__NR_getresgid32, sys_getresgid), // 211
- GENX_(__NR_chown32, sys_chown), // 212 * P
- GENX_(__NR_setuid32, sys_setuid), // 213 *
- GENX_(__NR_setgid32, sys_setgid), // 214 * (SVr4,SVID)
+ GENX_(__NR_chown32, sys_chown), // 212
+ GENX_(__NR_setuid32, sys_setuid), // 213
+ GENX_(__NR_setgid32, sys_setgid), // 214
LINX_(__NR_setfsuid32, sys_setfsuid), // 215
LINX_(__NR_setfsgid32, sys_setfsgid), // 216
// (__NR_pivot_root, sys_pivot_root), // 217 */Linux
- GENXY(__NR_mincore, sys_mincore), // 218 * non-P?
- GENX_(__NR_madvise, sys_madvise), // 219 * P
+ GENXY(__NR_mincore, sys_mincore), // 218
+ GENX_(__NR_madvise, sys_madvise), // 219
- GENXY(__NR_getdents64, sys_getdents64), // 220 * (SVr4,SVID?)
- GENXY(__NR_fcntl64, sys_fcntl64), // 221 * P?
- GENX_(222, sys_ni_syscall), // 222 -- reserved for TUX
- GENX_(223, sys_ni_syscall), // 223 -- unused
+ GENXY(__NR_getdents64, sys_getdents64), // 220
+ GENXY(__NR_fcntl64, sys_fcntl64), // 221
+ GENX_(222, sys_ni_syscall), // 222
+ GENX_(223, sys_ni_syscall), // 223
// (__NR_gettid, sys_gettid), // 224 */Linux
// (__NR_readahead, sys_readahead), // 225 */(Linux?)
- GENX_(__NR_setxattr, sys_setxattr), // 226 * L?
- GENX_(__NR_lsetxattr, sys_lsetxattr), // 227 * L?
- GENX_(__NR_fsetxattr, sys_fsetxattr), // 228 * L?
- GENXY(__NR_getxattr, sys_getxattr), // 229 * L?
+ GENX_(__NR_setxattr, sys_setxattr), // 226
+ GENX_(__NR_lsetxattr, sys_lsetxattr), // 227
+ GENX_(__NR_fsetxattr, sys_fsetxattr), // 228
+ GENXY(__NR_getxattr, sys_getxattr), // 229
- GENXY(__NR_lgetxattr, sys_lgetxattr), // 230 * L?
- GENXY(__NR_fgetxattr, sys_fgetxattr), // 231 * L?
- GENXY(__NR_listxattr, sys_listxattr), // 232 * L?
- GENXY(__NR_llistxattr, sys_llistxattr), // 233 * L?
- GENXY(__NR_flistxattr, sys_flistxattr), // 234 * L?
+ GENXY(__NR_lgetxattr, sys_lgetxattr), // 230
+ GENXY(__NR_fgetxattr, sys_fgetxattr), // 231
+ GENXY(__NR_listxattr, sys_listxattr), // 232
+ GENXY(__NR_llistxattr, sys_llistxattr), // 233
+ GENXY(__NR_flistxattr, sys_flistxattr), // 234
- GENX_(__NR_removexattr, sys_removexattr), // 235 * L?
- GENX_(__NR_lremovexattr, sys_lremovexattr), // 236 * L?
- GENX_(__NR_fremovexattr, sys_fremovexattr), // 237 * L?
+ GENX_(__NR_removexattr, sys_removexattr), // 235
+ GENX_(__NR_lremovexattr, sys_lremovexattr), // 236
+ GENX_(__NR_fremovexattr, sys_fremovexattr), // 237
// (__NR_tkill, sys_tkill), // 238 */Linux
- GENXY(__NR_sendfile64, sys_sendfile64), // 239 * L
+ LINXY(__NR_sendfile64, sys_sendfile64), // 239
- GENXY(__NR_futex, sys_futex), //...
[truncated message content] |
|
From: Nicholas N. <nj...@ca...> - 2004-11-17 17:22:16
|
CVS commit by nethercote:
Add coregrind/linux/ and coregrind/linux/* that was supposed to go in the last
commit.
A linux/Makefile.am 1.1
A linux/core_os.h 1.1 [GPL (v2+)]
A linux/syscalls.c 1.1 [GPL (v2+)]
M +0 -9 core.h 1.53
M +0 -106 vg_syscalls.c 1.220
M +8 -8 x86-linux/syscalls.c 1.5
--- valgrind/coregrind/core.h #1.52:1.53
@@ -1535,13 +1535,4 @@ GEN_SYSCALL_WRAPPER(sys_fchown16);
GEN_SYSCALL_WRAPPER(sys_chown16); // ## P
-GEN_SYSCALL_WRAPPER(sys_setresuid16); // ## (non-standard)
-GEN_SYSCALL_WRAPPER(sys_getresuid16); // ## L
-GEN_SYSCALL_WRAPPER(sys_setresgid16); // ## (non-standard)
-GEN_SYSCALL_WRAPPER(sys_getresgid16); // ## L
-GEN_SYSCALL_WRAPPER(sys_setresuid); // * (non-standard)
-GEN_SYSCALL_WRAPPER(sys_getresuid); // * L
-GEN_SYSCALL_WRAPPER(sys_setresgid); // * (non-standard)
-GEN_SYSCALL_WRAPPER(sys_getresgid); // * L
-
GEN_SYSCALL_WRAPPER(sys_ptrace); // (x86?) (almost-P)
--- valgrind/coregrind/vg_syscalls.c #1.219:1.220
@@ -1136,18 +1136,4 @@ PRE(sys_set_tid_address, Special)
}
-PRE(sys_setresgid16, 0)
-{
- PRINT("sys_setresgid16 ( %d, %d, %d )", arg1, arg2, arg3);
- PRE_REG_READ3(long, "setresgid16",
- vki_old_gid_t, rgid, vki_old_gid_t, egid, vki_old_gid_t, sgid);
-}
-
-PRE(sys_setresgid, 0)
-{
- PRINT("sys_setresgid ( %d, %d, %d )", arg1, arg2, arg3);
- PRE_REG_READ3(long, "setresgid",
- vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid);
-}
-
PRE(sys_iopl, 0)
{
@@ -1551,18 +1537,4 @@ PRE(sys_setregid16, 0)
}
-PRE(sys_setresuid16, 0)
-{
- PRINT("sys_setresuid16 ( %d, %d, %d )", arg1, arg2, arg3);
- PRE_REG_READ3(long, "setresuid16",
- vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid);
-}
-
-PRE(sys_setresuid, 0)
-{
- PRINT("sys_setresuid ( %d, %d, %d )", arg1, arg2, arg3);
- PRE_REG_READ3(long, "setresuid",
- vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid);
-}
-
PRE(sys_sendfile, MayBlock)
{
@@ -2300,82 +2272,4 @@ PRE(sys_getppid, 0)
}
-PRE(sys_getresgid16, 0)
-{
- PRINT("sys_getresgid16 ( %p, %p, %p )", arg1,arg2,arg3);
- PRE_REG_READ3(long, "getresgid16",
- vki_old_gid_t *, rgid, vki_old_gid_t *, egid,
- vki_old_gid_t *, sgid);
- PRE_MEM_WRITE( "getresgid16(rgid)", arg1, sizeof(vki_old_gid_t) );
- PRE_MEM_WRITE( "getresgid16(egid)", arg2, sizeof(vki_old_gid_t) );
- PRE_MEM_WRITE( "getresgid16(sgid)", arg3, sizeof(vki_old_gid_t) );
-}
-
-POST(sys_getresgid16)
-{
- if (res == 0) {
- POST_MEM_WRITE( arg1, sizeof(vki_old_gid_t) );
- POST_MEM_WRITE( arg2, sizeof(vki_old_gid_t) );
- POST_MEM_WRITE( arg3, sizeof(vki_old_gid_t) );
- }
-}
-
-PRE(sys_getresgid, 0)
-{
- PRINT("sys_getresgid ( %p, %p, %p )", arg1,arg2,arg3);
- PRE_REG_READ3(long, "getresgid",
- vki_gid_t *, rgid, vki_gid_t *, egid, vki_gid_t *, sgid);
- PRE_MEM_WRITE( "getresgid(rgid)", arg1, sizeof(vki_gid_t) );
- PRE_MEM_WRITE( "getresgid(egid)", arg2, sizeof(vki_gid_t) );
- PRE_MEM_WRITE( "getresgid(sgid)", arg3, sizeof(vki_gid_t) );
-}
-
-POST(sys_getresgid)
-{
- if (res == 0) {
- POST_MEM_WRITE( arg1, sizeof(vki_gid_t) );
- POST_MEM_WRITE( arg2, sizeof(vki_gid_t) );
- POST_MEM_WRITE( arg3, sizeof(vki_gid_t) );
- }
-}
-
-PRE(sys_getresuid16, 0)
-{
- PRINT("sys_getresuid16 ( %p, %p, %p )", arg1,arg2,arg3);
- PRE_REG_READ3(long, "getresuid16",
- vki_old_uid_t *, ruid, vki_old_uid_t *, euid,
- vki_old_uid_t *, suid);
- PRE_MEM_WRITE( "getresuid16(ruid)", arg1, sizeof(vki_old_uid_t) );
- PRE_MEM_WRITE( "getresuid16(euid)", arg2, sizeof(vki_old_uid_t) );
- PRE_MEM_WRITE( "getresuid16(suid)", arg3, sizeof(vki_old_uid_t) );
-}
-
-POST(sys_getresuid16)
-{
- if (res == 0) {
- POST_MEM_WRITE( arg1, sizeof(vki_old_uid_t) );
- POST_MEM_WRITE( arg2, sizeof(vki_old_uid_t) );
- POST_MEM_WRITE( arg3, sizeof(vki_old_uid_t) );
- }
-}
-
-PRE(sys_getresuid, 0)
-{
- PRINT("sys_getresuid ( %p, %p, %p )", arg1,arg2,arg3);
- PRE_REG_READ3(long, "getresuid",
- vki_uid_t *, ruid, vki_uid_t *, euid, vki_uid_t *, suid);
- PRE_MEM_WRITE( "getresuid(ruid)", arg1, sizeof(vki_uid_t) );
- PRE_MEM_WRITE( "getresuid(euid)", arg2, sizeof(vki_uid_t) );
- PRE_MEM_WRITE( "getresuid(suid)", arg3, sizeof(vki_uid_t) );
-}
-
-POST(sys_getresuid)
-{
- if (res == 0) {
- POST_MEM_WRITE( arg1, sizeof(vki_uid_t) );
- POST_MEM_WRITE( arg2, sizeof(vki_uid_t) );
- POST_MEM_WRITE( arg3, sizeof(vki_uid_t) );
- }
-}
-
static void common_post_getrlimit(UWord a1, UWord a2)
{
--- valgrind/coregrind/x86-linux/syscalls.c #1.4:1.5
@@ -484,7 +484,7 @@ const struct SyscallTableEntry VGA_(sysc
GENXY(__NR_nanosleep, sys_nanosleep), // 162
GENX_(__NR_mremap, sys_mremap), // 163
- GENX_(__NR_setresuid, sys_setresuid16), // 164
+ LINX_(__NR_setresuid, sys_setresuid16), // 164
- GENXY(__NR_getresuid, sys_getresuid16), // 165
+ LINXY(__NR_getresuid, sys_getresuid16), // 165
// (__NR_vm86, sys_vm86), // 166 x86/Linux-only
GENX_(__NR_query_module, sys_ni_syscall), // 167 -- unimplemented
@@ -492,6 +492,6 @@ const struct SyscallTableEntry VGA_(sysc
// (__NR_nfsservctl, sys_nfsservctl), // 169 * L
- GENX_(__NR_setresgid, sys_setresgid16), // 170
- GENXY(__NR_getresgid, sys_getresgid16), // 171
+ LINX_(__NR_setresgid, sys_setresgid16), // 170
+ LINXY(__NR_getresgid, sys_getresgid16), // 171
LINX_(__NR_prctl, sys_prctl), // 172
// (__NR_rt_sigreturn, sys_rt_sigreturn), // 173 (x86) ()
@@ -538,9 +538,9 @@ const struct SyscallTableEntry VGA_(sysc
GENX_(__NR_setgroups32, sys_setgroups), // 206 * almost-P
GENX_(__NR_fchown32, sys_fchown), // 207 * (SVr4,BSD4.3)
- GENX_(__NR_setresuid32, sys_setresuid), // 208
- GENXY(__NR_getresuid32, sys_getresuid), // 209
+ LINX_(__NR_setresuid32, sys_setresuid), // 208
+ LINXY(__NR_getresuid32, sys_getresuid), // 209
- GENX_(__NR_setresgid32, sys_setresgid), // 210
- GENXY(__NR_getresgid32, sys_getresgid), // 211
+ LINX_(__NR_setresgid32, sys_setresgid), // 210
+ LINXY(__NR_getresgid32, sys_getresgid), // 211
GENX_(__NR_chown32, sys_chown), // 212 * P
GENX_(__NR_setuid32, sys_setuid), // 213 *
|
|
From: Nicholas N. <nj...@ca...> - 2004-11-17 17:12:51
|
CVS commit by nethercote:
Arch-abstraction:
- Moved the system call table into x86-linux, since it's platform specific.
- Started moving the non-generic syscall wrappers into linux/syscalls.c and
x86-linux/syscalls.c as appropriate.
- Added new coregrind/linux/ directory and some files in it.
M +1 -0 Makefile.core-AM_CPPFLAGS.am 1.7
M +1 -0 configure.in 1.142
M +5 -2 coregrind/Makefile.am 1.104
M +360 -4 coregrind/core.h 1.52
M +38 -866 coregrind/vg_syscalls.c 1.219
M +467 -0 coregrind/x86-linux/syscalls.c 1.4
--- valgrind/Makefile.core-AM_CPPFLAGS.am #1.6:1.7
@@ -1,4 +1,5 @@
add_includes = -I$(top_builddir)/coregrind -I$(top_srcdir)/coregrind \
-I$(top_srcdir)/coregrind/$(VG_ARCH) \
+ -I$(top_srcdir)/coregrind/$(VG_OS) \
-I$(top_srcdir)/coregrind/$(VG_PLATFORM) \
-I$(top_builddir)/include -I$(top_srcdir)/include \
--- valgrind/configure.in #1.141:1.142
@@ -322,4 +322,5 @@
coregrind/docs/Makefile
coregrind/x86/Makefile
+ coregrind/linux/Makefile
coregrind/x86-linux/Makefile
addrcheck/Makefile
--- valgrind/coregrind/Makefile.am #1.103:1.104
@@ -2,5 +2,5 @@
include $(top_srcdir)/Makefile.core-AM_CPPFLAGS.am
-SUBDIRS = $(VG_ARCH) $(VG_PLATFORM) demangle . docs
+SUBDIRS = $(VG_ARCH) $(VG_OS) $(VG_PLATFORM) demangle . docs
AM_CPPFLAGS += -DVG_LIBDIR="\"$(valdir)"\" -I$(srcdir)/demangle \
@@ -24,4 +24,5 @@
core.h \
core_asm.h \
+ syscall_wrappers.h \
ume.h \
vg_symtab2.h \
@@ -78,8 +79,10 @@
vg_transtab.c
+## libplatform.a must be before libarch.a and libos.a, it seems.
stage2_extra= \
demangle/libdemangle.a \
+ ${VG_PLATFORM}/libplatform.a \
${VG_ARCH}/libarch.a \
- ${VG_PLATFORM}/libplatform.a
+ ${VG_OS}/libos.a
## Test repeated in both arms of the if-then-else because older versions of
--- valgrind/coregrind/core.h #1.51:1.52
@@ -87,4 +87,9 @@
#include "tool.h" // tool stuff
#include "core_arch.h" // arch-specific stuff, eg. x86/core_arch.h
+
+// Ugly: this is needed by linux/core_os.h
+typedef struct _ThreadState ThreadState;
+
+#include "core_os.h" // OS-specific stuff, eg. linux/core_os.h
#include "core_platform.h" // platform-specific stuff,
// eg. x86-linux/core_platform.h
@@ -704,5 +709,5 @@ typedef
typedef struct ProxyLWP ProxyLWP;
-typedef
+//typedef
struct _ThreadState {
/* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
@@ -850,6 +855,6 @@ typedef
/* Architecture-specific thread state */
arch_thread_t arch;
-}
-ThreadState;
+};
+//ThreadState;
@@ -1398,4 +1403,334 @@ extern void VG_(init_preopened_fds) ( vo
extern void VG_(show_open_fds) ( void );
+// Return true if address range entirely contained within client
+// address space.
+Bool VG_(valid_client_addr)(Addr start, SizeT size, ThreadId tid,
+ const Char *syscallname);
+
+// Flags describing syscall wrappers
+#define Special (1 << 0)
+#define MayBlock (1 << 1)
+#define NBRunInLWP (1 << 2) // non-blocking, but must run in LWP context
+#define PostOnFail (1 << 3)
+
+// For each generic ("gen") wrapper, we declare the pre-wrapper, the
+// post-wrapper (which is actually not always needed), and the associated
+// flags.
+#define GEN_SYSCALL_WRAPPER(x) \
+ extern UInt VGA_(gen_##x##_flags); \
+ extern void VGA_(gen_##x##_before)(ThreadId tid, ThreadState *tst); \
+ extern void VGA_(gen_##x##_after) (ThreadId tid, ThreadState *tst)
+
+// Generic (platform-independent) syscall wrappers. These are generally
+// POSIX or something like that; those that are not POSIX are annotated
+// with what standards they are part of, as stated in the Linux man pages.
+// Unless otherwise indicated, all those here are generic across all
+// architectures at least for Linux.
+//
+// Nb: This list may change over time... ones thought at first to be generic
+// may turn out not to be, and so be moved into OS-specific or
+// platform-specific files. If there's any doubt, I'm leaving them in here.
+//
+// Nb 2: if porting to a new OS, you should really check all these generic
+// wrappers to make sure they match your OS, painful as it might be.
+
+GEN_SYSCALL_WRAPPER(sys_ni_syscall); // * P -- unimplemented
+GEN_SYSCALL_WRAPPER(sys_exit);
+GEN_SYSCALL_WRAPPER(sys_fork);
+GEN_SYSCALL_WRAPPER(sys_read);
+GEN_SYSCALL_WRAPPER(sys_write);
+GEN_SYSCALL_WRAPPER(sys_open);
+GEN_SYSCALL_WRAPPER(sys_close);
+GEN_SYSCALL_WRAPPER(sys_waitpid);
+GEN_SYSCALL_WRAPPER(sys_creat);
+GEN_SYSCALL_WRAPPER(sys_link);
+GEN_SYSCALL_WRAPPER(sys_unlink);
+GEN_SYSCALL_WRAPPER(sys_execve); // 11 (*??) P
+GEN_SYSCALL_WRAPPER(sys_chdir);
+GEN_SYSCALL_WRAPPER(sys_time);
+GEN_SYSCALL_WRAPPER(sys_mknod);
+GEN_SYSCALL_WRAPPER(sys_chmod);
+GEN_SYSCALL_WRAPPER(sys_lseek);
+GEN_SYSCALL_WRAPPER(sys_getpid);
+GEN_SYSCALL_WRAPPER(sys_alarm);
+GEN_SYSCALL_WRAPPER(sys_pause);
+GEN_SYSCALL_WRAPPER(sys_utime);
+GEN_SYSCALL_WRAPPER(sys_access);
+GEN_SYSCALL_WRAPPER(sys_kill);
+GEN_SYSCALL_WRAPPER(sys_rename);
+GEN_SYSCALL_WRAPPER(sys_mkdir);
+GEN_SYSCALL_WRAPPER(sys_rmdir);
+GEN_SYSCALL_WRAPPER(sys_dup);
+GEN_SYSCALL_WRAPPER(sys_times);
+GEN_SYSCALL_WRAPPER(sys_fcntl); // POSIX (but complicated)
+GEN_SYSCALL_WRAPPER(sys_setpgid);
+GEN_SYSCALL_WRAPPER(sys_umask);
+GEN_SYSCALL_WRAPPER(sys_dup2);
+GEN_SYSCALL_WRAPPER(sys_getppid);
+GEN_SYSCALL_WRAPPER(sys_getpgrp);
+GEN_SYSCALL_WRAPPER(sys_setsid);
+GEN_SYSCALL_WRAPPER(sys_munmap);
+GEN_SYSCALL_WRAPPER(sys_truncate);
+GEN_SYSCALL_WRAPPER(sys_ftruncate);
+GEN_SYSCALL_WRAPPER(sys_fchmod);
+GEN_SYSCALL_WRAPPER(sys_msync);
+GEN_SYSCALL_WRAPPER(sys_readv);
+GEN_SYSCALL_WRAPPER(sys_writev);
+GEN_SYSCALL_WRAPPER(sys_getsid);
+GEN_SYSCALL_WRAPPER(sys_fdatasync);
+GEN_SYSCALL_WRAPPER(sys_mlock);
+GEN_SYSCALL_WRAPPER(sys_munlock);
+GEN_SYSCALL_WRAPPER(sys_mlockall);
+GEN_SYSCALL_WRAPPER(sys_munlockall);
+GEN_SYSCALL_WRAPPER(sys_sched_setparam);
+GEN_SYSCALL_WRAPPER(sys_sched_getparam);
+GEN_SYSCALL_WRAPPER(sys_sched_setscheduler);
+GEN_SYSCALL_WRAPPER(sys_sched_getscheduler);
+GEN_SYSCALL_WRAPPER(sys_sched_yield);
+GEN_SYSCALL_WRAPPER(sys_sched_get_priority_max);
+GEN_SYSCALL_WRAPPER(sys_sched_get_priority_min);
+GEN_SYSCALL_WRAPPER(sys_nanosleep);
+GEN_SYSCALL_WRAPPER(sys_mremap); // POSIX, but Linux arg order may be odd
+GEN_SYSCALL_WRAPPER(sys_getuid);
+GEN_SYSCALL_WRAPPER(sys_getgid);
+GEN_SYSCALL_WRAPPER(sys_geteuid);
+GEN_SYSCALL_WRAPPER(sys_getegid);
+GEN_SYSCALL_WRAPPER(sys_fsync);
+GEN_SYSCALL_WRAPPER(sys_wait4);
+GEN_SYSCALL_WRAPPER(sys_mprotect);
+GEN_SYSCALL_WRAPPER(sys_sigprocmask);
+GEN_SYSCALL_WRAPPER(sys_timer_create); // Linux: varies across archs?
+GEN_SYSCALL_WRAPPER(sys_timer_settime);
+GEN_SYSCALL_WRAPPER(sys_timer_gettime);
+GEN_SYSCALL_WRAPPER(sys_timer_getoverrun);
+GEN_SYSCALL_WRAPPER(sys_timer_delete);
+GEN_SYSCALL_WRAPPER(sys_clock_settime);
+GEN_SYSCALL_WRAPPER(sys_clock_gettime);
+GEN_SYSCALL_WRAPPER(sys_clock_getres);
+GEN_SYSCALL_WRAPPER(sys_getcwd);
+
+// These ones aren't POSIX, but are in some standard and look reasonably
+// generic, and are the same for all architectures under Linux.
+GEN_SYSCALL_WRAPPER(sys_nice); // SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3
+GEN_SYSCALL_WRAPPER(sys_sync); // SVr4, SVID, X/OPEN, BSD 4.3
+GEN_SYSCALL_WRAPPER(sys_brk); // 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_acct); // SVR4, non-POSIX
+GEN_SYSCALL_WRAPPER(sys_chroot); // SVr4, SVID, 4.4BSD, X/OPEN
+
+
+// These ones may be Linux specific... not sure. They use 16-bit gid_t and
+// uid_t types. The similarly named (minus the "16" suffix) ones below use
+// 32-bit versions of these types.
+GEN_SYSCALL_WRAPPER(sys_setuid16); // ## P
+GEN_SYSCALL_WRAPPER(sys_getuid16); // ## P
+GEN_SYSCALL_WRAPPER(sys_setgid16); // ## SVr4,SVID
+GEN_SYSCALL_WRAPPER(sys_getgid16); // ## P
+GEN_SYSCALL_WRAPPER(sys_geteuid16); // ## P
+GEN_SYSCALL_WRAPPER(sys_getegid16); // ## P
+GEN_SYSCALL_WRAPPER(sys_setreuid16); // ## BSD4.3
+GEN_SYSCALL_WRAPPER(sys_setregid16); // ## BSD4.3
+GEN_SYSCALL_WRAPPER(sys_getgroups16); // ## P
+GEN_SYSCALL_WRAPPER(sys_setgroups16); // ## SVr4, SVID, X/OPEN, 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_fchown16); // ## SVr4,BSD4.3
+GEN_SYSCALL_WRAPPER(sys_chown16); // ## P
+
+GEN_SYSCALL_WRAPPER(sys_setresuid16); // ## (non-standard)
+GEN_SYSCALL_WRAPPER(sys_getresuid16); // ## L
+GEN_SYSCALL_WRAPPER(sys_setresgid16); // ## (non-standard)
+GEN_SYSCALL_WRAPPER(sys_getresgid16); // ## L
+GEN_SYSCALL_WRAPPER(sys_setresuid); // * (non-standard)
+GEN_SYSCALL_WRAPPER(sys_getresuid); // * L
+GEN_SYSCALL_WRAPPER(sys_setresgid); // * (non-standard)
+GEN_SYSCALL_WRAPPER(sys_getresgid); // * L
+
+GEN_SYSCALL_WRAPPER(sys_ptrace); // (x86?) (almost-P)
+
+
+// Some archs on Linux do not match the generic wrapper for sys_pipe().
+GEN_SYSCALL_WRAPPER(sys_pipe);
+
+GEN_SYSCALL_WRAPPER(sys_ioctl); // */x86 (various)
+
+
+// May not be generic for every architecture under Linux.
+GEN_SYSCALL_WRAPPER(sys_sigaction); // (x86) P
+
+GEN_SYSCALL_WRAPPER(sys_sigsuspend); // POSIX, but LLL (proto varies across archs)
+GEN_SYSCALL_WRAPPER(sys_sigpending);
+GEN_SYSCALL_WRAPPER(sys_setrlimit); // SVr4, 4.3BSD
+
+GEN_SYSCALL_WRAPPER(sys_old_getrlimit); // SVr4, 4.3BSD LLL?
+
+GEN_SYSCALL_WRAPPER(sys_getrusage); // SVr4, 4.3BSD
+GEN_SYSCALL_WRAPPER(sys_gettimeofday);
+GEN_SYSCALL_WRAPPER(sys_settimeofday); // SVr4, 4.3BSD (non-POSIX)
+
+GEN_SYSCALL_WRAPPER(old_select); // (x86) (4.4BSD) LLL
+
+GEN_SYSCALL_WRAPPER(sys_symlink);
+GEN_SYSCALL_WRAPPER(sys_readlink); // * (X/OPEN,4.4BSD)
+GEN_SYSCALL_WRAPPER(old_mmap); // (x86) (P but not...)
+GEN_SYSCALL_WRAPPER(sys_getpriority); // SVr4,4.4BSD
+GEN_SYSCALL_WRAPPER(sys_setpriority); // SVr4,4.4BSD
+GEN_SYSCALL_WRAPPER(sys_statfs); // * L?
+GEN_SYSCALL_WRAPPER(sys_fstatfs); // * L?
+
+// Linux's funny many-in-one socketcall is certainly not generic, but I
+// didn't want to move it until necessary because it's big and has a lot of
+// associated junk.
+GEN_SYSCALL_WRAPPER(sys_socketcall);
+
+GEN_SYSCALL_WRAPPER(sys_setitimer); // * (SVr4,4.4BSD)
+GEN_SYSCALL_WRAPPER(sys_getitimer); // * (SVr4,4.4BSD)
+
+// XXX: funny names...
+GEN_SYSCALL_WRAPPER(sys_newstat); // * P
+GEN_SYSCALL_WRAPPER(sys_newlstat); // *
+GEN_SYSCALL_WRAPPER(sys_newfstat); // * P (SVr4,BSD4.3)
+
+GEN_SYSCALL_WRAPPER(sys_iopl); // (x86/amd64) L
+GEN_SYSCALL_WRAPPER(sys_ipc); // (x86) L
+GEN_SYSCALL_WRAPPER(sys_clone); // (x86/Linux) TTT
+GEN_SYSCALL_WRAPPER(sys_newuname); // * P
+GEN_SYSCALL_WRAPPER(sys_init_module); // * L?
+GEN_SYSCALL_WRAPPER(sys_quotactl); // * (?)
+GEN_SYSCALL_WRAPPER(sys_getpgid);
+GEN_SYSCALL_WRAPPER(sys_fchdir); // * (almost-P)
+GEN_SYSCALL_WRAPPER(sys_getdents); // * (SVr4,SVID)
+GEN_SYSCALL_WRAPPER(sys_select); // * (4.4BSD...)
+GEN_SYSCALL_WRAPPER(sys_flock); // * (4.4BSD...)
+GEN_SYSCALL_WRAPPER(sys_poll); // * (XPG4-UNIX)
+GEN_SYSCALL_WRAPPER(sys_rt_sigaction); // (x86) ()
+GEN_SYSCALL_WRAPPER(sys_rt_sigprocmask); // * ?
+GEN_SYSCALL_WRAPPER(sys_rt_sigpending); // * ?
+GEN_SYSCALL_WRAPPER(sys_rt_sigtimedwait); // * ?
+GEN_SYSCALL_WRAPPER(sys_rt_sigqueueinfo); // * ?
+GEN_SYSCALL_WRAPPER(sys_rt_sigsuspend); // () ()
+GEN_SYSCALL_WRAPPER(sys_pread64); // * (Unix98?)
+GEN_SYSCALL_WRAPPER(sys_pwrite64); // * (Unix98?)
+GEN_SYSCALL_WRAPPER(sys_capget); // * L?
+GEN_SYSCALL_WRAPPER(sys_capset); // * L?
+GEN_SYSCALL_WRAPPER(sys_sigaltstack); // (x86) (XPG4-UNIX)
+GEN_SYSCALL_WRAPPER(sys_sendfile); // * L
+GEN_SYSCALL_WRAPPER(sys_getpmsg); // (?) (?)
+GEN_SYSCALL_WRAPPER(sys_putpmsg); // (?) (?)
+GEN_SYSCALL_WRAPPER(sys_getrlimit); // * (?)
+GEN_SYSCALL_WRAPPER(sys_mmap2); // (x86?) P?
+GEN_SYSCALL_WRAPPER(sys_truncate64); // %% (P?)
+GEN_SYSCALL_WRAPPER(sys_ftruncate64); // %% (P?)
+GEN_SYSCALL_WRAPPER(sys_stat64); // %% (?)
+GEN_SYSCALL_WRAPPER(sys_lstat64); // %% (?)
+GEN_SYSCALL_WRAPPER(sys_fstat64); // %% (?)
+GEN_SYSCALL_WRAPPER(sys_lchown); // * (L?)
+GEN_SYSCALL_WRAPPER(sys_setreuid); // * (BSD4.3)
+GEN_SYSCALL_WRAPPER(sys_setregid); // * (BSD4.3)
+GEN_SYSCALL_WRAPPER(sys_getgroups); // * P
+GEN_SYSCALL_WRAPPER(sys_setgroups); // * almost-P
+GEN_SYSCALL_WRAPPER(sys_fchown); // * (SVr4,BSD4.3)
+GEN_SYSCALL_WRAPPER(sys_chown); // * P
+GEN_SYSCALL_WRAPPER(sys_setuid); // *
+GEN_SYSCALL_WRAPPER(sys_setgid); // * (SVr4,SVID)
+GEN_SYSCALL_WRAPPER(sys_mincore); // * non-P?
+GEN_SYSCALL_WRAPPER(sys_madvise); // * P
+GEN_SYSCALL_WRAPPER(sys_getdents64); // * (SVr4,SVID?)
+GEN_SYSCALL_WRAPPER(sys_fcntl64); // * P?
+GEN_SYSCALL_WRAPPER(sys_setxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_lsetxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_fsetxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_getxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_lgetxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_fgetxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_listxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_llistxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_flistxattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_removexattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_lremovexattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_fremovexattr); // * L?
+GEN_SYSCALL_WRAPPER(sys_sendfile64); // * L
+GEN_SYSCALL_WRAPPER(sys_futex); // * L
+GEN_SYSCALL_WRAPPER(sys_sched_setaffinity); // * L?
+GEN_SYSCALL_WRAPPER(sys_sched_getaffinity); // * L?
+GEN_SYSCALL_WRAPPER(sys_exit_group); // *
+GEN_SYSCALL_WRAPPER(sys_lookup_dcookie); // (*/32/64) L
+GEN_SYSCALL_WRAPPER(sys_epoll_create); // * L
+GEN_SYSCALL_WRAPPER(sys_epoll_ctl); // * L
+GEN_SYSCALL_WRAPPER(sys_epoll_wait); // * L
+GEN_SYSCALL_WRAPPER(sys_set_tid_address); // * ?
+GEN_SYSCALL_WRAPPER(sys_statfs64); // * (?)
+GEN_SYSCALL_WRAPPER(sys_fstatfs64); // * (?)
+GEN_SYSCALL_WRAPPER(sys_utimes); // * (4.3BSD)
+GEN_SYSCALL_WRAPPER(sys_mq_open); // * P?
+GEN_SYSCALL_WRAPPER(sys_mq_unlink); // * P?
+GEN_SYSCALL_WRAPPER(sys_mq_timedsend); // * P?
+GEN_SYSCALL_WRAPPER(sys_mq_timedreceive); // * P?
+GEN_SYSCALL_WRAPPER(sys_mq_notify); // * P?
+GEN_SYSCALL_WRAPPER(sys_mq_getsetattr); // * P?
+
+#undef GEN_SYSCALL_WRAPPER
+
+// Macros used in syscall wrappers
+
+#define PRRSN \
+ SK_(pre_reg_read)(Vg_CoreSysCall, tid, "(syscallno)", \
+ R_SYSCALL_NUM, sizeof(UWord));
+#define PRRAn(n,s,t,a) \
+ SK_(pre_reg_read)(Vg_CoreSysCall, tid, s"("#a")", \
+ R_SYSCALL_ARG##n, sizeof(t));
+#define PRE_REG_READ0(tr, s) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ }
+#define PRE_REG_READ1(tr, s, t1, a1) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); \
+ }
+#define PRE_REG_READ2(tr, s, t1, a1, t2, a2) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); \
+ }
+#define PRE_REG_READ3(tr, s, t1, a1, t2, a2, t3, a3) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
+ }
+#define PRE_REG_READ4(tr, s, t1, a1, t2, a2, t3, a3, t4, a4) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
+ PRRAn(4,s,t4,a4); \
+ }
+#define PRE_REG_READ5(tr, s, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
+ PRRAn(4,s,t4,a4); PRRAn(5,s,t5,a5); \
+ }
+#define PRE_REG_READ6(tr, s, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6) \
+ if (VG_(defined_pre_reg_read)()) { \
+ PRRSN; \
+ PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
+ PRRAn(4,s,t4,a4); PRRAn(5,s,t5,a5); PRRAn(6,s,t6,a6); \
+ }
+
+#define PRE_MEM_READ(zzname, zzaddr, zzlen) \
+ VG_TRACK( pre_mem_read, Vg_CoreSysCall, tid, zzname, zzaddr, zzlen)
+
+#define PRE_MEM_RASCIIZ(zzname, zzaddr) \
+ VG_TRACK( pre_mem_read_asciiz, Vg_CoreSysCall, tid, zzname, zzaddr)
+
+#define PRE_MEM_WRITE(zzname, zzaddr, zzlen) \
+ VG_TRACK( pre_mem_write, Vg_CoreSysCall, tid, zzname, zzaddr, zzlen)
+
+#define POST_MEM_WRITE(zzaddr, zzlen) \
+ VG_TRACK( post_mem_write, zzaddr, zzlen)
+
+
+
+/*--------------------------------------------------------------------*/
+/*--- end vg_syscalls.c ---*/
+/*--------------------------------------------------------------------*/
+
/* ---------------------------------------------------------------------
Exports of vg_transtab.c
@@ -1559,4 +1894,25 @@ extern void VG_(user_assert_fail) ( cons
// ---------------------------------------------------------------------
+struct SyscallTableEntry {
+ UInt *flags_ptr;
+ void (*before)(ThreadId tid, ThreadState *tst);
+ void (*after) (ThreadId tid, ThreadState *tst);
+};
+
+/* This table is the mapping from __NR_xxx syscall numbers to the PRE/POST
+ wrappers for the relevant syscalls used in the OS kernel for that number.
+ Note that the constant names don't always match the wrapper names in a
+ straightforward way. For example, on x86/Linux:
+
+ __NR_lchown --> sys_lchown16()
+ __NR_lchown32 --> sys_lchown()
+ __NR_select --> old_select()
+ __NR__newselect --> sys_select()
+*/
+extern const struct SyscallTableEntry VGA_(syscall_table)[];
+
+extern const UInt VGA_(syscall_table_size);
+
+
extern const Addr vga_sys_before, vga_sys_restarted,
vga_sys_after, vga_sys_done;
--- valgrind/coregrind/vg_syscalls.c #1.218:1.219
@@ -43,70 +43,5 @@
*/
-#define X(syscallname, argname) syscallname"("#argname")"
-
-#define PRRSN \
- SK_(pre_reg_read)(Vg_CoreSysCall, tid, "(syscallno)", \
- R_SYSCALL_NUM, sizeof(UWord));
-
-#define PRRAn(n,s,t,a) \
- SK_(pre_reg_read)(Vg_CoreSysCall, tid, X(s,a), \
- R_SYSCALL_ARG##n, sizeof(t));
-
-#define PRE_REG_READ0(tr, s) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- }
-
-#define PRE_REG_READ1(tr, s, t1, a1) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); \
- }
-
-#define PRE_REG_READ2(tr, s, t1, a1, t2, a2) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); \
- }
-
-#define PRE_REG_READ3(tr, s, t1, a1, t2, a2, t3, a3) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
- }
-
-#define PRE_REG_READ4(tr, s, t1, a1, t2, a2, t3, a3, t4, a4) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
- PRRAn(4,s,t4,a4); \
- }
-
-#define PRE_REG_READ5(tr, s, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
- PRRAn(4,s,t4,a4); PRRAn(5,s,t5,a5); \
- }
-
-#define PRE_REG_READ6(tr, s, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6) \
- if (VG_(defined_pre_reg_read)()) { \
- PRRSN; \
- PRRAn(1,s,t1,a1); PRRAn(2,s,t2,a2); PRRAn(3,s,t3,a3); \
- PRRAn(4,s,t4,a4); PRRAn(5,s,t5,a5); PRRAn(6,s,t6,a6); \
- }
-
-
-#define PRE_MEM_READ(zzname, zzaddr, zzlen) \
- VG_TRACK( pre_mem_read, Vg_CoreSysCall, tid, zzname, zzaddr, zzlen)
-
-#define PRE_MEM_RASCIIZ(zzname, zzaddr) \
- VG_TRACK( pre_mem_read_asciiz, Vg_CoreSysCall, tid, zzname, zzaddr)
-
-#define PRE_MEM_WRITE(zzname, zzaddr, zzlen) \
- VG_TRACK( pre_mem_write, Vg_CoreSysCall, tid, zzname, zzaddr, zzlen)
-
-#define POST_MEM_WRITE(zzaddr, zzlen) \
- VG_TRACK( post_mem_write, zzaddr, zzlen)
+#include "syscall_wrappers.h"
/* ---------------------------------------------------------------------
@@ -175,5 +110,6 @@ static void do_atfork_child(ThreadId tid
/* return true if address range entirely contained within client
address space */
-static Bool valid_client_addr(Addr start, SizeT size, ThreadId tid, const Char *syscallname)
+Bool VG_(valid_client_addr)(Addr start, SizeT size, ThreadId tid,
+ const Char *syscallname)
{
Addr end = start+size;
@@ -275,5 +211,5 @@ Addr mremap_segment ( Addr old_addr, Siz
return -VKI_EINVAL;
- if (!valid_client_addr(old_addr, old_size, tid, "mremap(old_addr)"))
+ if (!VG_(valid_client_addr)(old_addr, old_size, tid, "mremap(old_addr)"))
return -VKI_EFAULT;
@@ -286,5 +222,5 @@ Addr mremap_segment ( Addr old_addr, Siz
return -VKI_EINVAL;
- if (!valid_client_addr(new_addr, new_size, tid, "mremap(new_addr)"))
+ if (!VG_(valid_client_addr)(new_addr, new_size, tid, "mremap(new_addr)"))
return -VKI_ENOMEM;
@@ -1051,8 +987,8 @@ static Bool fd_allowed(Int fd, const Cha
/* Note: the PRE() and POST() wrappers are for the actual functions
- implementing the system calls in the Linux kernel. These mostly have
+ implementing the system calls in the OS kernel. These mostly have
names like sys_write(); a few have names like old_mmap(). See the
- comment for sys_info[] and related arrays for important info about the
- __NR_foo constants and their relationship to the sys_foo() functions.
+ comment for VGA_(syscall_table)[] for important info about the __NR_foo
+ constants and their relationship to the sys_foo() functions.
Some notes about names used for syscalls and args:
@@ -1067,5 +1003,5 @@ static Bool fd_allowed(Int fd, const Cha
- Also, for error messages the arg names are mostly taken from the man
pages (even though many of those man pages are really for glibc
- functions of the same name), rather than from the Linux kernel source,
+ functions of the same name), rather than from the OS kernel source,
for the same reason -- a user presented with a "bogus foo(bar)" arg
will most likely look at the "foo" man page to see which is the "bar"
@@ -1086,8 +1022,8 @@ static Bool fd_allowed(Int fd, const Cha
#define PRE(x,f) \
- static UInt flags_##x = f; \
- static void before_##x(ThreadId tid, ThreadState *tst)
+ UInt VGA_(gen_##x##_flags) = f; \
+ void VGA_(gen_##x##_before)(ThreadId tid, ThreadState *tst)
#define POST(x) \
- static void after_##x(ThreadId tid, ThreadState *tst)
+ void VGA_(gen_##x##_after) (ThreadId tid, ThreadState *tst)
#define SYSNO PLATFORM_SYSCALL_NUM(tst->arch) // in PRE(x)
@@ -1131,5 +1067,6 @@ PRE(sys_ni_syscall, Special)
}
-// XXX: I think this is x86/linux-specific
+// XXX: I think this is x86/linux-specific... at least some of the entries
+// are non-generic
// XXX: Why is the memory pointed to by arg3 never checked?
PRE(sys_ptrace, 0)
@@ -1193,78 +1130,4 @@ POST(sys_ptrace)
}
-PRE(sys_mount, MayBlock)
-{
- // Nb: depending on 'flags', the 'type' and 'data' args may be ignored.
- // We are conservative and check everything, except the memory pointed to
- // by 'data'.
- PRINT( "sys_mount( %p, %p, %p, %p, %p )" ,arg1,arg2,arg3);
- PRE_REG_READ5(long, "mount",
- char *, source, char *, target, char *, type,
- unsigned long, flags, void *, data);
- PRE_MEM_RASCIIZ( "mount(source)", arg1);
- PRE_MEM_RASCIIZ( "mount(target)", arg2);
- PRE_MEM_RASCIIZ( "mount(type)", arg3);
-}
-
-PRE(sys_oldumount, 0)
-{
- PRINT("sys_oldumount( %p )", arg1);
- PRE_REG_READ1(long, "umount", char *, path);
- PRE_MEM_RASCIIZ( "umount(path)", arg1);
-}
-
-PRE(sys_umount, 0)
-{
- PRINT("sys_umount( %p )", arg1);
- PRE_REG_READ2(long, "umount2", char *, path, int, flags);
- PRE_MEM_RASCIIZ( "umount2(path)", arg1);
-}
-
-PRE(sys_modify_ldt, Special)
-{
- PRINT("sys_modify_ldt ( %d, %p, %d )", arg1,arg2,arg3);
- PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
- unsigned long, bytecount);
-
- if (arg1 == 0) {
- /* read the LDT into ptr */
- PRE_MEM_WRITE( "modify_ldt(ptr)", arg2, arg3 );
- }
- if (arg1 == 1 || arg1 == 0x11) {
- /* write the LDT with the entry pointed at by ptr */
- PRE_MEM_READ( "modify_ldt(ptr)", arg2, sizeof(vki_modify_ldt_t) );
- }
- /* "do" the syscall ourselves; the kernel never sees it */
- res = VG_(sys_modify_ldt)( tid, arg1, (void*)arg2, arg3 );
-
- if (arg1 == 0 && !VG_(is_kerror)(res) && res > 0) {
- POST_MEM_WRITE( arg2, res );
- }
-}
-
-PRE(sys_set_thread_area, Special)
-{
- PRINT("sys_set_thread_area ( %p )", arg1);
- PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
- PRE_MEM_READ( "set_thread_area(u_info)", arg1, sizeof(vki_modify_ldt_t) );
-
- /* "do" the syscall ourselves; the kernel never sees it */
- set_result( VG_(sys_set_thread_area)( tid, (void *)arg1 ) );
-}
-
-PRE(sys_get_thread_area, Special)
-{
- PRINT("sys_get_thread_area ( %p )", arg1);
- PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
- PRE_MEM_WRITE( "get_thread_area(u_info)", arg1, sizeof(vki_modify_ldt_t) );
-
- /* "do" the syscall ourselves; the kernel never sees it */
- set_result( VG_(sys_get_thread_area)( tid, (void *)arg1 ) );
-
- if (!VG_(is_kerror)(res)) {
- POST_MEM_WRITE( arg1, sizeof(vki_modify_ldt_t) );
- }
-}
-
PRE(sys_set_tid_address, Special)
{
@@ -1287,10 +1150,4 @@ PRE(sys_setresgid, 0)
}
-PRE(sys_vhangup, 0)
-{
- PRINT("sys_vhangup ( )");
- PRE_REG_READ0(long, "vhangup");
-}
-
PRE(sys_iopl, 0)
{
@@ -1591,34 +1448,4 @@ POST(sys_setitimer)
}
-PRE(sys_syslog, MayBlock)
-{
- PRINT("sys_syslog (%d, %p, %d)", arg1,arg2,arg3);
- PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len);
- switch (arg1) {
- case 2: case 3: case 4:
- PRE_MEM_WRITE( "syslog(bufp)", arg2, arg3);
- break;
- default:
- break;
- }
-}
-
-POST(sys_syslog)
-{
- switch (arg1) {
- case 2: case 3: case 4:
- POST_MEM_WRITE( arg2, arg3 );
- break;
- default:
- break;
- }
-}
-
-PRE(sys_personality, 0)
-{
- PRINT("sys_personality ( %llu )", (ULong)arg1);
- PRE_REG_READ1(long, "personality", vki_u_long, persona);
-}
-
PRE(sys_chroot, 0)
{
@@ -1654,22 +1481,4 @@ PRE(sys_nice, 0)
}
-PRE(sys_setfsuid, 0)
-{
- PRINT("sys_setfsuid ( %d )", arg1);
- PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid);
-}
-
-PRE(sys_sysctl, 0)
-{
- PRINT("sys_sysctl ( %p )", arg1 );
- PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args);
- PRE_MEM_WRITE( "sysctl(args)", arg1, sizeof(struct __vki_sysctl_args) );
-}
-
-POST(sys_sysctl)
-{
- POST_MEM_WRITE( arg1, sizeof(struct __vki_sysctl_args) );
-}
-
PRE(sys_sched_getscheduler, 0)
{
@@ -1736,10 +1545,4 @@ PRE(sys_getpriority, 0)
}
-PRE(sys_setfsgid16, 0)
-{
- PRINT("sys_setfsgid16 ( %d )", arg1);
- PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid);
-}
-
PRE(sys_setregid16, 0)
{
@@ -1762,10 +1565,4 @@ PRE(sys_setresuid, 0)
}
-PRE(sys_setfsuid16, 0)
-{
- PRINT("sys_setfsuid16 ( %d )", arg1);
- PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid);
-}
-
PRE(sys_sendfile, MayBlock)
{
@@ -1890,11 +1687,4 @@ PRE(sys_init_module, MayBlock)
}
-PRE(sys_ioperm, 0)
-{
- PRINT("sys_ioperm ( %d, %d, %d )", arg1, arg2, arg3 );
- PRE_REG_READ3(long, "ioperm",
- unsigned long, from, unsigned long, num, int, turn_on);
-}
-
PRE(sys_capget, 0)
{
@@ -2331,7 +2121,7 @@ PRE(sys_clone, Special)
|| arg1 == (VKI_CLONE_PARENT_SETTID|VKI_SIGCHLD)))
{
- before_sys_fork(tid, tst);
+ VGA_(gen_sys_fork_before)(tid, tst);
set_result( VG_(do_syscall)(SYSNO, arg1, arg2, arg3, arg4, arg5) );
- after_sys_fork(tid, tst);
+ VGA_(gen_sys_fork_after) (tid, tst);
} else {
VG_(unimplemented)
@@ -2894,10 +2684,10 @@ PRE(sys_ipc, 0)
if (arg5 == 0)
arg5 = VG_(find_map_space)(0, segmentSize, True);
- else if (!valid_client_addr(arg5, segmentSize, tid, "shmat"))
+ else if (!VG_(valid_client_addr)(arg5, segmentSize, tid, "shmat"))
set_result( -VKI_EINVAL );
break;
}
case 22: /* IPCOP_shmdt */
- if (!valid_client_addr(arg5, 1, tid, "shmdt"))
+ if (!VG_(valid_client_addr)(arg5, 1, tid, "shmdt"))
set_result( -VKI_EINVAL );
break;
@@ -4451,20 +4241,4 @@ PRE(sys_lseek, 0)
}
-PRE(sys_llseek, 0)
-{
- PRINT("sys_llseek ( %d, 0x%x, 0x%x, %p, %d )", arg1,arg2,arg3,arg4,arg5);
- PRE_REG_READ5(long, "llseek",
- unsigned int, fd, unsigned long, offset_high,
- unsigned long, offset_low, vki_loff_t *, result,
- unsigned int, whence);
- PRE_MEM_WRITE( "llseek(result)", arg4, sizeof(vki_loff_t));
-}
-
-POST(sys_llseek)
-{
- if (res == 0)
- POST_MEM_WRITE( arg4, sizeof(vki_loff_t) );
-}
-
PRE(sys_newlstat, 0)
{
@@ -4518,5 +4292,5 @@ PRE(sys_mmap2, 0)
if (arg4 & VKI_MAP_FIXED) {
- if (!valid_client_addr(arg1, arg2, tid, "mmap2"))
+ if (!VG_(valid_client_addr)(arg1, arg2, tid, "mmap2"))
set_result( -VKI_ENOMEM );
} else {
@@ -4531,5 +4305,5 @@ PRE(sys_mmap2, 0)
POST(sys_mmap2)
{
- vg_assert(valid_client_addr(res, arg2, tid, "mmap2"));
+ vg_assert(VG_(valid_client_addr)(res, arg2, tid, "mmap2"));
mmap_segment( (Addr)res, arg2, arg3, arg4, arg5,
arg6 * (ULong)VKI_PAGE_SIZE );
@@ -4555,5 +4329,5 @@ PRE(old_mmap, Special)
if (a4 & VKI_MAP_FIXED) {
- if (!valid_client_addr(a1, a2, tid, "old_mmap")) {
+ if (!VG_(valid_client_addr)(a1, a2, tid, "old_mmap")) {
PRINT("old_mmap failing: %p-%p\n", a1, a1+a2);
set_result( -VKI_ENOMEM );
@@ -4571,5 +4345,5 @@ PRE(old_mmap, Special)
if (!VG_(is_kerror)(res)) {
- vg_assert(valid_client_addr(res, a2, tid, "old_mmap"));
+ vg_assert(VG_(valid_client_addr)(res, a2, tid, "old_mmap"));
mmap_segment( (Addr)res, a2, a3, a4, a5, a6 );
}
@@ -4583,5 +4357,5 @@ PRE(sys_mprotect, 0)
unsigned long, addr, vki_size_t, len, unsigned long, prot);
- if (!valid_client_addr(arg1, arg2, tid, "mprotect"))
+ if (!VG_(valid_client_addr)(arg1, arg2, tid, "mprotect"))
set_result( -VKI_ENOMEM );
}
@@ -4606,5 +4380,5 @@ PRE(sys_munmap, 0)
PRE_REG_READ2(long, "munmap", unsigned long, start, vki_size_t, length);
- if (!valid_client_addr(arg1, arg2, tid, "munmap"))
+ if (!VG_(valid_client_addr)(arg1, arg2, tid, "munmap"))
set_result( -VKI_EINVAL );
}
@@ -4982,10 +4756,4 @@ PRE(sys_select, MayBlock)
}
-PRE(sys_setfsgid, 0)
-{
- PRINT("sys_setfsgid ( %d )", arg1);
- PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid);
-}
-
PRE(sys_setgid16, 0)
{
@@ -5525,16 +5293,4 @@ POST(sys_fstat64)
}
-PRE(sys_sysinfo, 0)
-{
- PRINT("sys_sysinfo ( %p )",arg1);
- PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info);
- PRE_MEM_WRITE( "sysinfo(info)", arg1, sizeof(struct vki_sysinfo) );
-}
-
-POST(sys_sysinfo)
-{
- POST_MEM_WRITE( arg1, sizeof(struct vki_sysinfo) );
-}
-
PRE(sys_time, 0)
{
@@ -5665,43 +5421,4 @@ PRE(sys_writev, MayBlock)
}
-PRE(sys_prctl, MayBlock)
-{
- 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, parg2, unsigned long, parg3,
- unsigned long, parg4, unsigned long, parg5);
- // XXX: totally wrong... we need to look at the 'option' arg, and do
- // PRE_MEM_READs/PRE_MEM_WRITEs as necessary...
-}
-
-PRE(sys_adjtimex, 0)
-{
- struct vki_timex *tx = (struct vki_timex *)arg1;
- PRINT("sys_adjtimex ( %p )", arg1);
- PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
- PRE_MEM_READ( "adjtimex(timex->modes)", arg1, sizeof(tx->modes));
-
-#define ADJX(bit,field) \
- if (tx->modes & bit) \
- PRE_MEM_READ( "adjtimex(timex->"#field")", \
- (Addr)&tx->field, sizeof(tx->field))
- ADJX(ADJ_FREQUENCY, freq);
- ADJX(ADJ_MAXERROR, maxerror);
- ADJX(ADJ_ESTERROR, esterror);
- ADJX(ADJ_STATUS, status);
- ADJX(ADJ_TIMECONST, constant);
- ADJX(ADJ_TICK, tick);
-#undef ADJX
-
- PRE_MEM_WRITE( "adjtimex(timex)", arg1, sizeof(struct vki_timex));
-}
-
-POST(sys_adjtimex)
-{
- VG_TRACK(post_mem_write, arg1, sizeof(struct vki_timex));
-}
-
PRE(sys_utimes, 0)
{
@@ -6016,157 +5733,4 @@ POST(sys_rt_sigpending)
}
-// Nb: this wrapper is "Special" because we have to pad/unpad memory around
-// the syscall itself, and this allows us to control exactly the code that
-// gets run while the padding is in place.
-PRE(sys_io_setup, Special)
-{
- SizeT size;
- Addr addr;
-
- PRINT("sys_io_setup ( %u, %p )", arg1,arg2);
- PRE_REG_READ2(long, "io_setup",
- unsigned, nr_events, vki_aio_context_t *, ctxp);
- PRE_MEM_WRITE( "io_setup(ctxp)", arg2, sizeof(vki_aio_context_t) );
-
- size = PGROUNDUP(sizeof(struct vki_aio_ring) +
- arg1*sizeof(struct vki_io_event));
- addr = VG_(find_map_space)(0, size, True);
- VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_EXEC, SF_FIXED);
-
- VG_(pad_address_space)();
- set_result( VG_(do_syscall)(SYSNO, arg1, arg2) );
- VG_(unpad_address_space)();
-
- if (res == 0) {
- struct vki_aio_ring *r = *(struct vki_aio_ring **)arg2;
-
- vg_assert(addr == (Addr)r);
- vg_assert(valid_client_addr(addr, size, tid, "io_setup"));
-
- VG_TRACK( new_mem_mmap, addr, size, True, True, False );
- POST_MEM_WRITE( arg2, sizeof(vki_aio_context_t) );
- }
- else {
- VG_(unmap_range)(addr, size);
- }
-}
-
-// Nb: This wrapper is "Special" because we need 'size' to do the unmap
-// after the syscall. We must get 'size' from the aio_ring structure,
-// before the syscall, while the aio_ring structure still exists. (And we
-// know that we must look at the aio_ring structure because Tom inspected the
-// kernel and glibc sources to see what they do, yuk.)
-PRE(sys_io_destroy, Special)
-{
- Segment *s = VG_(find_segment)(arg1);
- struct vki_aio_ring *r;
- SizeT size;
-
- PRINT("sys_io_destroy ( %llu )", (ULong)arg1);
- PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx);
-
- // If we are going to seg fault (due to a bogus arg1) do it as late as
- // possible...
- r = *(struct vki_aio_ring **)arg1;
- size = PGROUNDUP(sizeof(struct vki_aio_ring) +
- r->nr*sizeof(struct vki_io_event));
-
- set_result( VG_(do_syscall)(SYSNO, arg1) );
-
- if (res == 0 && s != NULL && VG_(seg_contains)(s, arg1, size)) {
- VG_TRACK( die_mem_munmap, arg1, size );
- VG_(unmap_range)(arg1, size);
- }
-}
-
-PRE(sys_io_getevents, MayBlock)
-{
- PRINT("sys_io_getevents ( %llu, %lld, %lld, %p, %p )",
- (ULong)arg1,(Long)arg2,(Long)arg3,arg4,arg5);
- PRE_REG_READ5(long, "io_getevents",
- vki_aio_context_t, ctx_id, long, min_nr, long, nr,
- struct io_event *, events,
- struct timespec *, timeout);
- if (arg3 > 0)
- PRE_MEM_WRITE( "io_getevents(events)",
- arg4, sizeof(struct vki_io_event)*arg3 );
- if (arg5 != (UWord)NULL)
- PRE_MEM_READ( "io_getevents(timeout)",
- arg5, sizeof(struct vki_timespec));
-}
-
-POST(sys_io_getevents)
-{
- int i;
-
- if (res > 0) {
- POST_MEM_WRITE( arg4, sizeof(struct vki_io_event)*res );
- for (i = 0; i < res; i++) {
- const struct vki_io_event *vev = ((struct vki_io_event *)arg4) + i;
- const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj;
-
- switch (cb->aio_lio_opcode) {
- case VKI_IOCB_CMD_PREAD:
- if (vev->result > 0)
- POST_MEM_WRITE( cb->aio_buf, vev->result );
- break;
-
- case VKI_IOCB_CMD_PWRITE:
- break;
-
- default:
- VG_(message)(Vg_DebugMsg,"Warning: unhandled io_getevents opcode: %u\n",cb->aio_lio_opcode);
- break;
- }
- }
- }
-}
-
-PRE(sys_io_submit, 0)
-{
- int i;
-
- PRINT("sys_io_submit( %llu, %lld, %p )", (ULong)arg1,(Long)arg2,arg3);
- PRE_REG_READ3(long, "io_submit",
- vki_aio_context_t, ctx_id, long, nr,
- struct iocb **, iocbpp);
- PRE_MEM_READ( "io_submit(iocbpp)", arg3, arg2*sizeof(struct vki_iocb *) );
- if (arg3 != (UWord)NULL) {
- for (i = 0; i < arg2; i++) {
- struct vki_iocb *cb = ((struct vki_iocb **)arg3)[i];
- PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
- switch (cb->aio_lio_opcode) {
- case VKI_IOCB_CMD_PREAD:
- PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes );
- break;
-
- case VKI_IOCB_CMD_PWRITE:
- PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
- break;
-
- default:
- VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
- cb->aio_lio_opcode);
- break;
- }
- }
- }
-}
-
-PRE(sys_io_cancel, 0)
-{
- PRINT("sys_io_cancel( %llu, %p, %p )", (ULong)arg1,arg2,arg3);
- PRE_REG_READ3(long, "io_cancel",
- vki_aio_context_t, ctx_id, struct iocb *, iocb,
- struct io_event *, result);
- PRE_MEM_READ( "io_cancel(iocb)", arg2, sizeof(struct vki_iocb) );
- PRE_MEM_WRITE( "io_cancel(result)", arg3, sizeof(struct vki_io_event) );
-}
-
-POST(sys_io_cancel)
-{
- POST_MEM_WRITE( arg3, sizeof(struct vki_io_event) );
-}
-
PRE(sys_mq_open, 0)
{
@@ -6387,32 +5951,7 @@ POST(sys_clock_getres)
/* ---------------------------------------------------------------------
- Summary info about syscalls
+ Executing the syscalls
------------------------------------------------------------------ */
-/* Important point: for each arch/Linux platform, the name of the constant
- for a syscall (eg. __NR_write) usually matches the name of the function
- in the Linux kernel that implements it (eg. sys_write()). However, this
- is not always the case. For example:
-
- __NR_lchown --> sys_lchown16()
- __NR_lchown32 --> sys_lchown()
- __NR_select --> old_select()
- __NR__newselect --> sys_select()
-
- Therefore part of the role of the arrays below is to provide a mapping
- from the __NR_foo constants to the sys_foo() PRE/POST wrappers above.
-
- XXX: some of these are arch-specific, and should be factored out.
-*/
-
-struct sys_info {
- UInt *flags_ptr;
- void (*before)(ThreadId tid, ThreadState *tst);
- void (*after) (ThreadId tid, ThreadState *tst);
-};
-
-#define SYSX_(const, name) [const] = { &flags_##name, before_##name, NULL }
-#define SYSXY(const, name) [const] = { &flags_##name, before_##name, after_##name }
-
static UInt bad_flags = Special;
static void bad_before(ThreadId tid, ThreadState *tst)
@@ -6432,378 +5971,7 @@ static void bad_before(ThreadId tid, Thr
}
-static const struct sys_info bad_sys = { &bad_flags, bad_before, NULL };
-
-// XXX: temporary: I've started labelled each entry with the target of its
-// __NR_foo-->sys_foo() mapping, and the __NR_foo number (for x86), and
-// properties of the sys_foo() function:
-// '*' ones are Linux-generic (ie. present in
-// linux-2.6.8.1/include/linux/syscalls.h); non-generic ones have an
-// indication of which architecture they are specific to.
-// "##" ones are Linux-generic, but within a "#ifdef CONFIG_UID16".
-// "%%" ones are Linux-generic, but within a "#if BITS_PER_LONG == 32"
-// 'P' ones are POSIX-generic, according to man pages.
-// 'L' ones are Linux-specific, according to man pages.
-
-// XXX: this does duplicate the vki_unistd.h file somewhat -- could make
-// this table replace that somehow...
-
-// This table maps from __NR_xxx syscall numbers to the appropriate
-// PRE/POST sys_foo() wrappers on x86.
-static const struct sys_info sys_info[] = {
- // 0 is restart_syscall
- SYSX_(__NR_exit, sys_exit), // 1 * P
- SYSXY(__NR_fork, sys_fork), // 2 (quasi-generic...) P
- SYSXY(__NR_read, sys_read), // 3 * P
- SYSX_(__NR_write, sys_write), // 4 * P
-
- SYSXY(__NR_open, sys_open), // 5 * P
- SYSXY(__NR_close, sys_close), // 6 * P
- SYSXY(__NR_waitpid, sys_waitpid), // 7 * P
- SYSXY(__NR_creat, sys_creat), // 8 * P
- SYSX_(__NR_link, sys_link), // 9 * P
-
- SYSX_(__NR_unlink, sys_unlink), // 10 * P
- SYSX_(__NR_execve, sys_execve), // 11 (*??) P
- SYSX_(__NR_chdir, sys_chdir), // 12 * P
- SYSXY(__NR_time, sys_time), // 13 * P
- SYSX_(__NR_mknod, sys_mknod), // 14 * P
-
- SYSX_(__NR_chmod, sys_chmod), // 15 * P
- // (__NR_lchown, sys_lchown16), // 16 ## P
- SYSX_(__NR_break, sys_ni_syscall), // 17 * P -- unimplemented
- // (__NR_oldstat, sys_stat), // 18 * L -- obsolete
- SYSX_(__NR_lseek, sys_lseek), // 19 * P
-
- SYSX_(__NR_getpid, sys_getpid), // 20 * P
- SYSX_(__NR_mount, sys_mount), // 21 * L
- SYSX_(__NR_umount, sys_oldumount), // 22 * L
- SYSX_(__NR_setuid, sys_setuid16), // 23 ## P
- SYSX_(__NR_getuid, sys_getuid16), // 24 ## P
-
- // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
- SYSXY(__NR_ptrace, sys_ptrace), // 26 (x86?) (L?)
- SYSX_(__NR_alarm, sys_alarm), // 27 * P
- // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
- SYSX_(__NR_pause, sys_pause), // 29 * P
-
- SYSX_(__NR_utime, sys_utime), // 30 * P
- SYSX_(__NR_stty, sys_ni_syscall), // 31 * P -- unimplemented
- SYSX_(__NR_gtty, sys_ni_syscall), // 32 * P -- unimplemented
- SYSX_(__NR_access, sys_access), // 33 * P
- SYSX_(__NR_nice, sys_nice), // 34 * (almost P)
-
- SYSX_(__NR_ftime, sys_ni_syscall), // 35 * P -- unimplemented
- SYSX_(__NR_sync, sys_sync), // 36 * (almost P)
- SYSXY(__NR_kill, sys_kill), // 37 * P
- SYSX_(__NR_rename, sys_rename), // 38 * P
- SYSX_(__NR_mkdir, sys_mkdir), // 39 * P
-
- SYSX_(__NR_rmdir, sys_rmdir), // 40 * P
- SYSXY(__NR_dup, sys_dup), // 41 * P
- SYSXY(__NR_pipe, sys_pipe), // 42 (x86) P
- SYSXY(__NR_times, sys_times), // 43 * P
- SYSX_(__NR_prof, sys_ni_syscall), // 44 * P -- unimplemented
-
- SYSX_(__NR_brk, sys_brk), // 45 * non-P
- SYSX_(__NR_setgid, sys_setgid16), // 46 ## (SVr4,SVID)
- SYSX_(__NR_getgid, sys_getgid16), // 47 ## P
- // (__NR_signal, sys_signal), // 48 * (ANSI C?)
- SYSX_(__NR_geteuid, sys_geteuid16), // 49 ## P
-
- SYSX_(__NR_getegid, sys_getegid16), // 50 ## (P16)
- SYSX_(__NR_acct, sys_acct), // 51 * (SVR4, non-POSIX)
- SYSX_(__NR_umount2, sys_umount), // 52 * L
- SYSX_(__NR_lock, sys_ni_syscall), // 53 * P -- unimplemented
- SYSXY(__NR_ioctl, sys_ioctl), // 54 */x86 (varying)
-
- SYSXY(__NR_fcntl, sys_fcntl), // 55 * (P...complex)
- SYSX_(__NR_mpx, sys_ni_syscall), // 56 * P -- unimplemented
- SYSXY(__NR_setpgid, sys_setpgid), // 57 * P
- SYSX_(__NR_ulimit, sys_ni_syscall), // 58 * P -- unimplemented
- // (__NR_oldolduname, sys_olduname), // 59 (?) L -- obsolete
-
- SYSX_(__NR_umask, sys_umask), // 60 * P
- SYSX_(__NR_chroot, sys_chroot), // 61 * (almost P)
- // (__NR_ustat, sys_ustat) // 62 * (SVr4) -- deprecated
- SYSXY(__NR_dup2, sys_dup2), // 63 * P
- SYSX_(__NR_getppid, sys_getppid), // 64 * P
-
- SYSX_(__NR_getpgrp, sys_getpgrp), // 65 * P
- SYSX_(__NR_setsid, sys_setsid), // 66 * P
- SYSXY(__NR_sigaction, sys_sigaction), // 67 (x86) P
- // (__NR_sgetmask, sys_sgetmask), // 68 * (ANSI C)
- // (__NR_ssetmask, sys_ssetmask), // 69 * (ANSI C)
-
- SYSX_(__NR_setreuid, sys_setreuid16), // 70 ## (BSD4.3)
- SYSX_(__NR_setregid, sys_setregid16), // 71 ## (BSD4.3)
- SYSX_(__NR_sigsuspend, sys_sigsuspend), // 72 () P
- SYSXY(__NR_sigpending, sys_sigpending), // 73 * P
- // (__NR_sethostname, sys_sethostname), // 74 * (almost P)
-
- SYSX_(__NR_setrlimit, sys_setrlimit), // 75 * (SVr4,BSD4.3)
- SYSXY(__NR_getrlimit, sys_old_getrlimit),// 76 * (SVr4,BSD4.3)
- SYSXY(__NR_getrusage, sys_getrusage), // 77 * (SVr4,BSD4.3)
- SYSXY(__NR_gettimeofday, sys_gettimeofday), // 78 * P
- SYSX_(__NR_settimeofday, sys_settimeofday), // 79 * almost-P
-
- SYSXY(__NR_getgroups, sys_getgroups16), // 80 ## P
- SYSX_(__NR_setgroups, sys_setgroups16), // 81 ## almost-P
- SYSX_(__NR_select, old_select), // 82 (x86) (4.4BSD)
- SYSX_(__NR_symlink, sys_symlink), // 83 * P
- // (__NR_oldlstat, sys_lstat), // 84 * L -- obsolete
-
- SYSXY(__NR_readlink, sys_readlink), // 85 * (X/OPEN,4.4BSD)
- // (__NR_uselib, sys_uselib), // 86 * L
- // (__NR_swapon, sys_swapon), // 87 * L
- // (__NR_reboot, sys_reboot), // 88 * L
- // (__NR_readdir, old_readdir), // 89 () L -- superseded
-
- SYSX_(__NR_mmap, old_mmap), // 90 (x86) (P but not...)
- SYSXY(__NR_munmap, sys_munmap), // 91 * P
- SYSX_(__NR_truncate, sys_truncate), // 92 * P
- SYSX_(__NR_ftruncate, sys_ftruncate), // 93 * P
- SYSX_(__NR_fchmod, sys_fchmod), // 94 * P
-
- SYSX_(__NR_fchown, sys_fchown16), // 95 ## (SVr4,BSD4.3)
- SYSX_(__NR_getpriority, sys_getpriority), // 96 * (SVr4,4.4BSD)
- SYSX_(__NR_setpriority, sys_setpriority), // 97 * (SVr4,4.4BSD)
- SYSX_(__NR_profil, sys_ni_syscall), // 98 * P -- unimplemented
- SYSXY(__NR_statfs, sys_statfs), // 99 * (P-ish)
-
- SYSXY(__NR_fstatfs, sys_fstatfs), // 100 * (P-ish)
- SYSX_(__NR_ioperm, sys_ioperm), // 101 * L
- SYSXY(__NR_socketcall, sys_socketcall), // 102 * L
- SYSXY(__NR_syslog, sys_syslog), // 103 * L
- SYSXY(__NR_setitimer, sys_setitimer), // 104 * (SVr4,4.4BSD)
-
- SYSXY(__NR_getitimer, sys_getitimer), // 105 * (SVr4,4.4BSD)
- SYSXY(__NR_stat, sys_newstat), // 106 * P
- SYSXY(__NR_lstat, sys_newlstat), // 107 *
- SYSXY(__NR_fstat, sys_newfstat), // 108 * P (SVr4,BSD4.3)
- // (__NR_olduname, sys_uname), // 109 (?) L -- obsolete
-
- SYSX_(__NR_iopl, sys_iopl), // 110 (x86/amd64) L
- SYSX_(__NR_vhangup, sys_vhangup), // 111 * L
- SYSX_(__NR_idle, sys_ni_syscall), // 112 * P -- unimplemented
- // (__NR_vm86old, sys_vm86old), // 113 (x86) L
- SYSXY(__NR_wait4, sys_wait4), // 114 * P
-
- // (__NR_swapoff, sys_swapoff), // 115 * L
- SYSXY(__NR_sysinfo, sys_sysinfo), // 116 * L
- SYSXY(__NR_ipc, sys_ipc), // 117 (x86) L
- SYSX_(__NR_fsync, sys_fsync), // 118 * L
- // (__NR_sigreturn, sys_sigreturn), // 119 () L
-
- SYSX_(__NR_clone, sys_clone), // 120 (x86) L
- // (__NR_setdomainname, sys_setdomainname),// 121 * (non-P?)
- SYSXY(__NR_uname, sys_newuname), // 122 * P
- SYSX_(__NR_modify_ldt, sys_modify_ldt), // 123 (x86,amd64) L
- SYSXY(__NR_adjtimex, sys_adjtimex), // 124 * L
-
- SYSXY(__NR_mprotect, sys_mprotect), // 125 * P
- SYSXY(__NR_sigprocmask, sys_sigprocmask), // 126 * P
- // Nb: create_module() was removed 2.4-->2.6
- SYSX_(__NR_create_module, sys_ni_syscall), // 127 * P -- unimplemented
- SYSX_(__NR_init_module, sys_init_module), // 128 * L?
- // (__NR_delete_module, sys_delete_module),// 129 () (L?)
-
- // Nb: get_kernel_syms() was removed 2.4-->2.6
- SYSX_(__NR_get_kernel_syms, sys_ni_syscall), // 130 * P -- unimplemented
- SYSX_(__NR_quotactl, sys_quotactl), // 131 * (?)
- SYSX_(__NR_getpgid, sys_getpgid), // 132 * P
- SYSX_(__NR_fchdir, sys_fchdir), // 133 * (almost-P)
- // (__NR_bdflush, sys_bdflush), // 134 * L
-
- // (__NR_sysfs, sys_sysfs), // 135 * (SVr4)
- SYSX_(__NR_personality, sys_personality), // 136 * L
- SYSX_(__NR_afs_syscall, sys_ni_syscall), // 137 * P
- SYSX_(__NR_setfsuid, sys_setfsuid16), // 138 ## L
- SYSX_(__NR_setfsgid, sys_setfsgid16), // 139 ## L
-
- SYSXY(__NR__llseek, sys_llseek), // 140 * L
- SYSXY(__NR_getdents, sys_getdents), // 141 * (SVr4,SVID)
- SYSX_(__NR__newselect, sys_select), // 142 * (4.4BSD...)
- SYSX_(__NR_flock, sys_flock), // 143 * (4.4BSD...)
- SYSX_(__NR_msync, sys_msync), // 144 * P
-
- SYSXY(__NR_readv, sys_readv), // 145 * P
- SYSX_(__NR_writev, sys_writev), // 146 * P
- SYSX_(__NR_getsid, sys_getsid), // 147 * P
- SYSX_(__NR_fdatasync, sys_fdatasync), // 148 * P
- SYSXY(__NR__sysctl, sys_sysctl), // 149 * L
-
- SYSX_(__NR_mlock, sys_mlock), // 150 * P
- SYSX_(__NR_munlock, sys_munlock), // 151 * P
- SYSX_(__NR_mlockall, sys_mlockall), // 152 * P
- SYSX_(__NR_munlockall, sys_munlockall), // 153 * P
- SYSXY(__NR_sched_setparam, sys_sched_setparam), // 154 * P
-
- SYSXY(__NR_sched_getparam, sys_sched_getparam), // 155 * P
- SYSX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 * P
- SYSX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 * P
- SYSX_(__NR_sched_yield, sys_sched_yield), // 158 * P
- SYSX_(__NR_sched_get_priority_max,sys_sched_get_priority_max), // 159 * P
-
- SYSX_(__NR_sched_get_priority_min,sys_sched_get_priority_min), // 160 * P
- // (__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 *
- SYSXY(__NR_nanosleep, sys_nanosleep), // 162 * P
- SYSX_(__NR_mremap, sys_mremap), // 163 * P
- SYSX_(__NR_setresuid, sys_setresuid16), // 164 ## (non-standard)
-
- SYSXY(__NR_getresuid, sys_getresuid16), // 165 ## L
- // (__NR_vm86, sys_vm86), // 166 (x86) L
- SYSX_(__NR_query_module, sys_ni_syscall), // 167 * P -- unimplemented
- SYSXY(__NR_poll, sys_poll), // 168 * (XPG4-UNIX)
- // (__NR_nfsservctl, sys_nfsservctl), // 169 * L
-
- SYSX_(__NR_setresgid, sys_setresgid16), // 170 ## (non-standard)
- SYSXY(__NR_getresgid, sys_getresgid16), // 171 ## L
- SYSX_(__NR_prctl, sys_prctl), // 172 * L
- // (__NR_rt_sigreturn, sys_rt_sigreturn), // 173 (x86) ()
- SYSXY(__NR_rt_sigaction, sys_rt_sigaction), // 174 (x86) ()
-
- SYSXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175 * ?
- SYSXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 * ?
- SYSXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 177 * ?
- SYSXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 178 * ?
- SYSX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 () ()
- SYSXY(__NR_pread64, sys_pread64), // 180 * (Unix98?)
-
- SYSX_(__NR_pwrite64, sys_pwrite64), // 181 * (Unix98?)
- SYSX_(__NR_chown, sys_chown16), // 182 * P
- SYSXY(__NR_getcwd, sys_getcwd), // 183 * P
- SYSXY(__NR_capget, sys_capget), // 184 * L?
-
- SYSX_(__NR_capset, sys_capset), // 185 * L?
- SYSXY(__NR_sigaltstack, sys_sigaltstack), // 186 (x86) (XPG4-UNIX)
- SYSXY(__NR_sendfile, sys_sendfile), // 187 * L
- SYSXY(__NR_getpmsg, sys_getpmsg), // 188 (?) (?)
- SYSX_(__NR_putpmsg, sys_putpmsg), // 189 (?) (?)
-
- // Nb: we convert vfork() to fork() in VG_(pre_syscall)().
- // (__NR_vfork, sys_vfork), // 190 -- Valgrind avoids
- SYSXY(__NR_ugetrlimit, sys_getrlimit), // 191 * (?)
- SYSXY(__NR_mmap2, sys_mmap2), // 192 (x86?) P?
- SYSX_(__NR_truncate64, sys_truncate64), // 193 %% (P?)
- SYSX_(__NR_ftruncate64, sys_ftruncate64), // 194 %% (P?)
-
- SYSXY(__NR_stat64, sys_stat64), // 195 %% (?)
- SYSXY(__NR_lstat64, sys_lstat64), // 196 %% (?)
- SYSXY(__NR_fstat64, sys_fstat64), // 197 %% (?)
- SYSX_(__NR_lchown32, sys_lchown), // 198 * (L?)
- SYSX_(__NR_getuid32, sys_getuid), // 199 *
-
- SYSX_(__NR_getgid32, sys_getgid), // 200 *
- SYSX_(__NR_geteuid32, sys_geteuid), // 201 *
- SYSX_(__NR_getegid32, sys_getegid), // 202 *
- SYSX_(__NR_setreuid32, sys_setreuid), // 203 * (BSD4.3)
- SYSX_(__NR_setregid32, sys_setregid), // 204 * (BSD4.3)
-
- SYSXY(__NR_getgroups32, sys_getgroups), // 205 * P
- SYSX_(__NR_setgroups32, sys_setgroups), // 206 * almost-P
- SYSX_(__NR_fchown32, sys_fchown), // 207 * (SVr4,BSD4.3)
- SYSX_(__NR_setresuid32, sys_setresuid), // 208 * (non-standard)
- SYSXY(__NR_getresuid32, sys_getresuid), // 209 * L
-
- SYSX_(__NR_setresgid32, sys_setresgid), // 210 * (non-standard)
- SYSXY(__NR_getresgid32, sys_getresgid), // 211 * L
- SYSX_(__NR_chown32, sys_chown), // 212 * P
- SYSX_(__NR_setuid32, sys_setuid), // 213 *
- SYSX_(__NR_setgid32, sys_setgid), // 214 * (SVr4,SVID)
-
- SYSX_(__NR_setfsuid32, sys_setfsuid), // 215 * L
- SYSX_(__NR_setfsgid32, sys_setfsgid), // 216 * L
- // (__NR_pivot_root, sys_pivot_root), // 217 * L
- SYSXY(__NR_mincore, sys_mincore), // 218 * non-P?
- SYSX_(__NR_madvise, sys_madvise), // 219 * P
-
- SYSXY(__NR_getdents64, sys_getdents64), // 220 * (SVr4,SVID?)
- SYSXY(__NR_fcntl64, sys_fcntl64), // 221 * P?
- // Nb: 222 is reserved for TUX (whatever that means --njn)
- SYSX_(222, sys_ni_syscall), // 222 * P -- reserved
- SYSX_(223, sys_ni_syscall), // 223 * P -- unused
- // (__NR_gettid, sys_gettid), // 224 * L
-
- // (__NR_readahead, sys_readahead), // 225 * ()
- SYSX_(__NR_setxattr, sys_setxattr), // 226 * L?
- SYSX_(__NR_lsetxattr, sys_lsetxattr), // 227 * L?
- SYSX_(__NR_fsetxattr, sys_fsetxattr), // 228 * L?
- SYSXY(__NR_getxattr, sys_getxattr), // 229 * L?
-
- SYSXY(__NR_lgetxattr, sys_lgetxattr), // 230 * L?
- SYSXY(__NR_fgetxattr, sys_fgetxattr), // 231 * L?
- SYSXY(__NR_listxattr, sys_listxattr), // 232 * L?
- SYSXY(__NR_llistxattr, sys_llistxattr), // 233 * L?
- SYSXY(__NR_flistxattr, sys_flistxattr), // 234 * L?
-
- SYSX_(__NR_removexattr, sys_removexattr), // 235 * L?
- SYSX_(__NR_lremovexattr, sys_lremovexattr), // 236 * L?
- SYSX_(__NR_fremovexattr, sys_fremovexattr), // 237 * L?
- // (__NR_tkill, sys_tkill), // 238 * L
- SYSXY(__NR_sendfile64, sys_sendfile64), // 239 * L
-
- SYSXY(__NR_futex, sys_futex), // 240 * L
- SYSX_(__NR_sched_setaffinity,sys_sched_setaffinity), // 241 * L?
- SYSXY(__NR_sched_getaffinity,sys_sched_getaffinity), // 242 * L?
- SYSX_(__NR_set_thread_area, sys_set_thread_area), // 243 (x86-only) L
- SYSX_(__NR_get_thread_area, sys_get_thread_area), // 244 (x86-only) L
-
- SYSX_(__NR_io_setup, sys_io_setup), // 245 * L
- SYSX_(__NR_io_destroy, sys_io_destroy), // 246 * L
- SYSXY(__NR_io_getevents, sys_io_getevents), // 247 * L
- SYSX_(__NR_io_submit, sys_io_submit), // 248 * L
- SYSXY(__NR_io_cancel, sys_io_cancel), // 249 * L
-
- // (__NR_fadvise64, sys_fadvise64), // 250 * ()
- SYSX_(251, sys_ni_syscall), // 251 * P -- unused
- SYSX_(__NR_exit_group, sys_exit_group), // 252 *
- SYSXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253 (*/32/64) L
- SYSXY(__NR_epoll_create, sys_epoll_create), // 254 * L
-
- SYSX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 * L
- SYSXY(__NR_epoll_wait, sys_epoll_wait), // 256 * L
- // (__NR_remap_file_pages, sys_remap_file_pages),// 257 * L
- SYSX_(__NR_set_tid_address, sys_set_tid_address), // 258 * ?
- SYSXY(__NR_timer_create, sys_timer_create), // 259 (?) P
-
- SYSXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1) * P
- SYSXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2) * P
- SYSX_(__NR_timer_getoverrun, sys_timer_getoverrun),// (timer_create+3) * P
- SYSX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4) * P
- SYSX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5) * P
-
- SYSXY(__NR_clock_gettime, sys_clock_gettime), // (timer_create+6) * P
- SYSXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7) * P
- // (__NR_clock_nanosleep, sys_clock_nanosleep), // (timer_create+8) * P
-
- SYSXY(__NR_statfs64, sys_statfs64), // 268 * (?)
- SYSXY(__NR_fstatfs64, sys_fstatfs64), // 269 * (?)
-
- // (__NR_tgkill, sys_tgkill), // 270 * ()
- SYSX_(__NR_utimes, sys_utimes), // 271 * (4.3BSD)
- // (__NR_fadvise64_64, sys_fadvise64_64), // 272 * ()
- SYSX_(__NR_vserver, sys_ni_syscall), // 273 * P -- unimplemented
- // (__NR_mbind, sys_mbind), // 274 () ()
-
- // (__NR_get_mempolicy, sys_get_mempolicy),// 275 () ()
- // (__NR_set_mempolicy, sys_set_mempolicy),// 276 () ()
- SYSXY(__NR_mq_open, sys_mq_open), // 277 * P?
-...
[truncated message content] |
|
From: Julian S. <js...@ac...> - 2004-11-17 13:46:26
|
CVS commit by jseward: Link to 2.2.0 docs. M +3 -3 docs.html 1.9 --- devel-home/valgrind/docs.html #1.8:1.9 @@ -5,7 +5,7 @@ ?> -<a href="http://developer.kde.org/~sewardj/docs-2.1.2/manual.html">Full -documentation</a> for version 2.1.2 is supplied, up-to-date as of 18 -July 2004. +<a href="http://developer.kde.org/~sewardj/docs-2.2.0/manual.html">Full +documentation</a> for version 2.2.0 is supplied, up-to-date as of 31 +August 2004. <p> The following tutorials may be slightly out-of-date, but should give a good |
|
From: <js...@ac...> - 2004-11-17 04:06:51
|
Nightly build on phoenix ( SuSE 9.1 ) started at 2004-11-17 03:50:00 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow insn_mmx: valgrind ./insn_mmx insn_mmxext: (cpu_test failed, skipping) insn_sse: valgrind ./insn_sse insn_sse2: (cpu_test failed, skipping) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 186 tests, 5 stderr failures, 0 stdout failures ================= corecheck/tests/as_mmap (stderr) corecheck/tests/fdleak_fcntl (stderr) memcheck/tests/scalar (stderr) memcheck/tests/writev (stderr) memcheck/tests/zeropage (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <to...@co...> - 2004-11-17 03:25:42
|
Nightly build on dunsmere ( Fedora Core 3 ) started at 2004-11-17 03:20:03 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow -- Finished tests in none/tests ---------------------------------------- == 191 tests, 14 stderr failures, 1 stdout failure ================= corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_socketpair (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/writev (stderr) none/tests/exec-sigmask (stdout) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-11-17 03:21:03
|
Nightly build on audi ( Red Hat 9 ) started at 2004-11-17 03:15:04 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 191 tests, 12 stderr failures, 0 stdout failures ================= corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_socketpair (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/writev (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-11-17 03:13:57
|
Nightly build on ginetta ( Red Hat 8.0 ) started at 2004-11-17 03:10:02 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow fpu_lazy_eflags: valgrind ./fpu_lazy_eflags insn_basic: valgrind ./insn_basic insn_cmov: valgrind ./insn_cmov insn_fpu: valgrind ./insn_fpu insn_mmx: valgrind ./insn_mmx insn_mmxext: valgrind ./insn_mmxext insn_sse: valgrind ./insn_sse insn_sse2: (cpu_test failed, skipping) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 191 tests, 1 stderr failure, 0 stdout failures ================= memcheck/tests/scalar (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-11-17 03:08:40
|
Nightly build on alvis ( Red Hat 7.3 ) started at 2004-11-17 03:05:01 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow insn_basic: valgrind ./insn_basic insn_cmov: valgrind ./insn_cmov insn_fpu: valgrind ./insn_fpu insn_mmx: valgrind ./insn_mmx insn_mmxext: valgrind ./insn_mmxext insn_sse: valgrind ./insn_sse insn_sse2: (cpu_test failed, skipping) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 191 tests, 2 stderr failures, 0 stdout failures ================= memcheck/tests/scalar (stderr) memcheck/tests/vgtest_ume (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-11-17 03:04:10
|
Nightly build on standard ( Red Hat 7.2 ) started at 2004-11-17 03:00:02 GMT Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow insn_basic: valgrind ./insn_basic insn_cmov: valgrind ./insn_cmov insn_fpu: valgrind ./insn_fpu insn_mmx: valgrind ./insn_mmx insn_mmxext: valgrind ./insn_mmxext insn_sse: valgrind ./insn_sse insn_sse2: (cpu_test failed, skipping) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 191 tests, 2 stderr failures, 0 stdout failures ================= memcheck/tests/scalar (stderr) memcheck/tests/vgtest_ume (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-11-17 00:02:09
|
CVS commit by thughes:
Change VG_(nuke_all_threads) to disassociate the the stacks of the threads
being killed from the threads rather than marking them as inaccessible.
This should fix the problem with the environment (and other data from the
stacks of other threads) causing warnings after a fork. I believe that
VG_(nuke_all_threads) is only called in places where this is the behaviour
that we want or where it doesn't matter because we're about to exit anyway.
MERGE TO STABLE
M +7 -2 vg_scheduler.c 1.171.2.4
--- valgrind/coregrind/vg_scheduler.c #1.171.2.3:1.171.2.4
@@ -1421,7 +1421,10 @@ void cleanup_after_thread_exited ( Threa
vg_assert(is_valid_or_empty_tid(tid));
vg_assert(VG_(threads)[tid].status == VgTs_Empty);
+
/* Its stack is now off-limits */
+ if (VG_(threads)[tid].stack_base) {
VG_TRACK( die_mem_stack, VG_(threads)[tid].stack_base,
VG_(threads)[tid].stack_size );
+ }
/* Deallocate its LDT, if it ever had one. */
@@ -1520,4 +1523,6 @@ void VG_(nuke_all_threads_except) ( Thre
VG_(proxy_delete)(tid, True);
VG_(threads)[tid].status = VgTs_Empty;
+ VG_(threads)[tid].stack_base = (Addr)NULL;
+ VG_(threads)[tid].stack_size = 0;
cleanup_after_thread_exited( tid, True );
}
|