199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#include "defs.h"
299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#if defined I386 || defined X86_64 || defined X32
499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin# include <asm/ldt.h>
699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinvoid
899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinprint_user_desc(struct tcb *tcp, long addr)
999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
1099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	struct user_desc desc;
1199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
1299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (umove(tcp, addr, &desc) < 0) {
1399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		tprintf("%lx", addr);
1499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		return;
1599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	}
1699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
1799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (!verbose(tcp)) {
1899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		tprintf("{entry_number:%d, ...}", desc.entry_number);
1999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		return;
2099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	}
2199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
2299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	tprintf("{entry_number:%d, "
2399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"base_addr:%#08x, "
2499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"limit:%d, "
2599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"seg_32bit:%d, "
2699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"contents:%d, "
2799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"read_exec_only:%d, "
2899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"limit_in_pages:%d, "
2999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"seg_not_present:%d, "
3099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		"useable:%d}",
3199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.entry_number,
3299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.base_addr,
3399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.limit,
3499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.seg_32bit,
3599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.contents,
3699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.read_exec_only,
3799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.limit_in_pages,
3899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.seg_not_present,
3999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		desc.useable);
4099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
4199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
4299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinint
4399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinsys_modify_ldt(struct tcb *tcp)
4499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
4599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (entering(tcp)) {
4699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		tprintf("%ld, ", tcp->u_arg[0]);
4799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		if (tcp->u_arg[1] == 0
4899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		    || tcp->u_arg[2] != sizeof(struct user_desc)) {
4999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			tprintf("%lx", tcp->u_arg[1]);
5099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		} else {
5199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			print_user_desc(tcp, tcp->u_arg[1]);
5299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		}
5399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		tprintf(", %lu", tcp->u_arg[2]);
5499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	}
5599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	return 0;
5699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
5799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
5899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinint
5999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinsys_set_thread_area(struct tcb *tcp)
6099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
6199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (entering(tcp)) {
6299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		print_user_desc(tcp, tcp->u_arg[0]);
6399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	} else {
6499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		struct user_desc desc;
6599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
6699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		if (syserror(tcp) || umove(tcp, tcp->u_arg[0], &desc) < 0) {
6799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			/* returned entry_number is not available */
6899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		} else {
6999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			static char outstr[32];
7099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
7199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			sprintf(outstr, "entry_number:%d", desc.entry_number);
7299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			tcp->auxstr = outstr;
7399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			return RVAL_STR;
7499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		}
7599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	}
7699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	return 0;
7799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
7899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
7999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinint
8099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinsys_get_thread_area(struct tcb *tcp)
8199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
8299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (exiting(tcp)) {
8399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		if (syserror(tcp))
8499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			tprintf("%lx", tcp->u_arg[0]);
8599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		else
8699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin			print_user_desc(tcp, tcp->u_arg[0]);
8799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	}
8899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	return 0;
8999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
9099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
9199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#endif /* I386 || X86_64 || X32 */
9299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
9399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#if defined(M68K) || defined(MIPS)
9499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinint
9599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinsys_set_thread_area(struct tcb *tcp)
9699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
9799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	if (entering(tcp))
9899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin		tprintf("%#lx", tcp->u_arg[0]);
9999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	return 0;
10099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
10199a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
10299a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#endif
10399a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin
10499a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#if defined(M68K)
10599a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinint
10699a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levinsys_get_thread_area(struct tcb *tcp)
10799a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin{
10899a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin	return RVAL_HEX;
10999a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin}
11099a0544f010cfaade3f42d08656285555bec60dbDmitry V. Levin#endif
111