Page MenuHomeFreeBSD

D14995.diff
No OneTemporary

D14995.diff

Index: head/sys/amd64/amd64/machdep.c
===================================================================
--- head/sys/amd64/amd64/machdep.c
+++ head/sys/amd64/amd64/machdep.c
@@ -581,9 +581,13 @@
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: head/sys/amd64/ia32/ia32_signal.c
===================================================================
--- head/sys/amd64/ia32/ia32_signal.c
+++ head/sys/amd64/ia32/ia32_signal.c
@@ -936,9 +936,13 @@
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);
#ifdef COMPAT_43
@@ -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: head/sys/amd64/linux/linux_sysvec.c
===================================================================
--- head/sys/amd64/linux/linux_sysvec.c
+++ head/sys/amd64/linux/linux_sysvec.c
@@ -404,9 +404,13 @@
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);
@@ -416,10 +420,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: head/sys/amd64/linux32/linux32_sysvec.c
===================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c
+++ head/sys/amd64/linux32/linux32_sysvec.c
@@ -719,7 +719,11 @@
{
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);
@@ -731,10 +735,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: head/sys/i386/i386/machdep.c
===================================================================
--- head/sys/i386/i386/machdep.c
+++ head/sys/i386/i386/machdep.c
@@ -1104,9 +1104,13 @@
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;
load_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
Tue, Nov 11, 10:10 AM (2 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25154904
Default Alt Text
D14995.diff (4 KB)

Event Timeline