blob: 9cb09a45546b8828bd105729897ad431f6c509c1 [file] [log] [blame]
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -08001#include <errno.h>
2#include <sys/ptrace.h>
3#include <asm/ldt.h>
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -08004#include "sysdep/tls.h"
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -08005#include "uml-config.h"
6
7/* TLS support - we basically rely on the host's one.*/
8
9/* In TT mode, this should be called only by the tracing thread, and makes sense
10 * only for PTRACE_SET_THREAD_AREA. In SKAS mode, it's used normally.
11 *
12 */
13
14#ifndef PTRACE_GET_THREAD_AREA
15#define PTRACE_GET_THREAD_AREA 25
16#endif
17
18#ifndef PTRACE_SET_THREAD_AREA
19#define PTRACE_SET_THREAD_AREA 26
20#endif
21
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080022int os_set_thread_area(user_desc_t *info, int pid)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080023{
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080024 int ret;
25
26 ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number,
27 (unsigned long) info);
28 if (ret < 0)
29 ret = -errno;
30 return ret;
31}
32
33#ifdef UML_CONFIG_MODE_SKAS
34
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080035int os_get_thread_area(user_desc_t *info, int pid)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080036{
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080037 int ret;
38
39 ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number,
40 (unsigned long) info);
41 if (ret < 0)
42 ret = -errno;
43 return ret;
44}
45
46#endif
47
48#ifdef UML_CONFIG_MODE_TT
49#include "linux/unistd.h"
50
Paolo 'Blaisorblade' Giarrusso3feb8852006-03-31 02:30:25 -080051static _syscall1(int, get_thread_area, user_desc_t *, u_info);
52static _syscall1(int, set_thread_area, user_desc_t *, u_info);
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080053
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080054int do_set_thread_area_tt(user_desc_t *info)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080055{
56 int ret;
57
58 ret = set_thread_area(info);
59 if (ret < 0) {
60 ret = -errno;
61 }
62 return ret;
63}
64
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080065int do_get_thread_area_tt(user_desc_t *info)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080066{
67 int ret;
68
69 ret = get_thread_area(info);
70 if (ret < 0) {
71 ret = -errno;
72 }
73 return ret;
74}
75
76#endif /* UML_CONFIG_MODE_TT */