1 /* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl> 4 * Copyright (c) 1993-1996 Rick Sladkey <jrs (at) world.std.com> 5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl> 6 * Copyright (c) 2002-2004 Roland McGrath <roland (at) redhat.com> 7 * Copyright (c) 2010 Andreas Schwab <schwab (at) linux-m68k.org> 8 * Copyright (c) 2014-2015 Dmitry V. Levin <ldv (at) altlinux.org> 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "defs.h" 35 36 #if defined I386 || defined X86_64 || defined X32 37 38 # include <asm/ldt.h> 39 40 void 41 print_user_desc(struct tcb *tcp, const long addr) 42 { 43 struct user_desc desc; 44 45 if (umove_or_printaddr(tcp, addr, &desc)) 46 return; 47 48 tprintf("{entry_number:%d, " 49 "base_addr:%#08x, " 50 "limit:%d, " 51 "seg_32bit:%d, " 52 "contents:%d, " 53 "read_exec_only:%d, " 54 "limit_in_pages:%d, " 55 "seg_not_present:%d, " 56 "useable:%d}", 57 desc.entry_number, 58 desc.base_addr, 59 desc.limit, 60 desc.seg_32bit, 61 desc.contents, 62 desc.read_exec_only, 63 desc.limit_in_pages, 64 desc.seg_not_present, 65 desc.useable); 66 } 67 68 SYS_FUNC(modify_ldt) 69 { 70 tprintf("%ld, ", tcp->u_arg[0]); 71 if (tcp->u_arg[2] != sizeof(struct user_desc)) 72 printaddr(tcp->u_arg[1]); 73 else 74 print_user_desc(tcp, tcp->u_arg[1]); 75 tprintf(", %lu", tcp->u_arg[2]); 76 77 return RVAL_DECODED; 78 } 79 80 SYS_FUNC(set_thread_area) 81 { 82 if (entering(tcp)) { 83 print_user_desc(tcp, tcp->u_arg[0]); 84 } else { 85 struct user_desc desc; 86 87 if (!verbose(tcp) || syserror(tcp) || 88 umove(tcp, tcp->u_arg[0], &desc) < 0) { 89 /* returned entry_number is not available */ 90 } else { 91 static char outstr[32]; 92 93 sprintf(outstr, "entry_number:%d", desc.entry_number); 94 tcp->auxstr = outstr; 95 return RVAL_STR; 96 } 97 } 98 return 0; 99 } 100 101 SYS_FUNC(get_thread_area) 102 { 103 if (exiting(tcp)) 104 print_user_desc(tcp, tcp->u_arg[0]); 105 return 0; 106 } 107 108 #endif /* I386 || X86_64 || X32 */ 109 110 #if defined(M68K) || defined(MIPS) 111 SYS_FUNC(set_thread_area) 112 { 113 printaddr(tcp->u_arg[0]); 114 115 return RVAL_DECODED; 116 117 } 118 #endif 119 120 #if defined(M68K) 121 SYS_FUNC(get_thread_area) 122 { 123 return RVAL_DECODED | RVAL_HEX; 124 } 125 #endif 126