Print this page
    
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/brand/sn1/sn1_brand.c
          +++ new/usr/src/uts/common/brand/sn1/sn1_brand.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   * Copyright 2016 Joyent, Inc.
  25   25   */
  26   26  
  27   27  #include <sys/errno.h>
  28   28  #include <sys/exec.h>
  29   29  #include <sys/kmem.h>
  30   30  #include <sys/modctl.h>
  31   31  #include <sys/model.h>
  32   32  #include <sys/proc.h>
  33   33  #include <sys/syscall.h>
  34   34  #include <sys/systm.h>
  35   35  #include <sys/thread.h>
  36   36  #include <sys/cmn_err.h>
  37   37  #include <sys/archsystm.h>
  38   38  #include <sys/pathname.h>
  39   39  
  40   40  #include <sys/machbrand.h>
  41   41  #include <sys/brand.h>
  42   42  #include "sn1_brand.h"
  43   43  
  44   44  char *sn1_emulation_table = NULL;
  45   45  
  46   46  void    sn1_init_brand_data(zone_t *, kmutex_t *);
  47   47  void    sn1_free_brand_data(zone_t *);
  48   48  void    sn1_setbrand(proc_t *);
  49   49  int     sn1_getattr(zone_t *, int, void *, size_t *);
  50   50  int     sn1_setattr(zone_t *, int, void *, size_t);
  51   51  int     sn1_brandsys(int, int64_t *, uintptr_t, uintptr_t, uintptr_t,
  52   52                  uintptr_t);
  53   53  void    sn1_copy_procdata(proc_t *, proc_t *);
  54   54  void    sn1_proc_exit(struct proc *);
  55   55  void    sn1_exec();
  56   56  void    sn1_initlwp(klwp_t *, void *);
  57   57  void    sn1_forklwp(klwp_t *, klwp_t *);
  58   58  void    sn1_freelwp(klwp_t *);
  59   59  void    sn1_lwpexit(klwp_t *);
  60   60  int     sn1_elfexec(vnode_t *, execa_t *, uarg_t *, intpdata_t *, int,
  61   61          long *, int, caddr_t, cred_t *, int *);
  62   62  
  63   63  /* sn1 brand */
  64   64  struct brand_ops sn1_brops = {
  65   65          sn1_init_brand_data,            /* b_init_brand_data */
  66   66          sn1_free_brand_data,            /* b_free_brand_data */
  67   67          sn1_brandsys,                   /* b_brandsys */
  68   68          sn1_setbrand,                   /* b_setbrand */
  69   69          sn1_getattr,                    /* b_getattr */
  70   70          sn1_setattr,                    /* b_setattr */
  71   71          sn1_copy_procdata,              /* b_copy_procdata */
  72   72          sn1_proc_exit,                  /* b_proc_exit */
  73   73          sn1_exec,                       /* b_exec */
  74   74          lwp_setrval,                    /* b_lwp_setrval */
  75   75          NULL,                           /* b_lwpdata_alloc */
  76   76          NULL,                           /* b_lwpdata_free */
  77   77          sn1_initlwp,                    /* b_initlwp */
  78   78          NULL,                           /* b_initlwp_post */
  79   79          sn1_forklwp,                    /* b_forklwp */
  80   80          sn1_freelwp,                    /* b_freelwp */
  81   81          sn1_lwpexit,                    /* b_lwpexit */
  82   82          sn1_elfexec,                    /* b_elfexec */
  83   83          NULL,                           /* b_sigset_native_to_brand */
  84   84          NULL,                           /* b_sigset_brand_to_native */
  85   85          NULL,                           /* b_sigfd_translate */
  86   86          NSIG,                           /* b_nsig */
  87   87          NULL,                           /* b_exit_with_sig */
  88   88          NULL,                           /* b_wait_filter */
  89   89          NULL,                           /* b_native_exec */
  90   90          NULL,                           /* b_map32limit */
  91   91          NULL,                           /* b_stop_notify */
  92   92          NULL,                           /* b_waitid_helper */
  93   93          NULL,                           /* b_sigcld_repost */
  94   94          NULL,                           /* b_issig_stop */
  95   95          NULL,                           /* b_sig_ignorable */
  96   96          NULL,                           /* b_savecontext */
  97   97  #if defined(_SYSCALL32_IMPL)
  98   98          NULL,                           /* b_savecontext32 */
  99   99  #endif
 100  100          NULL,                           /* b_restorecontext */
 101  101          NULL,                           /* b_sendsig_stack */
 102  102          NULL,                           /* b_sendsig */
 103  103          NULL,                           /* b_setid_clear */
 104  104          NULL,                           /* b_pagefault */
 105  105          B_TRUE                          /* b_intp_parse_arg */
 106  106  };
 107  107  
 108  108  #ifdef  sparc
 109  109  
 110  110  struct brand_mach_ops sn1_mops = {
 111  111          sn1_brand_syscall_callback,
 112  112          sn1_brand_syscall32_callback
 113  113  };
 114  114  
 115  115  #else   /* sparc */
 116  116  
 117  117  #ifdef  __amd64
 118  118  
 119  119  struct brand_mach_ops sn1_mops = {
 120  120          sn1_brand_sysenter_callback,
 121  121          NULL,
 122  122          sn1_brand_int91_callback,
 123  123          sn1_brand_syscall_callback,
 124  124          sn1_brand_syscall32_callback,
 125  125          NULL,
 126  126          NULL
 127  127  };
 128  128  
 129  129  #else   /* ! __amd64 */
 130  130  
 131  131  struct brand_mach_ops sn1_mops = {
 132  132          sn1_brand_sysenter_callback,
 133  133          NULL,
 134  134          NULL,
 135  135          sn1_brand_syscall_callback,
 136  136          NULL,
 137  137          NULL,
 138  138          NULL
 139  139  };
 140  140  #endif  /* __amd64 */
 141  141  
 142  142  #endif  /* _sparc */
 143  143  
 144  144  struct brand    sn1_brand = {
 145  145          BRAND_VER_1,
 146  146          "sn1",
 147  147          &sn1_brops,
 148  148          &sn1_mops,
 149  149          sizeof (brand_proc_data_t),
 150  150  };
 151  151  
 152  152  static struct modlbrand modlbrand = {
 153  153          &mod_brandops,          /* type of module */
 154  154          "Solaris N-1 Brand",    /* description of module */
 155  155          &sn1_brand              /* driver ops */
 156  156  };
 157  157  
 158  158  static struct modlinkage modlinkage = {
 159  159          MODREV_1, (void *)&modlbrand, NULL
 160  160  };
 161  161  
 162  162  void
 163  163  sn1_setbrand(proc_t *p)
 164  164  {
 165  165          brand_solaris_setbrand(p, &sn1_brand);
 166  166  }
 167  167  
 168  168  /* ARGSUSED */
 169  169  int
 170  170  sn1_getattr(zone_t *zone, int attr, void *buf, size_t *bufsize)
 171  171  {
 172  172          return (EINVAL);
 173  173  }
 174  174  
 175  175  /* ARGSUSED */
 176  176  int
 177  177  sn1_setattr(zone_t *zone, int attr, void *buf, size_t bufsize)
 178  178  {
 179  179          return (EINVAL);
 180  180  }
 181  181  
 182  182  /* ARGSUSED5 */
 183  183  int
 184  184  sn1_brandsys(int cmd, int64_t *rval, uintptr_t arg1, uintptr_t arg2,
 185  185      uintptr_t arg3, uintptr_t arg4)
 186  186  {
 187  187          int     res;
 188  188  
 189  189          *rval = 0;
 190  190  
 191  191          res = brand_solaris_cmd(cmd, arg1, arg2, arg3, &sn1_brand, SN1_VERSION);
 192  192          if (res >= 0)
 193  193                  return (res);
 194  194  
 195  195          return (EINVAL);
 196  196  }
 197  197  
 198  198  void
 199  199  sn1_copy_procdata(proc_t *child, proc_t *parent)
 200  200  {
 201  201          brand_solaris_copy_procdata(child, parent, &sn1_brand);
 202  202  }
 203  203  
 204  204  void
 205  205  sn1_proc_exit(struct proc *p)
  
    | 
      ↓ open down ↓ | 
    205 lines elided | 
    
      ↑ open up ↑ | 
  
 206  206  {
 207  207          brand_solaris_proc_exit(p, &sn1_brand);
 208  208  }
 209  209  
 210  210  void
 211  211  sn1_exec()
 212  212  {
 213  213          brand_solaris_exec(&sn1_brand);
 214  214  }
 215  215  
      216 +/* ARGSUSED */
 216  217  void
 217  218  sn1_initlwp(klwp_t *l, void *bd)
 218  219  {
 219  220          brand_solaris_initlwp(l, &sn1_brand);
 220  221  }
 221  222  
 222  223  void
 223  224  sn1_forklwp(klwp_t *p, klwp_t *c)
 224  225  {
 225  226          brand_solaris_forklwp(p, c, &sn1_brand);
 226  227  }
 227  228  
 228  229  void
 229  230  sn1_freelwp(klwp_t *l)
 230  231  {
 231  232          brand_solaris_freelwp(l, &sn1_brand);
 232  233  }
 233  234  
 234  235  void
 235  236  sn1_lwpexit(klwp_t *l)
 236  237  {
 237  238          brand_solaris_lwpexit(l, &sn1_brand);
 238  239  }
 239  240  
 240  241  /*ARGSUSED*/
 241  242  void
 242  243  sn1_free_brand_data(zone_t *zone)
 243  244  {
 244  245  }
 245  246  
 246  247  /*ARGSUSED*/
 247  248  void
 248  249  sn1_init_brand_data(zone_t *zone, kmutex_t *zsl)
 249  250  {
 250  251  }
 251  252  
 252  253  int
 253  254  sn1_elfexec(vnode_t *vp, execa_t *uap, uarg_t *args, intpdata_t *idatap,
 254  255      int level, long *execsz, int setid, caddr_t exec_file, cred_t *cred,
 255  256      int *brand_action)
 256  257  {
 257  258          return (brand_solaris_elfexec(vp, uap, args, idatap, level, execsz,
 258  259              setid, exec_file, cred, brand_action, &sn1_brand, SN1_BRANDNAME,
 259  260              SN1_LIB, SN1_LIB32));
 260  261  }
 261  262  
 262  263  int
 263  264  _init(void)
 264  265  {
 265  266          int err;
 266  267  
 267  268          /*
 268  269           * Set up the table indicating which system calls we want to
 269  270           * interpose on.  We should probably build this automatically from
 270  271           * a list of system calls that is shared with the user-space
 271  272           * library.
 272  273           */
 273  274          sn1_emulation_table = kmem_zalloc(NSYSCALL, KM_SLEEP);
 274  275          sn1_emulation_table[SYS_read] = 1;                      /*   3 */
 275  276          sn1_emulation_table[SYS_write] = 1;                     /*   4 */
 276  277          sn1_emulation_table[SYS_time] = 1;                      /*  13 */
 277  278          sn1_emulation_table[SYS_getpid] = 1;                    /*  20 */
 278  279          sn1_emulation_table[SYS_mount] = 1;                     /*  21 */
 279  280          sn1_emulation_table[SYS_getuid] = 1;                    /*  24 */
 280  281          sn1_emulation_table[SYS_times] = 1;                     /*  43 */
 281  282          sn1_emulation_table[SYS_getgid] = 1;                    /*  47 */
 282  283          sn1_emulation_table[SYS_utssys] = 1;                    /*  57 */
 283  284          sn1_emulation_table[SYS_waitid] = 1;                    /* 107 */
 284  285          sn1_emulation_table[SYS_uname] = 1;                     /* 135 */
 285  286  
 286  287          err = mod_install(&modlinkage);
 287  288          if (err) {
 288  289                  cmn_err(CE_WARN, "Couldn't install brand module");
 289  290                  kmem_free(sn1_emulation_table, NSYSCALL);
 290  291          }
 291  292  
 292  293          return (err);
 293  294  }
 294  295  
 295  296  int
 296  297  _info(struct modinfo *modinfop)
 297  298  {
 298  299          return (mod_info(&modlinkage, modinfop));
 299  300  }
 300  301  
 301  302  int
 302  303  _fini(void)
 303  304  {
 304  305          return (brand_solaris_fini(&sn1_emulation_table, &modlinkage,
 305  306              &sn1_brand));
 306  307  }
  
    | 
      ↓ open down ↓ | 
    81 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX