Path: blob/master/arch/um/os-Linux/sys-i386/registers.c
17613 views
/*1* Copyright (C) 2004 PathScale, Inc2* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)3* Licensed under the GPL4*/56#include <errno.h>7#include <sys/ptrace.h>8#include <sys/user.h>9#include "kern_constants.h"10#include "longjmp.h"11#include "user.h"12#include "sysdep/ptrace_user.h"1314int save_fp_registers(int pid, unsigned long *fp_regs)15{16if (ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0)17return -errno;18return 0;19}2021int restore_fp_registers(int pid, unsigned long *fp_regs)22{23if (ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0)24return -errno;25return 0;26}2728int save_fpx_registers(int pid, unsigned long *fp_regs)29{30if (ptrace(PTRACE_GETFPXREGS, pid, 0, fp_regs) < 0)31return -errno;32return 0;33}3435int restore_fpx_registers(int pid, unsigned long *fp_regs)36{37if (ptrace(PTRACE_SETFPXREGS, pid, 0, fp_regs) < 0)38return -errno;39return 0;40}4142unsigned long get_thread_reg(int reg, jmp_buf *buf)43{44switch (reg) {45case EIP:46return buf[0]->__eip;47case UESP:48return buf[0]->__esp;49case EBP:50return buf[0]->__ebp;51default:52printk(UM_KERN_ERR "get_thread_regs - unknown register %d\n",53reg);54return 0;55}56}5758int have_fpx_regs = 1;5960int get_fp_registers(int pid, unsigned long *regs)61{62if (have_fpx_regs)63return save_fpx_registers(pid, regs);64else65return save_fp_registers(pid, regs);66}6768int put_fp_registers(int pid, unsigned long *regs)69{70if (have_fpx_regs)71return restore_fpx_registers(pid, regs);72else73return restore_fp_registers(pid, regs);74}7576void arch_init_registers(int pid)77{78struct user_fpxregs_struct fpx_regs;79int err;8081err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs);82if (!err)83return;8485if (errno != EIO)86panic("check_ptrace : PTRACE_GETFPXREGS failed, errno = %d",87errno);8889have_fpx_regs = 0;90}919293