42daba3165
Throw out a lot of code dealing with saving and restoring floating-point state. In skas mode, where processes run in a restoring floating-point state on kernel entry and exit is pointless. This eliminates most of arch/um/os-Linux/sys-{i386,x86_64}/registers.c. Most of what remained is now arch-indpendent, and can be moved up to arch/um/os-Linux/registers.c. Both arches need the jmp_buf accessor get_thread_reg, and i386 needs {save,restore}_fp_regs because it cheats during sigreturn by getting the fp state using ptrace rather than copying it out of the process sigcontext. After this, it turns out that arch/um/include/skas/mode-skas.h is almost completely unneeded. The declarations in it are variables which either don't exist or which don't have global scope. The one exception is kill_off_processes_skas. If that's removed, this header can be deleted. This uncovered a bug in user.h, which wasn't correctly making sure that a size_t definition was available to both userspace and kernelspace files. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
38 lines
819 B
C
38 lines
819 B
C
/*
|
|
* Copyright (C) 2004 PathScale, Inc
|
|
* Licensed under the GPL
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <sysdep/ptrace_user.h>
|
|
#include "longjmp.h"
|
|
#include "user.h"
|
|
|
|
/* XXX These need to use [GS]ETFPXREGS and copy_sc_{to,from}_user_skas needs
|
|
* to pass in a sufficiently large buffer
|
|
*/
|
|
int save_fp_registers(int pid, unsigned long *fp_regs)
|
|
{
|
|
if(ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0)
|
|
return -errno;
|
|
return 0;
|
|
}
|
|
|
|
int restore_fp_registers(int pid, unsigned long *fp_regs)
|
|
{
|
|
if(ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0)
|
|
return -errno;
|
|
return 0;
|
|
}
|
|
|
|
unsigned long get_thread_reg(int reg, jmp_buf *buf)
|
|
{
|
|
switch(reg){
|
|
case EIP: return buf[0]->__eip;
|
|
case UESP: return buf[0]->__esp;
|
|
case EBP: return buf[0]->__ebp;
|
|
default:
|
|
printk("get_thread_regs - unknown register %d\n", reg);
|
|
return 0;
|
|
}
|
|
}
|