diff options
author | Dam Sunwoo <dam.sunwoo@arm.com> | 2012-11-02 11:32:00 -0500 |
---|---|---|
committer | Dam Sunwoo <dam.sunwoo@arm.com> | 2012-11-02 11:32:00 -0500 |
commit | ac161c1d7294fc755b6c06e23f719f577d926695 (patch) | |
tree | 356f6fca7b368a34e68687ac02bef6f543207022 /src | |
parent | d0678d1c31bbb0c08e58762a36d5d2382b0a537f (diff) | |
download | gem5-ac161c1d7294fc755b6c06e23f719f577d926695.tar.xz |
ISA: generic Linux thread info support
This patch takes the Linux thread info support scattered across
different ISA implementations (currently in ARM, ALPHA, and MIPS), and
unifies them into a single file.
Adds a few more helper functions to read out TGID, mm, etc.
ISA-specific information (e.g., ALPHA PCBB register) is now moved to
the corresponding isa_traits.hh files.
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/alpha/isa_traits.hh | 4 | ||||
-rw-r--r-- | src/arch/alpha/kernel_stats.cc | 2 | ||||
-rw-r--r-- | src/arch/alpha/linux/system.cc | 2 | ||||
-rw-r--r-- | src/arch/arm/isa_traits.hh | 3 | ||||
-rw-r--r-- | src/arch/generic/linux/threadinfo.hh (renamed from src/arch/alpha/linux/threadinfo.hh) | 46 | ||||
-rw-r--r-- | src/arch/mips/isa_traits.hh | 3 | ||||
-rw-r--r-- | src/arch/mips/linux/system.cc | 2 | ||||
-rw-r--r-- | src/arch/mips/linux/threadinfo.hh | 153 | ||||
-rw-r--r-- | src/arch/power/isa_traits.hh | 3 | ||||
-rw-r--r-- | src/arch/sparc/isa_traits.hh | 4 | ||||
-rw-r--r-- | src/arch/x86/isa_traits.hh | 3 |
11 files changed, 63 insertions, 162 deletions
diff --git a/src/arch/alpha/isa_traits.hh b/src/arch/alpha/isa_traits.hh index 5738ccdb1..41b63ec5a 100644 --- a/src/arch/alpha/isa_traits.hh +++ b/src/arch/alpha/isa_traits.hh @@ -34,6 +34,7 @@ namespace LittleEndianGuest {} +#include "arch/alpha/ipr.hh" #include "arch/alpha/types.hh" #include "base/types.hh" #include "cpu/static_inst_fwd.hh" @@ -129,6 +130,9 @@ const ExtMachInst NoopMachInst = 0x2ffe0000; // Memory accesses cannot be unaligned const bool HasUnalignedMemAcc = false; +const bool CurThreadInfoImplemented = true; +const int CurThreadInfoReg = AlphaISA::IPR_PALtemp23; + } // namespace AlphaISA #endif // __ARCH_ALPHA_ISA_TRAITS_HH__ diff --git a/src/arch/alpha/kernel_stats.cc b/src/arch/alpha/kernel_stats.cc index c057e7f16..bac5d26cd 100644 --- a/src/arch/alpha/kernel_stats.cc +++ b/src/arch/alpha/kernel_stats.cc @@ -33,7 +33,7 @@ #include <stack> #include <string> -#include "arch/alpha/linux/threadinfo.hh" +#include "arch/generic/linux/threadinfo.hh" #include "arch/alpha/kernel_stats.hh" #include "arch/alpha/osfpal.hh" #include "base/trace.hh" diff --git a/src/arch/alpha/linux/system.cc b/src/arch/alpha/linux/system.cc index db3c16d7e..0507af029 100644 --- a/src/arch/alpha/linux/system.cc +++ b/src/arch/alpha/linux/system.cc @@ -41,9 +41,9 @@ */ #include "arch/alpha/linux/system.hh" -#include "arch/alpha/linux/threadinfo.hh" #include "arch/alpha/idle_event.hh" #include "arch/alpha/system.hh" +#include "arch/generic/linux/threadinfo.hh" #include "arch/vtophys.hh" #include "base/loader/symtab.hh" #include "cpu/base.hh" diff --git a/src/arch/arm/isa_traits.hh b/src/arch/arm/isa_traits.hh index 43b3674d4..742ca2037 100644 --- a/src/arch/arm/isa_traits.hh +++ b/src/arch/arm/isa_traits.hh @@ -114,6 +114,9 @@ namespace ArmISA // Memory accesses cannot be unaligned const bool HasUnalignedMemAcc = true; + const bool CurThreadInfoImplemented = false; + const int CurThreadInfoReg = -1; + enum InterruptTypes { INT_RST, diff --git a/src/arch/alpha/linux/threadinfo.hh b/src/arch/generic/linux/threadinfo.hh index 94e362fe7..6a5d031fa 100644 --- a/src/arch/alpha/linux/threadinfo.hh +++ b/src/arch/generic/linux/threadinfo.hh @@ -27,10 +27,11 @@ * * Authors: Ali Saidi * Nathan Binkert + * Dam Sunwoo */ -#ifndef __ARCH_ALPHA_LINUX_LINUX_TREADNIFO_HH__ -#define __ARCH_ALPHA_LINUX_LINUX_TREADNIFO_HH__ +#ifndef __ARCH_GENERIC_LINUX_THREADINFO_HH__ +#define __ARCH_GENERIC_LINUX_THREADINFO_HH__ #include "cpu/thread_context.hh" #include "sim/system.hh" @@ -50,12 +51,16 @@ class ThreadInfo get_data(const char *symbol, T &data) { Addr addr = 0; - if (!sys->kernelSymtab->findAddress(symbol, addr)) + if (!sys->kernelSymtab->findAddress(symbol, addr)) { + warn_once("Unable to find kernel symbol %s\n", symbol); + warn_once("Kernel not compiled with task_struct info; can't get " + "currently executing task/process/thread name/ids!\n"); return false; + } CopyOut(tc, &data, addr, sizeof(T)); - data = AlphaISA::gtoh(data); + data = TheISA::gtoh(data); return true; } @@ -72,11 +77,14 @@ class ThreadInfo inline Addr curThreadInfo() { + if (!TheISA::CurThreadInfoImplemented) + panic("curThreadInfo() not implemented for this ISA"); + Addr addr = pcbb; Addr sp; if (!addr) - addr = tc->readMiscRegNoEffect(AlphaISA::IPR_PALtemp23); + addr = tc->readMiscRegNoEffect(TheISA::CurThreadInfoReg); PortProxy &p = tc->getPhysProxy(); p.readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); @@ -113,6 +121,19 @@ class ThreadInfo return pid; } + int32_t + curTaskTGID(Addr thread_info = 0) + { + int32_t offset; + if (!get_data("task_struct_tgid", offset)) + return -1; + + int32_t tgid; + CopyOut(tc, &tgid, curTaskInfo(thread_info) + offset, sizeof(tgid)); + + return tgid; + } + int64_t curTaskStart(Addr thread_info = 0) { @@ -145,8 +166,21 @@ class ThreadInfo return buffer; } + + int32_t + curTaskMm(Addr thread_info = 0) + { + int32_t offset; + if (!get_data("task_struct_mm", offset)) + return -1; + + int32_t mm_ptr; + CopyOut(tc, &mm_ptr, curTaskInfo(thread_info) + offset, sizeof(mm_ptr)); + + return mm_ptr; + } }; } // namespace Linux -#endif // __ARCH_ALPHA_LINUX_LINUX_THREADINFO_HH__ +#endif // __ARCH_GENERIC_LINUX_THREADINFO_HH__ diff --git a/src/arch/mips/isa_traits.hh b/src/arch/mips/isa_traits.hh index f2a748da9..af99461c9 100644 --- a/src/arch/mips/isa_traits.hh +++ b/src/arch/mips/isa_traits.hh @@ -160,6 +160,9 @@ const uint32_t ITOUCH_ANNOTE = 0xffffffff; const bool HasUnalignedMemAcc = true; +const bool CurThreadInfoImplemented = false; +const int CurThreadInfoReg = -1; + } // namespace MipsISA #endif // __ARCH_MIPS_ISA_TRAITS_HH__ diff --git a/src/arch/mips/linux/system.cc b/src/arch/mips/linux/system.cc index f97426f85..dc2ac7da5 100644 --- a/src/arch/mips/linux/system.cc +++ b/src/arch/mips/linux/system.cc @@ -39,8 +39,8 @@ * up boot time. */ +#include "arch/generic/linux/threadinfo.hh" #include "arch/mips/linux/system.hh" -#include "arch/mips/linux/threadinfo.hh" #include "arch/mips/idle_event.hh" #include "arch/mips/system.hh" #include "arch/vtophys.hh" diff --git a/src/arch/mips/linux/threadinfo.hh b/src/arch/mips/linux/threadinfo.hh deleted file mode 100644 index 5788b3b43..000000000 --- a/src/arch/mips/linux/threadinfo.hh +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2004 The Regents of The University of Michigan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Ali Saidi - * Nathan Binkert - */ - -#ifndef __ARCH_MIPS_LINUX_LINUX_TREADNIFO_HH__ -#define __ARCH_MIPS_LINUX_LINUX_TREADNIFO_HH__ - -#include "cpu/thread_context.hh" -#include "sim/system.hh" -#include "sim/vptr.hh" - -namespace Linux { - -class ThreadInfo -{ - private: - ThreadContext *tc; - System *sys; - Addr pcbb; - - template <typename T> - bool - get_data(const char *symbol, T &data) - { - Addr addr = 0; - if (!sys->kernelSymtab->findAddress(symbol, addr)) - return false; - - CopyOut(tc, &data, addr, sizeof(T)); - - data = MipsISA::gtoh(data); - - return true; - } - - public: - ThreadInfo(ThreadContext *_tc, Addr _pcbb = 0) - : tc(_tc), sys(tc->getSystemPtr()), pcbb(_pcbb) - { - - } - ~ThreadInfo() - {} - - inline Addr - curThreadInfo() - { - panic("curThreadInfo not implemented for MIPS"); - Addr addr = pcbb; - Addr sp; - - if (!addr) - addr = tc->readMiscRegNoEffect(0/*MipsISA::IPR_PALtemp23*/); - - PortProxy &p = tc->getPhysProxy(); - p.readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); - - return sp & ~ULL(0x3fff); - } - - inline Addr - curTaskInfo(Addr thread_info = 0) - { - int32_t offset; - if (!get_data("thread_info_task", offset)) - return 0; - - if (!thread_info) - thread_info = curThreadInfo(); - - Addr addr; - CopyOut(tc, &addr, thread_info + offset, sizeof(addr)); - - return addr; - } - - int32_t - curTaskPID(Addr thread_info = 0) - { - Addr offset; - if (!get_data("task_struct_pid", offset)) - return -1; - - int32_t pid; - CopyOut(tc, &pid, curTaskInfo(thread_info) + offset, sizeof(pid)); - - return pid; - } - - int64_t - curTaskStart(Addr thread_info = 0) - { - Addr offset; - if (!get_data("task_struct_start_time", offset)) - return -1; - - int64_t data; - // start_time is actually of type timespec, but if we just - // grab the first long, we'll get the seconds out of it - CopyOut(tc, &data, curTaskInfo(thread_info) + offset, sizeof(data)); - - return data; - } - - std::string - curTaskName(Addr thread_info = 0) - { - int32_t offset; - int32_t size; - - if (!get_data("task_struct_comm", offset)) - return "FailureIn_curTaskName"; - - if (!get_data("task_struct_comm_size", size)) - return "FailureIn_curTaskName"; - - char buffer[size + 1]; - CopyStringOut(tc, buffer, curTaskInfo(thread_info) + offset, size); - - return buffer; - } -}; - -} // namespace Linux - -#endif // __ARCH_MIPS_LINUX_LINUX_THREADINFO_HH__ diff --git a/src/arch/power/isa_traits.hh b/src/arch/power/isa_traits.hh index 3db4ab5aa..393073bf7 100644 --- a/src/arch/power/isa_traits.hh +++ b/src/arch/power/isa_traits.hh @@ -72,6 +72,9 @@ const ExtMachInst NoopMachInst = 0x60000000; // Memory accesses can be unaligned const bool HasUnalignedMemAcc = true; +const bool CurThreadInfoImplemented = false; +const int CurThreadInfoReg = -1; + } // namespace PowerISA #endif // __ARCH_POWER_ISA_TRAITS_HH__ diff --git a/src/arch/sparc/isa_traits.hh b/src/arch/sparc/isa_traits.hh index 9b02a4d80..22d49b12e 100644 --- a/src/arch/sparc/isa_traits.hh +++ b/src/arch/sparc/isa_traits.hh @@ -91,6 +91,10 @@ enum InterruptTypes // Memory accesses cannot be unaligned const bool HasUnalignedMemAcc = false; + +const bool CurThreadInfoImplemented = false; +const int CurThreadInfoReg = -1; + } #endif // __ARCH_SPARC_ISA_TRAITS_HH__ diff --git a/src/arch/x86/isa_traits.hh b/src/arch/x86/isa_traits.hh index 383e56eee..27f20e9b2 100644 --- a/src/arch/x86/isa_traits.hh +++ b/src/arch/x86/isa_traits.hh @@ -71,6 +71,9 @@ namespace X86ISA // Memory accesses can be unaligned const bool HasUnalignedMemAcc = true; + const bool CurThreadInfoImplemented = false; + const int CurThreadInfoReg = -1; + const ExtMachInst NoopMachInst = { 0x0, // No legacy prefixes. 0x0, // No rex prefix. |