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