syscall_emul: expand AuxVector class
authorBrandon Potter <brandon.potter@amd.com>
Fri, 4 May 2018 21:55:24 +0000 (17:55 -0400)
committerAnthony Gutierrez <anthony.gutierrez@amd.com>
Wed, 19 Sep 2018 20:51:17 +0000 (20:51 +0000)
The AuxVector class is responsible for holding Process data.
The data that it holds is normally setup by an OS kernel in
the process address space. The purpose behind doing this is
to pass in information that the process will need for various
reasons. (Check out the enum in the header file for an idea of
what the AuxVector holds.)

The AuxVector struct was changed into a class and encapsulation
methods were added to protect access to the member variables.

The host ISA may have a different endianness than the simulated
ISA. Since data is passed between the process address space and
the simulator for auxiliary vectors, we need to worry about
maintaining endianness for the right context.

Change-Id: I32c5ac4b679559886e1efeb4b5483b92dfc94af9
Reviewed-on: https://gem5-review.googlesource.com/12109
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>

src/arch/alpha/process.cc
src/arch/arm/process.cc
src/arch/mips/process.cc
src/arch/power/process.cc
src/arch/riscv/process.cc
src/arch/sparc/process.cc
src/arch/x86/process.cc
src/sim/aux_vector.cc
src/sim/aux_vector.hh

index 112abbf4aee2e618061439aff07386ce41d28f8f..e8dad991761855b38fa68a2588ead579ba282b50 100644 (file)
@@ -170,9 +170,9 @@ AlphaProcess::argsInit(int intSize, int pageSize)
     //Copy the aux stuff
     for (vector<auxv_t>::size_type x = 0; x < auxv.size(); x++) {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                (uint8_t*)&(auxv[x].getAuxType()), intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                (uint8_t*)&(auxv[x].getAuxVal()), intSize);
     }
 
     ThreadContext *tc = system->getThreadContext(contextIds[0]);
index 1bb23dec2b362fef4fb42aebeb8bee0f85eda69f..0c1d18bb192ce21823e4d13ff4ec4157cb58b404 100644 (file)
@@ -346,14 +346,14 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
 
     //Fix up the aux vectors which point to other data
     for (int i = auxv.size() - 1; i >= 0; i--) {
-        if (auxv[i].a_type == M5_AT_PLATFORM) {
-            auxv[i].a_val = platform_base;
+        if (auxv[i].getHostAuxType() == M5_AT_PLATFORM) {
+            auxv[i].setAuxVal(platform_base);
             initVirtMem.writeString(platform_base, platform.c_str());
-        } else if (auxv[i].a_type == M5_AT_EXECFN) {
-            auxv[i].a_val = aux_data_base;
+        } else if (auxv[i].getHostAuxType() == M5_AT_EXECFN) {
+            auxv[i].setAuxVal(aux_data_base);
             initVirtMem.writeString(aux_data_base, filename.c_str());
-        } else if (auxv[i].a_type == M5_AT_RANDOM) {
-            auxv[i].a_val = aux_random_base;
+        } else if (auxv[i].getHostAuxType() == M5_AT_RANDOM) {
+            auxv[i].setAuxVal(aux_random_base);
             // Just leave the value 0, we don't want randomness
         }
     }
@@ -361,9 +361,11 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
     //Copy the aux stuff
     for (int x = 0; x < auxv.size(); x++) {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                              (uint8_t*)&(auxv[x].getAuxType()),
+                              intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                              (uint8_t*)&(auxv[x].getAuxVal()),
+                              intSize);
     }
     //Write out the terminating zeroed auxilliary vector
     const uint64_t zero = 0;
index b2957e0c4aa87bcd3b6ae85e990c801e0f10b370..3f65691aa98866d16b78d3372d755f8e9573c9f5 100644 (file)
@@ -179,9 +179,9 @@ MipsProcess::argsInit(int pageSize)
     // Copy the aux vector
     for (typename vector<auxv_t>::size_type x = 0; x < auxv.size(); x++) {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                (uint8_t*)&(auxv[x].getAuxType()), intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                (uint8_t*)&(auxv[x].getAuxVal()), intSize);
     }
 
     // Write out the terminating zeroed auxilliary vector
index 6561bff4e66844cf964f0c39b33447b9439d2ec8..cf2153a1d5c7221619d2e7f2a9bcab97af1d7b64 100644 (file)
@@ -239,11 +239,11 @@ PowerProcess::argsInit(int intSize, int pageSize)
 
     //Fix up the aux vectors which point to other data
     for (int i = auxv.size() - 1; i >= 0; i--) {
-        if (auxv[i].a_type == M5_AT_PLATFORM) {
-            auxv[i].a_val = platform_base;
+        if (auxv[i].getHostAuxType() == M5_AT_PLATFORM) {
+            auxv[i].setAuxVal(platform_base);
             initVirtMem.writeString(platform_base, platform.c_str());
-        } else if (auxv[i].a_type == M5_AT_EXECFN) {
-            auxv[i].a_val = aux_data_base;
+        } else if (auxv[i].getHostAuxType() == M5_AT_EXECFN) {
+            auxv[i].setAuxVal(aux_data_base);
             initVirtMem.writeString(aux_data_base, filename.c_str());
         }
     }
@@ -252,9 +252,9 @@ PowerProcess::argsInit(int intSize, int pageSize)
     for (int x = 0; x < auxv.size(); x++)
     {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                (uint8_t*)&(auxv[x].getAuxType()), intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                (uint8_t*)&(auxv[x].getAuxVal()), intSize);
     }
     //Write out the terminating zeroed auxilliary vector
     const uint64_t zero = 0;
index 4afc72147ad071cc6ee72bda38c4167f725bc03f..4e97fcf427398f1f8438befeea31a1e754cc97f3 100644 (file)
@@ -205,11 +205,11 @@ RiscvProcess::argsInit(int pageSize)
     };
     for (const AuxVector<IntType>& aux: auxv) {
         DPRINTF(Stack, "Wrote aux key %s to address %p\n",
-                aux_keys[aux.a_type], (void*)sp);
-        pushOntoStack((uint8_t*)&aux.a_type, sizeof(IntType));
+                aux_keys[aux.getAuxType()], (void*)sp);
+        pushOntoStack((uint8_t*)&aux.getAuxType(), sizeof(IntType));
         DPRINTF(Stack, "Wrote aux value %x to address %p\n",
-                aux.a_val, (void*)sp);
-        pushOntoStack((uint8_t*)&aux.a_val, sizeof(IntType));
+                aux.getAuxVal(), (void*)sp);
+        pushOntoStack((uint8_t*)&aux.getAuxVal(), sizeof(IntType));
     }
 
     ThreadContext *tc = system->getThreadContext(contextIds[0]);
index e4cd874bd2afccd24c432f0774ad6c2cb7c5411d..7dda6ed21270896acdb445d7562645047d0c3ac0 100644 (file)
@@ -375,9 +375,9 @@ SparcProcess::argsInit(int pageSize)
     // Copy the aux stuff
     for (int x = 0; x < auxv.size(); x++) {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                (uint8_t*)&(auxv[x].getAuxType()), intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                (uint8_t*)&(auxv[x].getAuxVal()), intSize);
     }
 
     // Write out the terminating zeroed auxilliary vector
index 7c979c016e452d9085bd557b546540ae38c598cc..273e2c0f95052af56930b701bd908779cbbdcd98 100644 (file)
@@ -1000,20 +1000,22 @@ X86Process::argsInit(int pageSize,
     initVirtMem.writeString(file_name_base, filename.c_str());
 
     // Fix up the aux vectors which point to data
-    assert(auxv[auxv.size() - 3].a_type == M5_AT_RANDOM);
-    auxv[auxv.size() - 3].a_val = aux_data_base;
-    assert(auxv[auxv.size() - 2].a_type == M5_AT_EXECFN);
-    auxv[auxv.size() - 2].a_val = argv_array_base;
-    assert(auxv[auxv.size() - 1].a_type == M5_AT_PLATFORM);
-    auxv[auxv.size() - 1].a_val = aux_data_base + numRandomBytes;
+    assert(auxv[auxv.size() - 3].getHostAuxType() == M5_AT_RANDOM);
+    auxv[auxv.size() - 3].setAuxVal(aux_data_base);
+    assert(auxv[auxv.size() - 2].getHostAuxType() == M5_AT_EXECFN);
+    auxv[auxv.size() - 2].setAuxVal(argv_array_base);
+    assert(auxv[auxv.size() - 1].getHostAuxType() == M5_AT_PLATFORM);
+    auxv[auxv.size() - 1].setAuxVal(aux_data_base + numRandomBytes);
 
 
     // Copy the aux stuff
     for (int x = 0; x < auxv.size(); x++) {
         initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
-                (uint8_t*)&(auxv[x].a_type), intSize);
+                              (uint8_t*)&(auxv[x].getAuxType()),
+                              intSize);
         initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
-                (uint8_t*)&(auxv[x].a_val), intSize);
+                              (uint8_t*)&(auxv[x].getAuxVal()),
+                              intSize);
     }
     // Write out the terminating zeroed auxiliary vector
     const uint64_t zero = 0;
index ef91da520e9f70edf4ba9b589522f594d93b067f..87a22e455400838dadd0ddb388e0d17490f96473 100644 (file)
 
 template<class IntType>
 AuxVector<IntType>::AuxVector(IntType type, IntType val)
+    : _auxType(TheISA::htog(type)), _auxVal(TheISA::htog(val)),
+      _auxHostType(type), _auxHostVal(val)
+{ }
+
+template<class IntType>
+inline void
+AuxVector<IntType>::setAuxType(IntType type)
+{
+    _auxType = TheISA::htog(type);
+    _auxHostType = type;
+}
+
+template<class IntType>
+inline void
+AuxVector<IntType>::setAuxVal(IntType val)
 {
-    a_type = TheISA::htog(type);
-    a_val = TheISA::htog(val);
+    _auxVal = TheISA::htog(val);
+    _auxHostVal = val;
 }
 
-template struct AuxVector<uint32_t>;
-template struct AuxVector<uint64_t>;
+template class AuxVector<uint32_t>;
+template class AuxVector<uint64_t>;
index 34ba48d1225ca558fa721b990c1041748d7d545a..1ca2d786244a5f0820e250f26310d5eda2562fab 100644 (file)
 #define __AUX_VECTOR_HH__
 
 template<class IntType>
-struct AuxVector
+class AuxVector
 {
-    IntType a_type;
-    IntType a_val;
+  public:
+    AuxVector() = default;
+    AuxVector(IntType type, IntType val);
 
-    AuxVector()
-    {}
+    IntType const& getAuxType() const { return _auxType; }
+    IntType const& getAuxVal() const { return _auxVal; }
+    IntType const& getHostAuxType() const { return _auxHostType; }
+    IntType const& getHostAuxVal() const { return _auxHostVal; }
 
-    AuxVector(IntType type, IntType val);
+    void setAuxType(IntType type);
+    void setAuxVal(IntType val);
+
+  private:
+    IntType _auxType = 0;
+    IntType _auxVal = 0;
+    IntType _auxHostType = 0;
+    IntType _auxHostVal = 0;
 };
 
 enum AuxiliaryVectorType {
-    M5_AT_NULL = 0,
-    M5_AT_IGNORE = 1,
-    M5_AT_EXECFD = 2,
-    M5_AT_PHDR = 3,
-    M5_AT_PHENT = 4,
-    M5_AT_PHNUM = 5,
-    M5_AT_PAGESZ = 6,
-    M5_AT_BASE = 7,
-    M5_AT_FLAGS = 8,
-    M5_AT_ENTRY = 9,
-    M5_AT_NOTELF = 10,
-    M5_AT_UID = 11,
-    M5_AT_EUID = 12,
-    M5_AT_GID = 13,
-    M5_AT_EGID = 14,
-    M5_AT_PLATFORM = 15,
-    M5_AT_HWCAP = 16,
-    M5_AT_CLKTCK = 17,
-    M5_AT_SECURE = 23,
-    M5_BASE_PLATFORM = 24,
-    M5_AT_RANDOM = 25,
-    M5_AT_EXECFN = 31,
+    M5_AT_NULL = 0,        // End of vector.
+    M5_AT_IGNORE = 1,      // Ignored.
+    M5_AT_EXECFD = 2,      // File descriptor of program if interpreter used.
+    M5_AT_PHDR = 3,        // Address of program header tables in memory.
+    M5_AT_PHENT = 4,       // Size in bytes of one program header entry.
+    M5_AT_PHNUM = 5,       // Number of entries in program header table.
+    M5_AT_PAGESZ = 6,      // System page size.
+    M5_AT_BASE = 7,        // Base address of interpreter program in memory.
+    M5_AT_FLAGS = 8,       // Unused.
+    M5_AT_ENTRY = 9,       // Entry point of program after interpreter setup.
+    M5_AT_NOTELF = 10,     // Non-zero if format is different than ELF.
+    M5_AT_UID = 11,        // Address of real user ID of thread.
+    M5_AT_EUID = 12,       // Address of effective user ID of thread.
+    M5_AT_GID = 13,        // Address of real group ID of thread.
+    M5_AT_EGID = 14,       // Address of effective group ID of thread.
+    M5_AT_PLATFORM = 15,   // Platform string for the architecture.
+    M5_AT_HWCAP = 16,      // Bits which describe the hardware capabilities.
+    M5_AT_CLKTCK = 17,     // Frequency at which times() syscall increments.
+    M5_AT_SECURE = 23,     // Whether to enable "secure mode" in executable.
+    M5_BASE_PLATFORM = 24, // Platform string (differs on PowerPC only).
+    M5_AT_RANDOM = 25,     // Pointer to 16 bytes of random data.
+    M5_AT_HWCAP2 = 26,     // Extension of AT_HWCAP.
+    M5_AT_EXECFN = 31,     // Filename of the program.
     M5_AT_VECTOR_SIZE = 44
 };