1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _LX_BRAND_H
  27 #define _LX_BRAND_H
  28 
  29 #ifndef _ASM
  30 #include <sys/types.h>
  31 #include <sys/cpuvar.h>
  32 #include <sys/zone.h>
  33 #endif
  34 
  35 #ifdef  __cplusplus
  36 extern "C" {
  37 #endif
  38 
  39 #define LX_BRANDNAME    "lx"
  40 
  41 /*
  42  * Brand uname info
  43  */
  44 #define LX_UNAME_SYSNAME        "Linux"
  45 #define LX_UNAME_RELEASE_2_6    "2.6.18"
  46 #define LX_UNAME_RELEASE_2_4    "2.4.21"
  47 #define LX_UNAME_VERSION        "BrandZ fake linux"
  48 #define LX_UNAME_MACHINE        "i686"
  49 
  50 #define LX_LINKER_NAME "ld-linux.so.2"
  51 #define LX_LINKER       "/lib/" LX_LINKER_NAME
  52 #define LX_LIBC_NAME    "libc.so.6"
  53 #define LIB_PATH        "/native/usr/lib/"
  54 #define LX_LIB          "lx_brand.so.1"
  55 #define LX_LIB_PATH     LIB_PATH LX_LIB
  56 
  57 #define LX_NSYSCALLS_2_4        270
  58 #define LX_NSYSCALLS_2_6        317
  59 #define LX_NSYSCALLS    LX_NSYSCALLS_2_6
  60 
  61 #define LX_KERN_2_4     0
  62 #define LX_KERN_2_6     1
  63 
  64 /*
  65  * brand(2) subcommands
  66  *
  67  * Everything >= 128 is a brand-specific subcommand.
  68  * 192 to 462 are reserved for system calls, although most of that space is
  69  * unused.
  70  */
  71 #define B_LPID_TO_SPAIR         128
  72 #define B_SYSENTRY              129
  73 #define B_SYSRETURN             130
  74 #define B_PTRACE_SYSCALL        131
  75 #define B_SET_AFFINITY_MASK     132
  76 #define B_GET_AFFINITY_MASK     133
  77 
  78 #define B_EMULATE_SYSCALL       192
  79 
  80 #define LX_VERSION_1            1
  81 #define LX_VERSION              LX_VERSION_1
  82 
  83 #define LX_ATTR_RESTART_INIT    ZONE_ATTR_BRAND_ATTRS
  84 #define LX_KERN_VERSION_NUM     (ZONE_ATTR_BRAND_ATTRS + 1)
  85 
  86 /* Aux vector containing phdr of linux executable, used by lx_librtld_db */
  87 #define AT_SUN_BRAND_LX_PHDR    AT_SUN_BRAND_AUX1
  88 
  89 /* Aux vector containing hz value */
  90 #define AT_CLKTCK       17
  91 
  92 #ifndef _ASM
  93 
  94 typedef struct lx_brand_registration {
  95         uint_t lxbr_version;            /* version number */
  96         void *lxbr_handler;             /* base address of handler */
  97         void *lxbr_tracehandler;        /* base address of trace handler */
  98         void *lxbr_traceflag;           /* address of trace flag */
  99 } lx_brand_registration_t;
 100 
 101 #ifdef  _SYSCALL32
 102 typedef struct lx_brand_registration32 {
 103         uint32_t lxbr_version;          /* version number */
 104         caddr32_t lxbr_handler;         /* base address of handler */
 105         caddr32_t lxbr_tracehandler;    /* base address of trace handler */
 106         caddr32_t lxbr_traceflag;       /* address of trace flag */
 107 } lx_brand_registration32_t;
 108 #endif
 109 
 110 typedef struct lx_regs {
 111         long lxr_gs;
 112         long lxr_edi;
 113         long lxr_esi;
 114         long lxr_ebp;
 115         long lxr_esp;
 116         long lxr_ebx;
 117         long lxr_edx;
 118         long lxr_ecx;
 119         long lxr_eax;
 120         long lxr_eip;
 121 
 122         long lxr_orig_eax;
 123 } lx_regs_t;
 124 
 125 #endif /* _ASM */
 126 
 127 /*
 128  * GDT usage
 129  */
 130 #define GDT_TLSMIN      (GDT_BRANDMIN)
 131 #define GDT_TLSMAX      (GDT_TLSMIN + 2)
 132 #define LX_TLSNUM       (GDT_TLSMAX - GDT_TLSMIN)
 133 
 134 #ifndef _ASM
 135 
 136 /*
 137  * Stores information needed by the lx linker to launch the main
 138  * lx executable.
 139  */
 140 typedef struct lx_elf_data {
 141         int     ed_phdr;
 142         int     ed_phent;
 143         int     ed_phnum;
 144         int     ed_entry;
 145         int     ed_base;
 146         int     ed_ldentry;
 147 } lx_elf_data_t;
 148 
 149 #ifdef  _KERNEL
 150 
 151 typedef struct lx_proc_data {
 152         uintptr_t l_handler;    /* address of user-space handler */
 153         uintptr_t l_tracehandler; /* address of user-space traced handler */
 154         uintptr_t l_traceflag;  /* address of 32-bit tracing flag */
 155         void (*l_sigrestorer[MAXSIG])(void); /* array of sigrestorer fns */
 156         pid_t l_ppid;           /* pid of originating parent proc */
 157         uint64_t l_ptrace;      /* process being observed with ptrace */
 158         lx_elf_data_t l_elf_data; /* ELF data for linux executable */
 159 } lx_proc_data_t;
 160 
 161 #endif  /* _KERNEL */
 162 
 163 /*
 164  * A data type big enough to bitmap all Linux possible cpus.
 165  * The bitmap size is defined as 1024 cpus in the Linux 2.4 and 2.6 man pages
 166  * for sched_getaffinity() and sched_getaffinity().
 167  */
 168 #define LX_NCPU         (1024)
 169 #define LX_AFF_ULONGS   (LX_NCPU / (8 * sizeof (ulong_t)))
 170 typedef ulong_t lx_affmask_t[LX_AFF_ULONGS];
 171 
 172 #ifdef  _KERNEL
 173 
 174 /*
 175  * lx-specific data in the klwp_t
 176  */
 177 typedef struct lx_lwp_data {
 178         uint_t  br_lwp_flags;           /* misc. flags */
 179         klwp_t  *br_lwp;                /* back pointer to container lwp */
 180         int     br_signal;              /* signal to send to parent when */
 181                                         /* clone()'ed child terminates */
 182         int     br_exitwhy;             /* reason for thread (process) exit */
 183         int     br_exitwhat;            /* exit code / killing signal */
 184         lx_affmask_t br_affinitymask;   /* bitmask of CPU sched affinities */
 185         struct user_desc br_tls[LX_TLSNUM];
 186                         /* descriptors used by libc for TLS */
 187         pid_t   br_pid;                 /* converted pid for this thread */
 188         pid_t   br_tgid;                /* thread group ID for this thread */
 189         pid_t   br_ppid;                /* parent pid for this thread */
 190         id_t    br_ptid;                /* parent tid for this thread */
 191         void    *br_clear_ctidp;        /* clone thread id ptr */
 192         void    *br_set_ctidp;          /* clone thread id ptr */
 193 
 194         /*
 195          * The following struct is used by lx_clone()
 196          * to pass info into fork()
 197          */
 198         void     *br_clone_args;
 199 
 200         uint_t  br_ptrace;              /* ptrace is active for this LWP */
 201 } lx_lwp_data_t;
 202 
 203 /* brand specific data */
 204 typedef struct lx_zone_data {
 205         int lxzd_kernel_version;
 206         int lxzd_max_syscall;
 207 } lx_zone_data_t;
 208 
 209 #define BR_CPU_BOUND    0x0001
 210 
 211 #define ttolxlwp(t)     ((struct lx_lwp_data *)ttolwpbrand(t))
 212 #define lwptolxlwp(l)   ((struct lx_lwp_data *)lwptolwpbrand(l))
 213 #define ttolxproc(t)    ((struct lx_proc_data *)(t)->t_procp->p_brand_data)
 214 
 215 void    lx_brand_int80_callback(void);
 216 int64_t lx_emulate_syscall(int, uintptr_t, uintptr_t, uintptr_t, uintptr_t,
 217         uintptr_t, uintptr_t);
 218 
 219 extern int lx_get_zone_kern_version(zone_t *);
 220 extern int lx_get_kern_version(void);
 221 
 222 extern int lx_debug;
 223 #define lx_print        if (lx_debug) printf
 224 
 225 #endif  /* _KERNEL */
 226 #endif /* _ASM */
 227 
 228 #ifdef  __cplusplus
 229 }
 230 #endif
 231 
 232 #endif  /* _LX_BRAND_H */