]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle linux syscalls sched_getattr and sched_setattr
authorMark Wielaard <mark@klomp.org>
Mon, 27 Jul 2020 14:36:17 +0000 (16:36 +0200)
committerMark Wielaard <mark@klomp.org>
Sat, 1 Aug 2020 13:34:48 +0000 (15:34 +0200)
The only "special" thing about these syscalls is that the given
struct sched_attr determines its own size for future expansion.

Original fix by "ISHIKAWA,chiaki" <ishikawa@yk.rim.or.jp>

https://bugs.kde.org/show_bug.cgi?id=369029

14 files changed:
NEWS
coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-arm-linux.c
coregrind/m_syswrap/syswrap-arm64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_syswrap/syswrap-nanomips-linux.c
coregrind/m_syswrap/syswrap-ppc32-linux.c
coregrind/m_syswrap/syswrap-ppc64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
include/vki/vki-linux.h

diff --git a/NEWS b/NEWS
index 0ffcb5bf9f522317f6e2191f6d5402f44d1ff281..77de28a294038a3d43ba16906298c2cd79ce72b4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,7 @@ To see details of a given bug, visit
 where XXXXXX is the bug number as listed below.
 
 345077  linux syscall execveat support (linux 3.19)
+369029  handle linux syscalls sched_getattr and sched_setattr
 n-i-bz  helgrind: If hg_cli__realloc fails, return NULL.
 
 423021  PPC:  Add missing ISA 3.0 documentation link and HWCAPS test.
index cdc73c1e6d68f69fe6b0e2b5cf1fe7a742d7c69a..eb0b320caa9d0a2a78b2ec4497bebd5ac7fbaf15 100644 (file)
@@ -227,6 +227,8 @@ DECL_TEMPLATE(linux, sys_fremovexattr);
 // syscalls.
 DECL_TEMPLATE(linux, sys_sched_setparam);
 DECL_TEMPLATE(linux, sys_sched_getparam);
+DECL_TEMPLATE(linux, sys_sched_setattr);
+DECL_TEMPLATE(linux, sys_sched_getattr);
 DECL_TEMPLATE(linux, sys_sched_setscheduler);
 DECL_TEMPLATE(linux, sys_sched_getscheduler);
 DECL_TEMPLATE(linux, sys_sched_yield);
index 28d90135a456a10a6c2607e302801dbd2597f589..d6f3eb91090b338537813c8ed05f69815570e3a3 100644 (file)
@@ -846,9 +846,8 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 311
    LINX_(__NR_kcmp,              sys_kcmp),             // 312
    LINX_(__NR_finit_module,      sys_finit_module),     // 313
-//   LIN__(__NR_sched_setattr,     sys_ni_syscall),       // 314
-
-//   LIN__(__NR_sched_getattr,     sys_ni_syscall),       // 315
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 314
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 315
    LINX_(__NR_renameat2,         sys_renameat2),        // 316
 //   LIN__(__NR_seccomp,           sys_ni_syscall),       // 317
    LINXY(__NR_getrandom,         sys_getrandom),        // 318
index 579542785ebc46a92833e31371ea55ca7dcff5b5..70700e53f7a48ea72943903d4a5461b568046b10 100644 (file)
@@ -1009,6 +1009,8 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 376
    LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 377
 
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 380
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 381
    LINX_(__NR_renameat2,         sys_renameat2),        // 382
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 384
index 81e01456f86fd3ae4a390ac6a11f2a77802c6823..acca02442332274ffaf18ab09503ad35db2a475e 100644 (file)
@@ -806,8 +806,8 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_process_vm_writev, sys_process_vm_writev), // 271
    LINX_(__NR_kcmp,              sys_kcmp),              // 272
    LINX_(__NR_finit_module,      sys_finit_module),      // 273
-   //   (__NR_sched_setattr,     sys_ni_syscall),        // 274
-   //   (__NR_sched_getattr,     sys_ni_syscall),        // 275
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),     // 274
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),     // 275
    LINX_(__NR_renameat2,         sys_renameat2),         // 276
    //   (__NR_seccomp,           sys_ni_syscall),        // 277
    LINXY(__NR_getrandom,         sys_getrandom),         // 278
index 5b5b7eee63d495c203a88e0d683894ea71bc1fc7..56be3032d328a99eac7705c0033d205afaaab874 100644 (file)
@@ -3677,6 +3677,41 @@ POST(sys_sched_getparam)
    POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) );
 }
 
+PRE(sys_sched_setattr)
+{
+   struct vki_sched_attr *attr;
+   PRINT("sched_setattr ( %ld, %#" FMT_REGWORD "x, %#"
+         FMT_REGWORD "x )", SARG1, ARG2, ARG3 );
+   PRE_REG_READ3(long, "sched_setattr",
+                 vki_pid_t, pid, struct sched_attr *, p, unsigned int, flags);
+   /* We need to be able to read at least the size field.  */
+   PRE_MEM_READ( "sched_setattr(attr->size)", ARG2, sizeof(vki_uint32_t) );
+   attr = (struct vki_sched_attr *)(Addr)ARG2;
+   if (ML_(safe_to_deref)(attr,sizeof(vki_uint32_t)))
+      PRE_MEM_READ( "sched_setattr(attr)", (Addr)attr, attr->size);
+}
+
+PRE(sys_sched_getattr)
+{
+   struct vki_sched_attr *attr;
+   PRINT("sched_getattr ( %ld, %#" FMT_REGWORD "x, %ld, %#"
+         FMT_REGWORD "x )", SARG1, ARG2, ARG3, ARG4 );
+   PRE_REG_READ4(long, "sched_getattr",
+                 vki_pid_t, pid, struct sched_attr *, p,
+                 unsigned int, size, unsigned int, flags);
+   /* We need to be able to read at least the size field.  */
+   PRE_MEM_READ( "sched_setattr(attr->size)", ARG2, sizeof(vki_uint32_t) );
+   /* And the kernel needs to be able to write to the whole struct size. */
+   attr = (struct vki_sched_attr *)(Addr)ARG2;
+   if (ML_(safe_to_deref)(attr,sizeof(vki_uint32_t)))
+      PRE_MEM_WRITE( "sched_setattr(attr)", (Addr)attr, attr->size);
+}
+POST(sys_sched_getattr)
+{
+   struct vki_sched_attr *attr = (struct vki_sched_attr *)(Addr)ARG2;
+   POST_MEM_WRITE( (Addr)attr, attr->size );
+}
+
 PRE(sys_sched_getscheduler)
 {
    PRINT("sys_sched_getscheduler ( %ld )", SARG1);
index ffb428dcb5fcf052098182041bb1ae06b313a12f..5face576be4e06532c249f844115c5baff699caf 100644 (file)
@@ -1094,6 +1094,9 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_process_vm_readv,       sys_process_vm_readv),        // 345
    LINX_ (__NR_process_vm_writev,      sys_process_vm_writev),       // 346
    //..
+   LINX_(__NR_sched_setattr,           sys_sched_setattr),           // 349
+   LINXY(__NR_sched_getattr,           sys_sched_getattr),           // 350
+   //..
    LINXY (__NR_getrandom,              sys_getrandom),               // 353
    LINXY (__NR_memfd_create,           sys_memfd_create),            // 354
    //..
index e5b471955ce52514eae05afb93ed9bd4da3d78c4..c64911a50ba5143be56ed50b8f7c9f67e3ecffe9 100644 (file)
@@ -798,6 +798,8 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_clock_adjtime, sys_clock_adjtime),
    LINXY (__NR_process_vm_readv, sys_process_vm_readv),
    LINX_ (__NR_process_vm_writev, sys_process_vm_writev),
+   LINX_ (__NR_sched_setattr, sys_sched_setattr),
+   LINXY (__NR_sched_getattr, sys_sched_getattr),
    LINXY (__NR_getrandom, sys_getrandom),
    LINXY (__NR_memfd_create, sys_memfd_create),
    LINX_ (__NR_execveat, sys_execveat),
index 40253fadf505aa0ecd5b421be6321f5a7af4e434..7ceecb6daf1e6a8d70dd861da372e4fd7d7b984c 100644 (file)
@@ -804,6 +804,8 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_ (__NR_process_vm_writev,      sys_process_vm_writev),
    LINX_ (__NR_kcmp,                   sys_kcmp),
    LINX_ (__NR_renameat2,              sys_renameat2),
+   LINX_ (__NR_sched_setattr,          sys_sched_setattr),
+   LINXY (__NR_sched_getattr,          sys_sched_getattr),
    LINXY (__NR_getrandom,              sys_getrandom),
    LINXY (__NR_memfd_create,           sys_memfd_create),
    LINXY (__NR_statx,                  sys_statx),
index eed12a1bc6e71489e0c6b950a476dbc9bbafaf28..c19cb9e0ee3413e02e473510f97c6c255ed73de2 100644 (file)
@@ -1016,6 +1016,9 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 351
    LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352
 
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 355
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 356
+
    LINXY(__NR_getrandom,         sys_getrandom),        // 359
    LINXY(__NR_memfd_create,      sys_memfd_create),     // 360
 
index d58200b4918931020c7f287bf14514c4dcfa5d4c..b6422a7655167176ec2eda5f817940de2b283aa6 100644 (file)
@@ -998,6 +998,8 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_process_vm_readv,  sys_process_vm_readv), // 351
    LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352
 
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 355
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 356
    LINX_(__NR_renameat2,         sys_renameat2),        // 357
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 359
index a0a330aa206be0c81bf7439b49c7a9df63628401..3427fee16dabff86054f6bb4bc5dca58506cfc9b 100644 (file)
@@ -825,8 +825,8 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_kcmp, sys_kcmp),                                        // 343
 // ?????(__NR_finit_module, ),                                        // 344
 
-// ?????(__NR_sched_setattr, ),                                       // 345
-// ?????(__NR_sched_getattr, ),                                       // 346
+   LINX_(__NR_sched_setattr, sys_sched_setattr),                      // 345
+   LINXY(__NR_sched_getattr, sys_sched_getattr),                      // 346
    LINX_(__NR_renameat2, sys_renameat2),                              // 347
 // ?????(__NR_seccomp, ),                                             // 348
    LINXY(__NR_getrandom, sys_getrandom),                              // 349
index 332ed0bf27ac95f8308a353bbdcedd9d800efb5f..b59d96f3758b0292cc0bb98c081fe1cdc21be8b1 100644 (file)
@@ -1580,8 +1580,8 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_kcmp,              sys_kcmp),             // 349
 
 //   LIN__(__NR_finit_module,      sys_ni_syscall),       // 350
-//   LIN__(__NR_sched_setattr,     sys_ni_syscall),       // 351
-//   LIN__(__NR_sched_getattr,     sys_ni_syscall),       // 352
+   LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 351
+   LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 352
    LINX_(__NR_renameat2,         sys_renameat2),        // 353
 //   LIN__(__NR_seccomp,           sys_ni_syscall),       // 354
 
index 75b5831650be0105af85c95f09f352065c42c735..ef93b9258521943ba0eddac79fff60e125dcb9b9 100644 (file)
@@ -410,6 +410,23 @@ struct vki_sched_param {
        int sched_priority;
 };
 
+struct vki_sched_attr {
+       vki_uint32_t size;
+       vki_uint32_t sched_policy;
+       vki_uint64_t sched_flags;
+
+       /* SCHED_NORMAL, SCHED_BATCH */
+       vki_int32_t sched_nice;
+
+       /* SCHED_FIFO, SCHED_RR */
+       vki_uint32_t sched_priority;
+
+       /* SCHED_DEADLINE */
+       vki_uint64_t sched_runtime;
+       vki_uint64_t sched_deadline;
+       vki_uint64_t sched_period;
+};
+
 #define VKI_TASK_COMM_LEN 16
 
 //----------------------------------------------------------------------