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.