1/* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> 4 * Copyright (c) 1993-1996 Rick Sladkey <jrs@world.std.com> 5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl> 6 * Copyright (c) 2002-2004 Roland McGrath <roland@redhat.com> 7 * Copyright (c) 2010 Andreas Schwab <schwab@linux-m68k.org> 8 * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@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#ifdef HAVE_STRUCT_USER_DESC 37 38# include <asm/ldt.h> 39 40void 41print_user_desc(struct tcb *const tcp, const kernel_ulong_t 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 68SYS_FUNC(modify_ldt) 69{ 70 tprintf("%" PRI_kld ", ", 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(", %" PRI_klu, tcp->u_arg[2]); 76 77 return RVAL_DECODED; 78} 79 80SYS_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 101SYS_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 /* HAVE_STRUCT_USER_DESC */ 109 110#if defined(M68K) || defined(MIPS) 111SYS_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) 121SYS_FUNC(get_thread_area) 122{ 123 return RVAL_DECODED | RVAL_HEX; 124} 125#endif 126