Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150604714
D30365.id89550.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D30365.id89550.diff
View Options
Index: sys/amd64/linux/linux.h
===================================================================
--- sys/amd64/linux/linux.h
+++ sys/amd64/linux/linux.h
@@ -446,4 +446,40 @@
l_uintptr_t pending_list;
};
+/* This corresponds to 'struct user_regs_struct' in Linux. */
+struct linux_pt_regset {
+ l_ulong r15;
+ l_ulong r14;
+ l_ulong r13;
+ l_ulong r12;
+ l_ulong rbp;
+ l_ulong rbx;
+ l_ulong r11;
+ l_ulong r10;
+ l_ulong r9;
+ l_ulong r8;
+ l_ulong rax;
+ l_ulong rcx;
+ l_ulong rdx;
+ l_ulong rsi;
+ l_ulong rdi;
+ l_ulong orig_rax;
+ l_ulong rip;
+ l_ulong cs;
+ l_ulong eflags;
+ l_ulong rsp;
+ l_ulong ss;
+ l_ulong fs_base;
+ l_ulong gs_base;
+ l_ulong ds;
+ l_ulong es;
+ l_ulong fs;
+ l_ulong gs;
+};
+
+struct reg;
+
+void bsd_to_linux_regset(struct reg *b_reg,
+ struct linux_pt_regset *l_regset);
+
#endif /* !_AMD64_LINUX_H_ */
Index: sys/amd64/linux/linux_ptrace.c
===================================================================
--- sys/amd64/linux/linux_ptrace.c
+++ sys/amd64/linux/linux_ptrace.c
@@ -173,36 +173,6 @@
l_ulong ss;
};
-struct linux_pt_regset {
- l_ulong r15;
- l_ulong r14;
- l_ulong r13;
- l_ulong r12;
- l_ulong rbp;
- l_ulong rbx;
- l_ulong r11;
- l_ulong r10;
- l_ulong r9;
- l_ulong r8;
- l_ulong rax;
- l_ulong rcx;
- l_ulong rdx;
- l_ulong rsi;
- l_ulong rdi;
- l_ulong orig_rax;
- l_ulong rip;
- l_ulong cs;
- l_ulong eflags;
- l_ulong rsp;
- l_ulong ss;
- l_ulong fs_base;
- l_ulong gs_base;
- l_ulong ds;
- l_ulong es;
- l_ulong fs;
- l_ulong gs;
-};
-
/*
* Translate amd64 ptrace registers between Linux and FreeBSD formats.
* The translation is pretty straighforward, for all registers but
@@ -235,9 +205,8 @@
l_reg->ss = b_reg->r_ss;
}
-static void
-map_regs_to_linux_regset(struct reg *b_reg, unsigned long fs_base,
- unsigned long gs_base, struct linux_pt_regset *l_regset)
+void
+bsd_to_linux_regset(struct reg *b_reg, struct linux_pt_regset *l_regset)
{
l_regset->r15 = b_reg->r_r15;
@@ -261,8 +230,8 @@
l_regset->eflags = b_reg->r_rflags;
l_regset->rsp = b_reg->r_rsp;
l_regset->ss = b_reg->r_ss;
- l_regset->fs_base = fs_base;
- l_regset->gs_base = gs_base;
+ l_regset->fs_base = 0;
+ l_regset->gs_base = 0;
l_regset->ds = b_reg->r_ds;
l_regset->es = b_reg->r_es;
l_regset->fs = b_reg->r_fs;
@@ -477,7 +446,6 @@
struct linux_pt_regset l_regset;
struct iovec iov;
struct pcb *pcb;
- unsigned long fsbase, gsbase;
size_t len;
int error;
@@ -494,10 +462,10 @@
pcb = td->td_pcb;
if (td == curthread)
update_pcb_bases(pcb);
- fsbase = pcb->pcb_fsbase;
- gsbase = pcb->pcb_gsbase;
- map_regs_to_linux_regset(&b_reg, fsbase, gsbase, &l_regset);
+ bsd_to_linux_regset(&b_reg, &l_regset);
+ l_regset.fs_base = pcb->pcb_fsbase;
+ l_regset.gs_base = pcb->pcb_gsbase;
error = kern_ptrace(td, PT_LWPINFO, pid, &lwpinfo, sizeof(lwpinfo));
if (error != 0) {
Index: sys/amd64/linux32/linux.h
===================================================================
--- sys/amd64/linux32/linux.h
+++ sys/amd64/linux32/linux.h
@@ -630,4 +630,30 @@
l_uintptr_t pending_list;
};
+/* This corresponds to 'struct user_regs_struct32' in Linux. */
+struct linux_pt_regset32 {
+ l_uint ebx;
+ l_uint ecx;
+ l_uint edx;
+ l_uint esi;
+ l_uint edi;
+ l_uint ebp;
+ l_uint eax;
+ l_uint ds;
+ l_uint es;
+ l_uint fs;
+ l_uint gs;
+ l_uint orig_eax;
+ l_uint eip;
+ l_uint cs;
+ l_uint eflags;
+ l_uint esp;
+ l_uint ss;
+};
+
+struct reg32;
+
+void bsd_to_linux_regset32(struct reg32 *b_reg,
+ struct linux_pt_regset32 *l_regset);
+
#endif /* !_AMD64_LINUX_H_ */
Index: sys/amd64/linux32/linux32_machdep.c
===================================================================
--- sys/amd64/linux32/linux32_machdep.c
+++ sys/amd64/linux32/linux32_machdep.c
@@ -61,6 +61,7 @@
#include <machine/md_var.h>
#include <machine/pcb.h>
#include <machine/psl.h>
+#include <machine/reg.h>
#include <machine/segments.h>
#include <machine/specialreg.h>
#include <x86/ifunc.h>
@@ -721,6 +722,29 @@
return (0);
}
+void
+bsd_to_linux_regset32(struct reg32 *b_reg, struct linux_pt_regset32 *l_regset)
+{
+
+ l_regset->ebx = b_reg->r_ebx;
+ l_regset->ecx = b_reg->r_ecx;
+ l_regset->edx = b_reg->r_edx;
+ l_regset->esi = b_reg->r_esi;
+ l_regset->edi = b_reg->r_edi;
+ l_regset->ebp = b_reg->r_ebp;
+ l_regset->eax = b_reg->r_eax;
+ l_regset->ds = b_reg->r_ds;
+ l_regset->es = b_reg->r_es;
+ l_regset->fs = b_reg->r_fs;
+ l_regset->gs = b_reg->r_gs;
+ l_regset->orig_eax = b_reg->r_eax;
+ l_regset->eip = b_reg->r_eip;
+ l_regset->cs = b_reg->r_cs;
+ l_regset->eflags = b_reg->r_eflags;
+ l_regset->esp = b_reg->r_esp;
+ l_regset->ss = b_reg->r_ss;
+}
+
int futex_xchgl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
int futex_xchgl_smap(int oparg, uint32_t *uaddr, int *oldval);
DEFINE_IFUNC(, int, futex_xchgl, (int, uint32_t *, int *))
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 3, 6:14 PM (5 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30741601
Default Alt Text
D30365.id89550.diff (4 KB)
Attached To
Mode
D30365: linux: refactor bsd_to_linux_regset() out of linux_ptrace.c
Attached
Detach File
Event Timeline
Log In to Comment