Print this page
OS-3561 lxbrand emulation library should execute on alternate stack
OS-3558 lxbrand add support for full in-kernel syscall handling
OS-3545 lx_syscall_regs should not walk stack
OS-3868 many LTP testcases now hang
OS-3901 lxbrand lx_recvmsg fails to translate control messages when 64-bit
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/sparc/syscall/getcontext.c
          +++ new/usr/src/uts/sparc/syscall/getcontext.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  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 + * Copyright 2015 Joyent, Inc.
       24 + */
       25 +/*
  23   26   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  24   27   * Use is subject to license terms.
  25   28   */
  26   29  
  27   30  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  28   31  /*        All Rights Reserved   */
  29   32  
  30   33  #include <sys/param.h>
  31   34  #include <sys/types.h>
  32   35  #include <sys/vmparam.h>
↓ open down ↓ 70 lines elided ↑ open up ↑
 103  106  
 104  107          getgregs(lwp, ucp->uc_mcontext.gregs);
 105  108          getasrs(lwp, ucp->uc_mcontext.asrs);
 106  109  
 107  110          getfpregs(lwp, &ucp->uc_mcontext.fpregs);
 108  111          getfpasrs(lwp, ucp->uc_mcontext.asrs);
 109  112          if (ucp->uc_mcontext.fpregs.fpu_en == 0)
 110  113                  ucp->uc_flags &= ~UC_FPU;
 111  114          ucp->uc_mcontext.gwins = (gwindows_t *)NULL;
 112  115  
 113      -        /*
 114      -         * Save signal mask.
 115      -         */
 116      -        sigktou(mask, &ucp->uc_sigmask);
      116 +        if (mask != NULL) {
      117 +                /*
      118 +                 * Save signal mask.
      119 +                 */
      120 +                sigktou(mask, &ucp->uc_sigmask);
      121 +        } else {
      122 +                ucp->uc_flags &= ~UC_SIGMASK;
      123 +                bzero(&ucp->uc_sigmask, sizeof (ucp->uc_sigmask));
      124 +        }
 117  125  }
 118  126  
 119  127  
 120  128  void
 121  129  restorecontext(ucontext_t *ucp)
 122  130  {
 123  131          kthread_t *t = curthread;
 124  132          klwp_t *lwp = ttolwp(t);
 125  133          mcontext_t *mcp = &ucp->uc_mcontext;
 126  134          model_t model = lwp_getdatamodel(lwp);
↓ open down ↓ 278 lines elided ↑ open up ↑
 405  413          }
 406  414  
 407  415          getgregs32(lwp, ucp->uc_mcontext.gregs);
 408  416          getfpregs(lwp, &fpregs);
 409  417          fpuregset_nto32(&fpregs, &ucp->uc_mcontext.fpregs, dfq);
 410  418  
 411  419          if (ucp->uc_mcontext.fpregs.fpu_en == 0)
 412  420                  ucp->uc_flags &= ~UC_FPU;
 413  421          ucp->uc_mcontext.gwins = (caddr32_t)NULL;
 414  422  
 415      -        /*
 416      -         * Save signal mask (the 32- and 64-bit sigset_t structures are
 417      -         * identical).
 418      -         */
 419      -        sigktou(mask, (sigset_t *)&ucp->uc_sigmask);
      423 +        if (mask != NULL) {
      424 +                /*
      425 +                 * Save signal mask (the 32- and 64-bit sigset_t structures are
      426 +                 * identical).
      427 +                 */
      428 +                sigktou(mask, (sigset_t *)&ucp->uc_sigmask);
      429 +        } else {
      430 +                ucp->uc_flags &= ~UC_SIGMASK;
      431 +                bzero(&ucp->uc_sigmask, sizeof (ucp->uc_sigmask));
      432 +        }
 420  433  }
 421  434  
 422  435  int
 423  436  getsetcontext32(int flag, void *arg)
 424  437  {
 425  438          ucontext32_t uc;
 426  439          ucontext_t   ucnat;
 427  440          struct _fq fpu_qnat[MAXFPQ]; /* to hold "native" floating queue */
 428  441          struct fq32 fpu_q[MAXFPQ]; /* to hold 32 bit floating queue */
 429  442          fpregset32_t *fpp;
↓ open down ↓ 180 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX