Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/23440 )

Change subject: sim: Make SyscallReturn handle extra/"pseudo" return registers.
......................................................................

sim: Make SyscallReturn handle extra/"pseudo" return registers.

Avoid special casing them in the system calls themselves.

Change-Id: I735f8e6fdff164c66e3f1386aed3fc9b107ea45f
---
M src/arch/alpha/process.cc
M src/arch/arm/process.cc
M src/arch/mips/process.cc
M src/arch/sparc/process.cc
M src/sim/syscall_emul.cc
M src/sim/syscall_return.hh
6 files changed, 33 insertions(+), 17 deletions(-)



diff --git a/src/arch/alpha/process.cc b/src/arch/alpha/process.cc
index 02a6899..f40b771 100644
--- a/src/arch/alpha/process.cc
+++ b/src/arch/alpha/process.cc
@@ -237,4 +237,6 @@
         tc->setIntReg(SyscallSuccessReg, (RegVal)-1);
         tc->setIntReg(ReturnValueReg, sysret.errnoValue());
     }
+    if (sysret.count() > 1)
+        tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
 }
diff --git a/src/arch/arm/process.cc b/src/arch/arm/process.cc
index 19ee32b..df21183 100644
--- a/src/arch/arm/process.cc
+++ b/src/arch/arm/process.cc
@@ -527,6 +527,8 @@
     }

     tc->setIntReg(ReturnValueReg, sysret.encodedValue());
+    if (sysret.count() > 1)
+        tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
 }

 void
@@ -544,4 +546,6 @@
     }

     tc->setIntReg(ReturnValueReg, sysret.encodedValue());
+    if (sysret.count() > 1)
+        tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
 }
diff --git a/src/arch/mips/process.cc b/src/arch/mips/process.cc
index a62c1de..9f90623 100644
--- a/src/arch/mips/process.cc
+++ b/src/arch/mips/process.cc
@@ -212,4 +212,6 @@
         tc->setIntReg(SyscallSuccessReg, (uint32_t)(-1));
         tc->setIntReg(ReturnValueReg, sysret.errnoValue());
     }
+    if (sysret.count() > 1)
+        tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
 }
diff --git a/src/arch/sparc/process.cc b/src/arch/sparc/process.cc
index 189afac..ce1503c 100644
--- a/src/arch/sparc/process.cc
+++ b/src/arch/sparc/process.cc
@@ -536,4 +536,6 @@
             val = bits(val, 31, 0);
         tc->setIntReg(ReturnValueReg, val);
     }
+    if (sysret.count() > 1)
+        tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
 }
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 30bc2d3..b1f098f 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -980,8 +980,7 @@
     // not getting a unique value.

     auto process = tc->getProcessPtr();
-    tc->setIntReg(SyscallPseudoReturnReg, process->ppid());
-    return process->pid();
+    return SyscallReturn(process->pid(), process->ppid());
 }


@@ -991,20 +990,17 @@
     // Make up a UID and EUID... it shouldn't matter, and we want the
     // simulation to be deterministic.

-    // EUID goes in r20.
     auto process = tc->getProcessPtr();
-    tc->setIntReg(SyscallPseudoReturnReg, process->euid()); // EUID
-    return process->uid(); // UID
+    return SyscallReturn(process->uid(), process->euid());
 }


 SyscallReturn
 getgidPseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
 {
-    // Get current group ID.  EGID goes in r20.
+    // Get current group ID.
     auto process = tc->getProcessPtr();
-    tc->setIntReg(SyscallPseudoReturnReg, process->egid()); // EGID
-    return process->gid();
+    return SyscallReturn(process->gid(), process->egid());
 }


diff --git a/src/sim/syscall_return.hh b/src/sim/syscall_return.hh
index b60434e..49a0d2f 100644
--- a/src/sim/syscall_return.hh
+++ b/src/sim/syscall_return.hh
@@ -63,10 +63,16 @@
     /// conversion, so a bare integer is used where a SyscallReturn
     /// value is expected, e.g., as the return value from a system
     /// call emulation function ('return 0;' or 'return -EFAULT;').
-    SyscallReturn(int64_t v) : value(v) {}
+    SyscallReturn(int64_t v) : _value(v), _count(1) {}

/// A SyscallReturn constructed with no value means don't return anything.
-    SyscallReturn() : suppressedFlag(true) {}
+    SyscallReturn() : _count(0) {}
+
+ /// A SyscallReturn constructed with two values means put the second value + /// in additional return registers as defined by the ABI, if they exist.
+    SyscallReturn(int64_t v1, int64_t v2) :
+        _value(v1), _value2(v2), _count(2)
+    {}

     /// Pseudo-constructor to create an instance with the retry flag set.
     static SyscallReturn
@@ -83,21 +89,24 @@
     bool
     successful() const
     {
-        return (value >= 0 || value <= -4096);
+        return (_value >= 0 || _value <= -4096);
     }

     /// Does the syscall need to be retried?
     bool needsRetry() const { return retryFlag; }

     /// Should returning this value be suppressed?
-    bool suppressed() const { return suppressedFlag; }
+    bool suppressed() const { return _count == 0; }
+
+    /// How many values did the syscall attempt to return?
+    int count() const { return _count; }

     /// The return value
     int64_t
     returnValue() const
     {
         assert(successful());
-        return value;
+        return _value;
     }

     /// The errno value
@@ -105,17 +114,18 @@
     errnoValue() const
     {
         assert(!successful());
-        return -value;
+        return -_value;
     }

     /// The encoded value (as described above)
-    int64_t encodedValue() const { return value; }
+    int64_t encodedValue() const { return _value; }
+    int64_t value2() const { return _value2; }

   private:
-    int64_t value;
+    int64_t _value, _value2;
+    int _count;

     bool retryFlag = false;
-    bool suppressedFlag =  false;
 };

 #endif

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/23440
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I735f8e6fdff164c66e3f1386aed3fc9b107ea45f
Gerrit-Change-Number: 23440
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to