blob: a2de2580b8af4716593832ef880d1c930042c21b [file] [log] [blame]
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -08001#include <errno.h>
2#include <sys/ptrace.h>
Arnd Bergmann5f4c6bc2006-10-02 02:18:37 -07003#include <sys/syscall.h>
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -08004#include <asm/ldt.h>
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -08005#include "sysdep/tls.h"
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -08006#include "uml-config.h"
7
8/* TLS support - we basically rely on the host's one.*/
9
10/* In TT mode, this should be called only by the tracing thread, and makes sense
11 * only for PTRACE_SET_THREAD_AREA. In SKAS mode, it's used normally.
12 *
13 */
14
15#ifndef PTRACE_GET_THREAD_AREA
16#define PTRACE_GET_THREAD_AREA 25
17#endif
18
19#ifndef PTRACE_SET_THREAD_AREA
20#define PTRACE_SET_THREAD_AREA 26
21#endif
22
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080023int os_set_thread_area(user_desc_t *info, int pid)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080024{
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080025 int ret;
26
27 ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number,
28 (unsigned long) info);
29 if (ret < 0)
30 ret = -errno;
31 return ret;
32}
33
34#ifdef UML_CONFIG_MODE_SKAS
35
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080036int os_get_thread_area(user_desc_t *info, int pid)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080037{
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080038 int ret;
39
40 ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number,
41 (unsigned long) info);
42 if (ret < 0)
43 ret = -errno;
44 return ret;
45}
46
47#endif
48
49#ifdef UML_CONFIG_MODE_TT
50#include "linux/unistd.h"
51
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080052int do_set_thread_area_tt(user_desc_t *info)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080053{
54 int ret;
55
Arnd Bergmann5f4c6bc2006-10-02 02:18:37 -070056 ret = syscall(__NR_set_thread_area,info);
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080057 if (ret < 0) {
58 ret = -errno;
59 }
60 return ret;
61}
62
Paolo 'Blaisorblade' Giarrussodd77aec2006-03-31 02:30:23 -080063int do_get_thread_area_tt(user_desc_t *info)
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080064{
65 int ret;
66
Arnd Bergmann5f4c6bc2006-10-02 02:18:37 -070067 ret = syscall(__NR_get_thread_area,info);
Paolo 'Blaisorblade' Giarrussoaa6758d2006-03-31 02:30:22 -080068 if (ret < 0) {
69 ret = -errno;
70 }
71 return ret;
72}
73
74#endif /* UML_CONFIG_MODE_TT */