sim-se: implement the getcpu syscall
authorCiro Santilli <ciro.santilli@arm.com>
Wed, 22 Apr 2020 15:01:45 +0000 (16:01 +0100)
committerCiro Santilli <ciro.santilli@arm.com>
Wed, 20 May 2020 07:58:05 +0000 (07:58 +0000)
Change-Id: I63a1384646829b8cf68453c42aed6a7d12172787
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/28590
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/linux/process.cc
src/arch/x86/linux/process.cc
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh

index b5b6553d99552b589617179f506c0047b116e74d..55141ba1104b42e78eb9871918c5165e1fe01cd4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013, 2015 ARM Limited
+ * Copyright (c) 2010-2013, 2015, 2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -476,7 +476,7 @@ class SyscallTable32 :
         { base + 342, "tee" },
         { base + 343, "vmsplice" },
         { base + 344, "move_pages" },
-        { base + 345, "getcpu" },
+        { base + 345, "getcpu", getcpuFunc },
         { base + 346, "epoll_pwait" },
         { base + 347, "sys_kexec_load" },
         { base + 348, "sys_utimensat" },
@@ -681,7 +681,7 @@ class SyscallTable64 :
         {  base + 165, "getrusage", getrusageFunc<ArmLinux64> },
         {  base + 166, "umask" },
         {  base + 167, "prctl" },
-        {  base + 168, "getcpu" },
+        {  base + 168, "getcpu", getcpuFunc },
         {  base + 169, "gettimeofday", gettimeofdayFunc<ArmLinux64> },
         {  base + 170, "settimeofday" },
         {  base + 171, "adjtimex" },
index 6b50dbf5b6558449709a39439dc406659bdb0fca..2c594e75680d37cbe8edfd4bbcfe6c47c844109e 100644 (file)
@@ -566,7 +566,7 @@ static SyscallDescTable<X86_64LinuxProcess::SyscallABI> syscallDescs64 = {
     { 306, "syncfs" },
     { 307, "sendmmsg" },
     { 308, "setns" },
-    { 309, "getcpu" },
+    { 309, "getcpu", getcpuFunc },
     { 310, "proess_vm_readv" },
     { 311, "proess_vm_writev" },
     { 312, "kcmp" },
@@ -914,7 +914,7 @@ static SyscallDescTable<I386LinuxProcess::SyscallABI> syscallDescs32 = {
     { 315, "tee" },
     { 316, "vmsplice" },
     { 317, "move_pages" },
-    { 318, "getcpu" },
+    { 318, "getcpu", getcpuFunc },
     { 319, "epoll_pwait" },
     { 320, "utimensat" },
     { 321, "signalfd" },
index bffedfdd957924418b26c72b5d8079dd6b19aea8..6d39823b4257738685f6508eb826311e78d3787a 100644 (file)
@@ -1633,3 +1633,26 @@ setsockoptFunc(SyscallDesc *desc, ThreadContext *tc,
     return (status == -1) ? -errno : status;
 }
 
+SyscallReturn
+getcpuFunc(SyscallDesc *desc, ThreadContext *tc,
+           Addr cpu_ptr, Addr node_ptr, Addr tcache_ptr)
+{
+    bool error = false;
+
+    // unsigned is the same size (4) on all Linux supported ISAs.
+    if (cpu_ptr != 0) {
+        TypedBufferArg<uint32_t> result(cpu_ptr);
+        *result = htog(tc->contextId(),
+            tc->getSystemPtr()->getGuestByteOrder());
+        error |= !result.copyOut(tc->getVirtProxy());
+    }
+
+    // Set a fixed NUMA node 0.
+    if (node_ptr != 0) {
+        TypedBufferArg<uint32_t> result(node_ptr);
+        *result = 0;
+        error |= !result.copyOut(tc->getVirtProxy());
+    }
+
+    return error ? -EFAULT : 0;
+}
index 4a37e99a0a6905394464e42d09053b4fa3e66b82..55d30f3008a9028bebe20da7db19e6ed5799d9d5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, 2015, 2019 ARM Limited
+ * Copyright (c) 2012-2013, 2015, 2019-2020 ARM Limited
  * Copyright (c) 2015 Advanced Micro Devices, Inc.
  * All rights reserved
  *
@@ -354,6 +354,9 @@ SyscallReturn setsockoptFunc(SyscallDesc *desc, ThreadContext *tc,
                              int tgt_fd, int level, int optname,
                              Addr valPtr, socklen_t len);
 
+SyscallReturn getcpuFunc(SyscallDesc *desc, ThreadContext *tc,
+                         Addr cpu_ptr, Addr node_ptr, Addr tcache_ptr);
+
 // Target getsockname() handler.
 SyscallReturn getsocknameFunc(SyscallDesc *desc, ThreadContext *tc,
                               int tgt_fd, Addr addrPtr, Addr lenPtr);