summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Process')
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp4
-rw-r--r--lldb/source/Plugins/Process/POSIX/POSIXThread.cpp12
-rw-r--r--lldb/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp33
-rw-r--r--lldb/source/Plugins/Process/POSIX/RegisterInfos_i386.h2
4 files changed, 40 insertions, 11 deletions
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
index 0591a0d5755..36795e584cf 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
@@ -168,9 +168,9 @@ PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size
errno = 0;
if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
- result = ptrace(static_cast<__ptrace_request>(req), pid, *(unsigned int *)addr, data);
+ result = ptrace(static_cast<__ptrace_request>(req), static_cast<pid_t>(pid), *(unsigned int *)addr, data);
else
- result = ptrace(static_cast<__ptrace_request>(req), pid, addr, data);
+ result = ptrace(static_cast<__ptrace_request>(req), static_cast<pid_t>(pid), addr, data);
if (log)
log->Printf("ptrace(%s, %" PRIu64 ", %p, %p, %zu)=%lX called from file %s line %d",
diff --git a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
index cc759eaad96..9c0a0016747 100644
--- a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
+++ b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
@@ -190,7 +190,17 @@ POSIXThread::GetRegisterContext()
reg_interface = new RegisterContextFreeBSD_x86_64(target_arch);
break;
case llvm::Triple::Linux:
- reg_interface = new RegisterContextLinux_x86_64(target_arch);
+ if (Host::GetArchitecture().GetAddressByteSize() == 4)
+ {
+ // 32-bit hosts run with a RegisterContextLinux_i386 context.
+ reg_interface = static_cast<RegisterInfoInterface*>(new RegisterContextLinux_i386(target_arch));
+ }
+ else
+ {
+ assert((Host::GetArchitecture().GetAddressByteSize() == 8) && "Register setting path assumes this is a 64-bit host");
+ // X86_64 hosts know how to work with 64-bit and 32-bit EXEs using the x86_64 register context.
+ reg_interface = static_cast<RegisterInfoInterface*>(new RegisterContextLinux_x86_64(target_arch));
+ }
break;
default:
assert(false && "OS not supported");
diff --git a/lldb/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp b/lldb/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp
index ef5b9e4355b..f2c1bab9f73 100644
--- a/lldb/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp
+++ b/lldb/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp
@@ -36,14 +36,30 @@ struct GPR
struct FPR_i386
{
- int32_t cwd;
- int32_t swd;
- int32_t twd;
- int32_t fip;
- int32_t fcs;
- int32_t foo;
- int32_t fos;
- int32_t st_space [20];
+ uint16_t fctrl; // FPU Control Word (fcw)
+ uint16_t fstat; // FPU Status Word (fsw)
+ uint16_t ftag; // FPU Tag Word (ftw)
+ uint16_t fop; // Last Instruction Opcode (fop)
+ union
+ {
+ struct
+ {
+ uint64_t fip; // Instruction Pointer
+ uint64_t fdp; // Data Pointer
+ } x86_64;
+ struct
+ {
+ uint32_t fioff; // FPU IP Offset (fip)
+ uint32_t fiseg; // FPU IP Selector (fcs)
+ uint32_t fooff; // FPU Operand Pointer Offset (foo)
+ uint32_t foseg; // FPU Operand Pointer Selector (fos)
+ } i386;
+ } ptr;
+ uint32_t mxcsr; // MXCSR Register State
+ uint32_t mxcsrmask; // MXCSR Mask
+ MMSReg stmm[8]; // 8*16 bytes for each FP-reg = 128 bytes
+ XMMReg xmm[8]; // 8*16 bytes for each XMM-reg = 128 bytes
+ uint32_t padding[56];
};
struct UserArea
@@ -69,6 +85,7 @@ struct UserArea
#define DR_SIZE sizeof(UserArea::u_debugreg[0])
#define DR_OFFSET(reg_index) \
(LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index]))
+#define FPR_SIZE(reg) sizeof(((FPR_i386*)NULL)->reg)
//---------------------------------------------------------------------------
// Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.
diff --git a/lldb/source/Plugins/Process/POSIX/RegisterInfos_i386.h b/lldb/source/Plugins/Process/POSIX/RegisterInfos_i386.h
index 7c516568cd6..35cbc70399c 100644
--- a/lldb/source/Plugins/Process/POSIX/RegisterInfos_i386.h
+++ b/lldb/source/Plugins/Process/POSIX/RegisterInfos_i386.h
@@ -24,7 +24,9 @@
(LLVM_EXTENSION offsetof(YMM, regname))
// Number of bytes needed to represent a FPR.
+#if !defined(FPR_SIZE)
#define FPR_SIZE(reg) sizeof(((FXSAVE*)NULL)->reg)
+#endif
// Number of bytes needed to represent the i'th FP register.
#define FP_SIZE sizeof(((MMSReg*)NULL)->bytes)
OpenPOWER on IntegriCloud