Page MenuHomeFreeBSD

D14995.id41225.diff
No OneTemporary

D14995.id41225.diff

Index: sys/amd64/amd64/machdep.c
===================================================================
--- sys/amd64/amd64/machdep.c
+++ sys/amd64/amd64/machdep.c
@@ -581,8 +581,12 @@
void
exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
{
- struct trapframe *regs = td->td_frame;
- struct pcb *pcb = td->td_pcb;
+ struct trapframe *regs;
+ struct pcb *pcb;
+ register_t saved_rflags;
+
+ regs = td->td_frame;
+ pcb = td->td_pcb;
if (td->td_proc->p_md.md_ldt != NULL)
user_ldt_free(td);
@@ -593,11 +597,12 @@
clear_pcb_flags(pcb, PCB_32BIT);
pcb->pcb_initial_fpucw = __INITIAL_FPUCW__;
+ saved_rflags = regs->tf_rflags & PSL_T;
bzero((char *)regs, sizeof(struct trapframe));
regs->tf_rip = imgp->entry_addr;
regs->tf_rsp = ((stack - 8) & ~0xFul) + 8;
regs->tf_rdi = stack; /* argv */
- regs->tf_rflags = PSL_USER | (regs->tf_rflags & PSL_T);
+ regs->tf_rflags = PSL_USER | saved_rflags;
regs->tf_ss = _udatasel;
regs->tf_cs = _ucodesel;
regs->tf_ds = _udatasel;
Index: sys/amd64/ia32/ia32_signal.c
===================================================================
--- sys/amd64/ia32/ia32_signal.c
+++ sys/amd64/ia32/ia32_signal.c
@@ -936,8 +936,12 @@
void
ia32_setregs(struct thread *td, struct image_params *imgp, u_long stack)
{
- struct trapframe *regs = td->td_frame;
- struct pcb *pcb = td->td_pcb;
+ struct trapframe *regs;
+ struct pcb *pcb;
+ register_t saved_rflags;
+
+ regs = td->td_frame;
+ pcb = td->td_pcb;
if (td->td_proc->p_md.md_ldt != NULL)
user_ldt_free(td);
@@ -949,10 +953,11 @@
pcb->pcb_gsbase = 0;
pcb->pcb_initial_fpucw = __INITIAL_FPUCW_I386__;
+ saved_rflags = regs->tf_rflags & PSL_T;
bzero((char *)regs, sizeof(struct trapframe));
regs->tf_rip = imgp->entry_addr;
regs->tf_rsp = stack;
- regs->tf_rflags = PSL_USER | (regs->tf_rflags & PSL_T);
+ regs->tf_rflags = PSL_USER | saved_rflags;
regs->tf_ss = _udatasel;
regs->tf_cs = _ucode32sel;
regs->tf_rbx = imgp->ps_strings;
Index: sys/amd64/linux/linux_sysvec.c
===================================================================
--- sys/amd64/linux/linux_sysvec.c
+++ sys/amd64/linux/linux_sysvec.c
@@ -411,8 +411,12 @@
static void
linux_exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
{
- struct trapframe *regs = td->td_frame;
- struct pcb *pcb = td->td_pcb;
+ struct trapframe *regs;
+ struct pcb *pcb;
+ register_t saved_rflags;
+
+ regs = td->td_frame;
+ pcb = td->td_pcb;
if (td->td_proc->p_md.md_ldt != NULL)
user_ldt_free(td);
@@ -423,10 +427,11 @@
pcb->pcb_initial_fpucw = __LINUX_NPXCW__;
set_pcb_flags(pcb, PCB_FULL_IRET);
+ saved_rflags = regs->tf_rflags & PSL_T;
bzero((char *)regs, sizeof(struct trapframe));
regs->tf_rip = imgp->entry_addr;
regs->tf_rsp = stack;
- regs->tf_rflags = PSL_USER | (regs->tf_rflags & PSL_T);
+ regs->tf_rflags = PSL_USER | saved_rflags;
regs->tf_ss = _udatasel;
regs->tf_cs = _ucodesel;
regs->tf_ds = _udatasel;
Index: sys/amd64/linux32/linux32_sysvec.c
===================================================================
--- sys/amd64/linux32/linux32_sysvec.c
+++ sys/amd64/linux32/linux32_sysvec.c
@@ -762,6 +762,10 @@
{
struct trapframe *regs = td->td_frame;
struct pcb *pcb = td->td_pcb;
+ register_t saved_rflags;
+
+ regs = td->td_frame;
+ pcb = td->td_pcb;
if (td->td_proc->p_md.md_ldt != NULL)
user_ldt_free(td);
@@ -774,10 +778,11 @@
critical_exit();
pcb->pcb_initial_fpucw = __LINUX_NPXCW__;
+ saved_rflags = regs->tf_rflags & PSL_T;
bzero((char *)regs, sizeof(struct trapframe));
regs->tf_rip = imgp->entry_addr;
regs->tf_rsp = stack;
- regs->tf_rflags = PSL_USER | (regs->tf_rflags & PSL_T);
+ regs->tf_rflags = PSL_USER | saved_rflags;
regs->tf_gs = _ugssel;
regs->tf_fs = _ufssel;
regs->tf_es = _udatasel;
Index: sys/i386/i386/machdep.c
===================================================================
--- sys/i386/i386/machdep.c
+++ sys/i386/i386/machdep.c
@@ -1104,8 +1104,12 @@
void
exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
{
- struct trapframe *regs = td->td_frame;
- struct pcb *pcb = td->td_pcb;
+ struct trapframe *regs;
+ struct pcb *pcb;
+ register_t saved_eflags;
+
+ regs = td->td_frame;
+ pcb = td->td_pcb;
/* Reset pc->pcb_gs and %gs before possibly invalidating it. */
pcb->pcb_gs = _udatasel;
@@ -1127,10 +1131,11 @@
set_gsbase(td, 0);
/* Make sure edx is 0x0 on entry. Linux binaries depend on it. */
+ saved_eflags = regs->tf_eflags & PSL_T;
bzero((char *)regs, sizeof(struct trapframe));
regs->tf_eip = imgp->entry_addr;
regs->tf_esp = stack;
- regs->tf_eflags = PSL_USER | (regs->tf_eflags & PSL_T);
+ regs->tf_eflags = PSL_USER | saved_eflags;
regs->tf_ss = _udatasel;
regs->tf_ds = _udatasel;
regs->tf_es = _udatasel;

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 16, 7:13 PM (4 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27666536
Default Alt Text
D14995.id41225.diff (4 KB)

Event Timeline