diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2011-08-18 15:05:19 -0400 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2011-11-02 09:14:59 -0400 |
commit | ab1c0cc7c96c17ea903ca6d3e42e7d2696b32b6c (patch) | |
tree | 9a72e06cab7b6dd293b16048d2928695c935ea46 /arch/um/os-Linux | |
parent | 248b74c79ebb9fb55e146797a808836d90418c4b (diff) |
um: finish conversion to mcontext_t
now we don't mix host and guest signal frame layouts anymore; moreover,
we don't need host's struct sigcontext at all.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r-- | arch/um/os-Linux/signal.c | 6 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-x86/Makefile | 2 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-x86/mcontext.c | 31 |
3 files changed, 35 insertions, 4 deletions
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 07d9905e44e..9f2c2228f7a 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include "os.h" | 14 | #include "os.h" |
15 | #include "process.h" | 15 | #include "process.h" |
16 | #include "sysdep/barrier.h" | 16 | #include "sysdep/barrier.h" |
17 | #include "sysdep/sigcontext.h" | 17 | #include "sysdep/mcontext.h" |
18 | 18 | ||
19 | void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { | 19 | void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { |
20 | [SIGTRAP] = relay_signal, | 20 | [SIGTRAP] = relay_signal, |
@@ -34,7 +34,7 @@ static void sig_handler_common(int sig, mcontext_t *mc) | |||
34 | r.is_user = 0; | 34 | r.is_user = 0; |
35 | if (sig == SIGSEGV) { | 35 | if (sig == SIGSEGV) { |
36 | /* For segfaults, we want the data from the sigcontext. */ | 36 | /* For segfaults, we want the data from the sigcontext. */ |
37 | copy_sc(&r, (struct sigcontext *)mc); | 37 | get_regs_from_mc(&r, mc); |
38 | GET_FAULTINFO_FROM_MC(r.faultinfo, mc); | 38 | GET_FAULTINFO_FROM_MC(r.faultinfo, mc); |
39 | } | 39 | } |
40 | 40 | ||
@@ -84,7 +84,7 @@ static void real_alarm_handler(mcontext_t *mc) | |||
84 | struct uml_pt_regs regs; | 84 | struct uml_pt_regs regs; |
85 | 85 | ||
86 | if (mc != NULL) | 86 | if (mc != NULL) |
87 | copy_sc(®s, (struct sigcontext *)mc); | 87 | get_regs_from_mc(®s, mc); |
88 | regs.is_user = 0; | 88 | regs.is_user = 0; |
89 | unblock_signals(); | 89 | unblock_signals(); |
90 | timer_handler(SIGVTALRM, ®s); | 90 | timer_handler(SIGVTALRM, ®s); |
diff --git a/arch/um/os-Linux/sys-x86/Makefile b/arch/um/os-Linux/sys-x86/Makefile index 22cc5073c02..253bfb8cb70 100644 --- a/arch/um/os-Linux/sys-x86/Makefile +++ b/arch/um/os-Linux/sys-x86/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # Licensed under the GPL | 3 | # Licensed under the GPL |
4 | # | 4 | # |
5 | 5 | ||
6 | obj-y = registers.o task_size.o | 6 | obj-y = registers.o task_size.o mcontext.o |
7 | 7 | ||
8 | obj-$(CONFIG_X86_32) += tls.o | 8 | obj-$(CONFIG_X86_32) += tls.o |
9 | obj-$(CONFIG_64BIT) += prctl.o | 9 | obj-$(CONFIG_64BIT) += prctl.o |
diff --git a/arch/um/os-Linux/sys-x86/mcontext.c b/arch/um/os-Linux/sys-x86/mcontext.c new file mode 100644 index 00000000000..1d33d72c628 --- /dev/null +++ b/arch/um/os-Linux/sys-x86/mcontext.c | |||
@@ -0,0 +1,31 @@ | |||
1 | #include <sys/ucontext.h> | ||
2 | #define __FRAME_OFFSETS | ||
3 | #include <asm/ptrace.h> | ||
4 | #include <sysdep/ptrace.h> | ||
5 | |||
6 | void get_regs_from_mc(struct uml_pt_regs *regs, mcontext_t *mc) | ||
7 | { | ||
8 | #ifdef __i386__ | ||
9 | #define COPY2(X,Y) regs->gp[X] = mc->gregs[REG_##Y] | ||
10 | #define COPY(X) regs->gp[X] = mc->gregs[REG_##X] | ||
11 | #define COPY_SEG(X) regs->gp[X] = mc->gregs[REG_##X] & 0xffff; | ||
12 | #define COPY_SEG_CPL3(X) regs->gp[X] = (mc->gregs[REG_##X] & 0xffff) | 3; | ||
13 | COPY_SEG(GS); COPY_SEG(FS); COPY_SEG(ES); COPY_SEG(DS); | ||
14 | COPY(EDI); COPY(ESI); COPY(EBP); | ||
15 | COPY2(UESP, ESP); /* sic */ | ||
16 | COPY(EBX); COPY(EDX); COPY(ECX); COPY(EAX); | ||
17 | COPY(EIP); COPY_SEG_CPL3(CS); COPY(EFL); COPY_SEG_CPL3(SS); | ||
18 | #else | ||
19 | #define COPY2(X,Y) regs->gp[X/sizeof(unsigned long)] = mc->gregs[REG_##Y] | ||
20 | #define COPY(X) regs->gp[X/sizeof(unsigned long)] = mc->gregs[REG_##X] | ||
21 | COPY(R8); COPY(R9); COPY(R10); COPY(R11); | ||
22 | COPY(R12); COPY(R13); COPY(R14); COPY(R15); | ||
23 | COPY(RDI); COPY(RSI); COPY(RBP); COPY(RBX); | ||
24 | COPY(RDX); COPY(RAX); COPY(RCX); COPY(RSP); | ||
25 | COPY(RIP); | ||
26 | COPY2(EFLAGS, EFL); | ||
27 | COPY2(CS, CSGSFS); | ||
28 | regs->gp[CS / sizeof(unsigned long)] &= 0xffff; | ||
29 | regs->gp[CS / sizeof(unsigned long)] |= 3; | ||
30 | #endif | ||
31 | } | ||