]> granicus.if.org Git - strace/blob - ldt.c
wait: move fallback definitions of wait options to xlat/
[strace] / ldt.c
1 #include "defs.h"
2
3 #if defined I386 || defined X86_64 || defined X32
4
5 # include <asm/ldt.h>
6
7 void
8 print_user_desc(struct tcb *tcp, long addr)
9 {
10         struct user_desc desc;
11
12         if (umove(tcp, addr, &desc) < 0) {
13                 tprintf("%lx", addr);
14                 return;
15         }
16
17         if (!verbose(tcp)) {
18                 tprintf("{entry_number:%d, ...}", desc.entry_number);
19                 return;
20         }
21
22         tprintf("{entry_number:%d, "
23                 "base_addr:%#08x, "
24                 "limit:%d, "
25                 "seg_32bit:%d, "
26                 "contents:%d, "
27                 "read_exec_only:%d, "
28                 "limit_in_pages:%d, "
29                 "seg_not_present:%d, "
30                 "useable:%d}",
31                 desc.entry_number,
32                 desc.base_addr,
33                 desc.limit,
34                 desc.seg_32bit,
35                 desc.contents,
36                 desc.read_exec_only,
37                 desc.limit_in_pages,
38                 desc.seg_not_present,
39                 desc.useable);
40 }
41
42 SYS_FUNC(modify_ldt)
43 {
44         if (entering(tcp)) {
45                 tprintf("%ld, ", tcp->u_arg[0]);
46                 if (tcp->u_arg[1] == 0
47                     || tcp->u_arg[2] != sizeof(struct user_desc)) {
48                         tprintf("%lx", tcp->u_arg[1]);
49                 } else {
50                         print_user_desc(tcp, tcp->u_arg[1]);
51                 }
52                 tprintf(", %lu", tcp->u_arg[2]);
53         }
54         return 0;
55 }
56
57 SYS_FUNC(set_thread_area)
58 {
59         if (entering(tcp)) {
60                 print_user_desc(tcp, tcp->u_arg[0]);
61         } else {
62                 struct user_desc desc;
63
64                 if (syserror(tcp) || umove(tcp, tcp->u_arg[0], &desc) < 0) {
65                         /* returned entry_number is not available */
66                 } else {
67                         static char outstr[32];
68
69                         sprintf(outstr, "entry_number:%d", desc.entry_number);
70                         tcp->auxstr = outstr;
71                         return RVAL_STR;
72                 }
73         }
74         return 0;
75 }
76
77 SYS_FUNC(get_thread_area)
78 {
79         if (exiting(tcp)) {
80                 if (syserror(tcp))
81                         tprintf("%lx", tcp->u_arg[0]);
82                 else
83                         print_user_desc(tcp, tcp->u_arg[0]);
84         }
85         return 0;
86 }
87
88 #endif /* I386 || X86_64 || X32 */
89
90 #if defined(M68K) || defined(MIPS)
91 SYS_FUNC(set_thread_area)
92 {
93         if (entering(tcp))
94                 tprintf("%#lx", tcp->u_arg[0]);
95         return 0;
96
97 }
98 #endif
99
100 #if defined(M68K)
101 SYS_FUNC(get_thread_area)
102 {
103         return RVAL_HEX;
104 }
105 #endif