ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / um / kernel / skas / sys-i386 / sigcontext.c
1 /* 
2  * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3  * Licensed under the GPL
4  */
5
6 #include <errno.h>
7 #include <asm/sigcontext.h>
8 #include <sys/ptrace.h>
9 #include <linux/ptrace.h>
10 #include "sysdep/ptrace.h"
11 #include "sysdep/ptrace_user.h"
12 #include "kern_util.h"
13 #include "user.h"
14 #include "sigcontext.h"
15
16 extern int userspace_pid;
17
18 int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr)
19 {
20         struct sigcontext sc, *from = from_ptr;
21         unsigned long fpregs[FP_FRAME_SIZE];
22         int err;
23
24         err = copy_from_user_proc(&sc, from, sizeof(sc));
25         err |= copy_from_user_proc(fpregs, sc.fpstate, sizeof(fpregs));
26         if(err)
27                 return(err);
28
29         regs->skas.regs[GS] = sc.gs;
30         regs->skas.regs[FS] = sc.fs;
31         regs->skas.regs[ES] = sc.es;
32         regs->skas.regs[DS] = sc.ds;
33         regs->skas.regs[EDI] = sc.edi;
34         regs->skas.regs[ESI] = sc.esi;
35         regs->skas.regs[EBP] = sc.ebp;
36         regs->skas.regs[UESP] = sc.esp;
37         regs->skas.regs[EBX] = sc.ebx;
38         regs->skas.regs[EDX] = sc.edx;
39         regs->skas.regs[ECX] = sc.ecx;
40         regs->skas.regs[EAX] = sc.eax;
41         regs->skas.regs[EIP] = sc.eip;
42         regs->skas.regs[CS] = sc.cs;
43         regs->skas.regs[EFL] = sc.eflags;
44         regs->skas.regs[UESP] = sc.esp_at_signal;
45         regs->skas.regs[SS] = sc.ss;
46         regs->skas.fault_addr = sc.cr2;
47         regs->skas.fault_type = FAULT_WRITE(sc.err);
48         regs->skas.trap_type = sc.trapno;
49
50         err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs);
51         if(err < 0){
52                 printk("copy_sc_to_user - PTRACE_SETFPREGS failed, "
53                        "errno = %d\n", errno);
54                 return(1);
55         }
56
57         return(0);
58 }
59
60 int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs, 
61                          unsigned long fault_addr, int fault_type)
62 {
63         struct sigcontext sc, *to = to_ptr;
64         struct _fpstate *to_fp;
65         unsigned long fpregs[FP_FRAME_SIZE];
66         int err;
67
68         sc.gs = regs->skas.regs[GS];
69         sc.fs = regs->skas.regs[FS];
70         sc.es = regs->skas.regs[ES];
71         sc.ds = regs->skas.regs[DS];
72         sc.edi = regs->skas.regs[EDI];
73         sc.esi = regs->skas.regs[ESI];
74         sc.ebp = regs->skas.regs[EBP];
75         sc.esp = regs->skas.regs[UESP];
76         sc.ebx = regs->skas.regs[EBX];
77         sc.edx = regs->skas.regs[EDX];
78         sc.ecx = regs->skas.regs[ECX];
79         sc.eax = regs->skas.regs[EAX];
80         sc.eip = regs->skas.regs[EIP];
81         sc.cs = regs->skas.regs[CS];
82         sc.eflags = regs->skas.regs[EFL];
83         sc.esp_at_signal = regs->skas.regs[UESP];
84         sc.ss = regs->skas.regs[SS];
85         sc.cr2 = fault_addr;
86         sc.err = TO_SC_ERR(fault_type);
87         sc.trapno = regs->skas.trap_type;
88
89         err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs);
90         if(err < 0){
91                 printk("copy_sc_to_user - PTRACE_GETFPREGS failed, "
92                        "errno = %d\n", errno);
93                 return(1);
94         }
95         to_fp = (struct _fpstate *) 
96                 (fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));
97         sc.fpstate = to_fp;
98
99         if(err)
100                 return(err);
101
102         return(copy_to_user_proc(to, &sc, sizeof(sc)) ||
103                copy_to_user_proc(to_fp, fpregs, sizeof(fpregs)));
104 }
105
106 /*
107  * Overrides for Emacs so that we follow Linus's tabbing style.
108  * Emacs will notice this stuff at the end of the file and automatically
109  * adjust the settings for this buffer only.  This must remain at the end
110  * of the file.
111  * ---------------------------------------------------------------------------
112  * Local variables:
113  * c-file-style: "linux"
114  * End:
115  */