Print this page
OS-4930 lxbrand ptrace should be more mindful of segregs
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
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>
OS-2834 ship lx brand
        
*** 23,33 ****
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  /*        All Rights Reserved   */
  /*
!  * Copyright (c) 2012, Joyent, Inc.  All rights reserved.
   * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <sys/param.h>
  #include <sys/types.h>
--- 23,33 ----
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  /*        All Rights Reserved   */
  /*
!  * Copyright 2015 Joyent, Inc.
   * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <sys/param.h>
  #include <sys/types.h>
*** 573,582 ****
--- 573,589 ----
           * otherwise there is no guarantee that anything in fpregs is valid.
           */
          if (src->uc_flags & UC_FPU)
                  fpregset_32ton(&src->uc_mcontext.fpregs,
                      &dst->uc_mcontext.fpregs);
+ 
+         /*
+          * Copy the brand-private data:
+          */
+         dst->uc_brand_data[0] = (void *)(uintptr_t)src->uc_brand_data[0];
+         dst->uc_brand_data[1] = (void *)(uintptr_t)src->uc_brand_data[1];
+         dst->uc_brand_data[2] = (void *)(uintptr_t)src->uc_brand_data[2];
  }
  
  #endif  /* _SYSCALL32_IMPL */
  
  /*
*** 627,639 ****
  
  #define IS_CS           1
  #define IS_NOT_CS       0
  
  /*ARGSUSED*/
! static greg_t
  fix_segreg(greg_t sr, int iscs, model_t datamodel)
  {
          switch (sr &= 0xffff) {
  
          case 0:
                  if (iscs == IS_CS)
                          return (0 | SEL_UPL);
--- 634,648 ----
  
  #define IS_CS           1
  #define IS_NOT_CS       0
  
  /*ARGSUSED*/
! greg_t
  fix_segreg(greg_t sr, int iscs, model_t datamodel)
  {
+         kthread_t *t = curthread;
+ 
          switch (sr &= 0xffff) {
  
          case 0:
                  if (iscs == IS_CS)
                          return (0 | SEL_UPL);
*** 665,674 ****
--- 674,696 ----
                  return (sr);
          default:
                  break;
          }
  
+         /*
+          * Allow this process's brand to do any necessary segment register
+          * manipulation.
+          */
+         if (PROC_IS_BRANDED(t->t_procp) && BRMOP(t->t_procp)->b_fixsegreg) {
+                 greg_t bsr = BRMOP(t->t_procp)->b_fixsegreg(sr, datamodel);
+ 
+                 if (bsr == 0 && iscs == IS_CS)
+                         return (0 | SEL_UPL);
+                 else
+                         return (bsr);
+         }
+ 
          /*
           * Force it into the LDT in ring 3 for 32-bit processes, which by
           * default do not have an LDT, so that any attempt to use an invalid
           * selector will reference the (non-existant) LDT, and cause a #gp
           * fault for the process.