arch: Use VPtr for uname.
authorGabe Black <gabeblack@google.com>
Thu, 7 May 2020 12:32:00 +0000 (05:32 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 5 Aug 2020 23:52:25 +0000 (23:52 +0000)
Change-Id: Ia4b6c9135f16e6c68bbcf3a9c15ba7433a0a6682
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29403
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Matthew Poremba <matthew.poremba@amd.com>
src/arch/arm/linux/process.cc
src/arch/mips/linux/process.cc
src/arch/power/linux/process.cc
src/arch/riscv/linux/process.cc
src/arch/sparc/linux/syscalls.cc
src/arch/sparc/solaris/process.cc
src/arch/x86/linux/process.cc

index a78c8e2ac87171baf4ef659ac51780232634c7a9..65f1cd15e29d9fa73964e5421aeb4bc209603fbe 100644 (file)
@@ -100,10 +100,9 @@ ArmLinuxObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc32(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc32(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "m5.eecs.umich.edu");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -111,16 +110,14 @@ unameFunc32(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 SMP Sat Dec  1 00:00:00 GMT 2012");
     strcpy(name->machine, "armv7l");
 
     strcpy(name->version, "#1 SMP Sat Dec  1 00:00:00 GMT 2012");
     strcpy(name->machine, "armv7l");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
 /// Target uname() handler.
 static SyscallReturn
     return 0;
 }
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc64(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc64(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "gem5");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "gem5");
@@ -128,7 +125,6 @@ unameFunc64(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 SMP Sat Dec  1 00:00:00 GMT 2012");
     strcpy(name->machine, "armv8l");
 
     strcpy(name->version, "#1 SMP Sat Dec  1 00:00:00 GMT 2012");
     strcpy(name->machine, "armv8l");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
     return 0;
 }
 
index b8b22674a28b57331767ae48d6b7abf976f7d02e..8f1ec162140c22f34a543a266604f49f58937461 100644 (file)
@@ -77,10 +77,9 @@ MipsLinuxObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
@@ -88,7 +87,6 @@ unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "mips");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "mips");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
     return 0;
 }
 
@@ -103,10 +101,9 @@ sys_getsysinfoFunc(SyscallDesc *desc, ThreadContext *tc, unsigned op,
       case 45:
         {
             // GSI_IEEE_FP_CONTROL
       case 45:
         {
             // GSI_IEEE_FP_CONTROL
-            TypedBufferArg<uint64_t> fpcr(bufPtr);
+            VPtr<uint64_t> fpcr(bufPtr, tc);
             // I don't think this exactly matches the HW FPCR
             *fpcr = 0;
             // I don't think this exactly matches the HW FPCR
             *fpcr = 0;
-            fpcr.copyOut(tc->getVirtProxy());
             return 0;
         }
       default:
             return 0;
         }
       default:
@@ -128,11 +125,11 @@ sys_setsysinfoFunc(SyscallDesc *desc, ThreadContext *tc, unsigned op,
       case 14:
         {
             // SSI_IEEE_FP_CONTROL
       case 14:
         {
             // SSI_IEEE_FP_CONTROL
-            TypedBufferArg<uint64_t> fpcr(bufPtr);
+            ConstVPtr<uint64_t> fpcr(bufPtr, tc);
             // I don't think this exactly matches the HW FPCR
             fpcr.copyIn(tc->getVirtProxy());
             DPRINTFR(SyscallVerbose, "sys_setsysinfo(SSI_IEEE_FP_CONTROL): "
             // I don't think this exactly matches the HW FPCR
             fpcr.copyIn(tc->getVirtProxy());
             DPRINTFR(SyscallVerbose, "sys_setsysinfo(SSI_IEEE_FP_CONTROL): "
-                   " setting FPCR to 0x%x\n", letoh(*(uint64_t*)fpcr));
+                   " setting FPCR to 0x%x\n", letoh(*fpcr));
             return 0;
         }
       default:
             return 0;
         }
       default:
index d613d52c1e7b90cdd3bd858a38512ef1da537ec2..fd07947e9d8b78f4f77df74a91b4f84fb9f8f2d5 100644 (file)
@@ -76,10 +76,9 @@ PowerLinuxObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
@@ -87,7 +86,6 @@ unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "power");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "power");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
     return 0;
 }
 
index e70a07f9ffddbc75fd53a0c8b7a2db77f2c4a9a5..fa6bf01881f98d9a6e7cc3bd723fb7aead2a8256 100644 (file)
@@ -84,10 +84,9 @@ RiscvLinuxObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc64(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc64(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
@@ -95,16 +94,14 @@ unameFunc64(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "riscv64");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "riscv64");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
 /// Target uname() handler.
 static SyscallReturn
     return 0;
 }
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc32(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc32(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"sim.gem5.org");
@@ -112,7 +109,6 @@ unameFunc32(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "riscv32");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "riscv32");
 
-    name.copyOut(tc->getVirtProxy());
     return 0;
 }
 
     return 0;
 }
 
index 3eaba9162c1f47ff41ae26ef95a7a329129894bc..304f2cfdb6760c7151bbe50dd64691e786157aea 100644 (file)
@@ -37,10 +37,9 @@ namespace SparcISA {
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
@@ -48,8 +47,6 @@ unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "sparc");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "sparc");
 
-    name.copyOut(tc->getVirtProxy());
-
     return 0;
 }
 
     return 0;
 }
 
index f1a13caa7cb0940c282746cc0fbc2e73d6e75006..63f1a0fa77c73a589266859eb57819fa0c098b6c 100644 (file)
@@ -70,10 +70,9 @@ SparcSolarisObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<Solaris::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Solaris::utsname> name(utsname);
 
     strcpy(name->sysname, "SunOS");
     strcpy(name->nodename, "m5.eecs.umich.edu");
 
     strcpy(name->sysname, "SunOS");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -81,8 +80,6 @@ unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "Generic_118558-21");
     strcpy(name->machine, "sun4u");
 
     strcpy(name->version, "Generic_118558-21");
     strcpy(name->machine, "sun4u");
 
-    name.copyOut(tc->getVirtProxy());
-
     return 0;
 }
 
     return 0;
 }
 
index b0e87c0ce8669ffea21e0bb180cb65b43f4f38b2..9460a4b0682c70041e4e9ebe42a5a2bbe06023d0 100644 (file)
@@ -89,10 +89,9 @@ X86LinuxObjectFileLoader loader;
 
 /// Target uname() handler.
 static SyscallReturn
 
 /// Target uname() handler.
 static SyscallReturn
-unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
+unameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<Linux::utsname> name)
 {
     auto process = tc->getProcessPtr();
 {
     auto process = tc->getProcessPtr();
-    TypedBufferArg<Linux::utsname> name(utsname);
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "sim.gem5.org");
@@ -100,8 +99,6 @@ unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "x86_64");
 
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "x86_64");
 
-    name.copyOut(tc->getVirtProxy());
-
     return 0;
 }
 
     return 0;
 }
 
@@ -167,7 +164,8 @@ struct UserDesc64 {
 };
 
 static SyscallReturn
 };
 
 static SyscallReturn
-setThreadArea32Func(SyscallDesc *desc, ThreadContext *tc, Addr userDescPtr)
+setThreadArea32Func(SyscallDesc *desc, ThreadContext *tc,
+                    VPtr<UserDesc32> userDesc)
 {
     const int minTLSEntry = 6;
     const int numTLSEntries = 3;
 {
     const int minTLSEntry = 6;
     const int numTLSEntries = 3;
@@ -180,14 +178,10 @@ setThreadArea32Func(SyscallDesc *desc, ThreadContext *tc, Addr userDescPtr)
 
     assert((maxTLSEntry + 1) * sizeof(uint64_t) <= x86p->gdtSize());
 
 
     assert((maxTLSEntry + 1) * sizeof(uint64_t) <= x86p->gdtSize());
 
-    TypedBufferArg<UserDesc32> userDesc(userDescPtr);
     TypedBufferArg<uint64_t>
         gdt(x86p->gdtStart() + minTLSEntry * sizeof(uint64_t),
             numTLSEntries * sizeof(uint64_t));
 
     TypedBufferArg<uint64_t>
         gdt(x86p->gdtStart() + minTLSEntry * sizeof(uint64_t),
             numTLSEntries * sizeof(uint64_t));
 
-    if (!userDesc.copyIn(tc->getVirtProxy()))
-        return -EFAULT;
-
     if (!gdt.copyIn(tc->getVirtProxy()))
         panic("Failed to copy in GDT for %s.\n", desc->name());
 
     if (!gdt.copyIn(tc->getVirtProxy()))
         panic("Failed to copy in GDT for %s.\n", desc->name());
 
@@ -240,8 +234,6 @@ setThreadArea32Func(SyscallDesc *desc, ThreadContext *tc, Addr userDescPtr)
 
     gdt[index] = (uint64_t)segDesc;
 
 
     gdt[index] = (uint64_t)segDesc;
 
-    if (!userDesc.copyOut(tc->getVirtProxy()))
-        return -EFAULT;
     if (!gdt.copyOut(tc->getVirtProxy()))
         panic("Failed to copy out GDT for %s.\n", desc->name());
 
     if (!gdt.copyOut(tc->getVirtProxy()))
         panic("Failed to copy out GDT for %s.\n", desc->name());