Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 86225
b: refs/heads/master
c: 2f56deb
h: refs/heads/master
i:
  86223: e063001
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Feb 24, 2008
1 parent 9973dfa commit a2a014c
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e4d06b3f904ddfab4531a1e23f1f5e1bd284b605
refs/heads/master: 2f56debd77a8f52f1ac1d3c3d89cc7ce5e083230
2 changes: 2 additions & 0 deletions trunk/arch/um/include/registers.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@ extern int restore_registers(int pid, struct uml_pt_regs *regs);
extern int init_registers(int pid);
extern void get_safe_registers(unsigned long *regs);
extern unsigned long get_thread_reg(int reg, jmp_buf *buf);
extern int get_fp_registers(int pid, unsigned long *regs);
extern int put_fp_registers(int pid, unsigned long *regs);

#endif
3 changes: 3 additions & 0 deletions trunk/arch/um/include/sysdep-i386/ptrace_user.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <sys/ptrace.h>
#include <linux/ptrace.h>
#include <asm/ptrace.h>
#include "user_constants.h"

#define PT_OFFSET(r) ((r) * sizeof(long))

Expand Down Expand Up @@ -40,6 +41,8 @@
#define PT_SP_OFFSET PT_OFFSET(UESP)
#define PT_SP(regs) ((regs)[UESP])

#define FP_SIZE ((HOST_XFP_SIZE > HOST_FP_SIZE) ? HOST_XFP_SIZE : HOST_FP_SIZE)

#ifndef FRAME_SIZE
#define FRAME_SIZE (17)
#endif
Expand Down
3 changes: 3 additions & 0 deletions trunk/arch/um/include/sysdep-x86_64/ptrace_user.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <linux/ptrace.h>
#include <asm/ptrace.h>
#undef __FRAME_OFFSETS
#include "user_constants.h"

#define PT_INDEX(off) ((off) / sizeof(unsigned long))

Expand Down Expand Up @@ -69,6 +70,8 @@
#define REGS_IP_INDEX PT_INDEX(RIP)
#define REGS_SP_INDEX PT_INDEX(RSP)

#define FP_SIZE (HOST_FP_SIZE)

#endif

/*
Expand Down
15 changes: 15 additions & 0 deletions trunk/arch/um/os-Linux/skas/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi)
sizeof(struct ptrace_faultinfo));
}
else {
unsigned long fpregs[FP_SIZE];

err = get_fp_registers(pid, fpregs);
if (err < 0) {
printk(UM_KERN_ERR "save_fp_registers returned %d\n",
err);
fatal_sigsegv();
}
err = ptrace(PTRACE_CONT, pid, 0, SIGSEGV);
if (err) {
printk(UM_KERN_ERR "Failed to continue stub, pid = %d, "
Expand All @@ -128,6 +136,13 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi)
* the stub stack page. We just have to copy it.
*/
memcpy(fi, (void *)current_stub_stack(), sizeof(*fi));

err = put_fp_registers(pid, fpregs);
if (err < 0) {
printk(UM_KERN_ERR "put_fp_registers returned %d\n",
err);
fatal_sigsegv();
}
}
}

Expand Down
16 changes: 16 additions & 0 deletions trunk/arch/um/os-Linux/sys-i386/registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,22 @@ unsigned long get_thread_reg(int reg, jmp_buf *buf)

int have_fpx_regs = 1;

int get_fp_registers(int pid, unsigned long *regs)
{
if (have_fpx_regs)
return save_fpx_registers(pid, regs);
else
return save_fp_registers(pid, regs);
}

int put_fp_registers(int pid, unsigned long *regs)
{
if (have_fpx_regs)
return restore_fpx_registers(pid, regs);
else
return restore_fp_registers(pid, regs);
}

void arch_init_registers(int pid)
{
unsigned long fpx_regs[HOST_XFP_SIZE];
Expand Down
10 changes: 10 additions & 0 deletions trunk/arch/um/os-Linux/sys-x86_64/registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,13 @@ unsigned long get_thread_reg(int reg, jmp_buf *buf)
return 0;
}
}

int get_fp_registers(int pid, unsigned long *regs)
{
return save_fp_registers(pid, regs);
}

int put_fp_registers(int pid, unsigned long *regs)
{
return restore_fp_registers(pid, regs);
}

0 comments on commit a2a014c

Please sign in to comment.