diff options
author | Patrick Mooney <pmooney@pfmooney.com> | 2017-08-14 23:17:17 +0000 |
---|---|---|
committer | Patrick Mooney <pmooney@pfmooney.com> | 2017-08-14 23:17:17 +0000 |
commit | 6ce9515e507bc9c47fd127589ef8734a84fed1c3 (patch) | |
tree | 81bdb54c1bdbe50f81daa194ccf9dd5b66916ec3 /usr/src/uts/common/dtrace/dtrace.c | |
parent | 801699355dea5fb4658b631b388aea1c1ca1926d (diff) | |
download | illumos-joyent-6ce9515e507bc9c47fd127589ef8734a84fed1c3.tar.gz |
OS-6066 want writable uregs[] in dtrace
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Alex Wilson <alex.wilson@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>
Diffstat (limited to 'usr/src/uts/common/dtrace/dtrace.c')
-rw-r--r-- | usr/src/uts/common/dtrace/dtrace.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/usr/src/uts/common/dtrace/dtrace.c b/usr/src/uts/common/dtrace/dtrace.c index 6ec6c5ae9d..f5ce5608aa 100644 --- a/usr/src/uts/common/dtrace/dtrace.c +++ b/usr/src/uts/common/dtrace/dtrace.c @@ -21,7 +21,7 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016, Joyent, Inc. All rights reserved. + * Copyright (c) 2017, Joyent, Inc. * Copyright (c) 2012, 2014 by Delphix. All rights reserved. */ @@ -3545,6 +3545,34 @@ dtrace_dif_variable(dtrace_mstate_t *mstate, dtrace_state_t *state, uint64_t v, } } +static void +dtrace_dif_variable_write(dtrace_mstate_t *mstate, dtrace_state_t *state, + uint64_t v, uint64_t ndx, uint64_t data) +{ + switch (v) { + case DIF_VAR_UREGS: { + klwp_t *lwp; + + if (dtrace_destructive_disallow || + !dtrace_priv_proc_control(state, mstate)) { + return; + } + + if ((lwp = curthread->t_lwp) == NULL) { + DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR); + cpu_core[CPU->cpu_id].cpuc_dtrace_illval = NULL; + return; + } + + dtrace_setreg(lwp->lwp_regs, ndx, data); + return; + } + + default: + DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP); + return; + } +} typedef enum dtrace_json_state { DTRACE_JSON_REST = 1, @@ -6024,6 +6052,11 @@ dtrace_dif_emulate(dtrace_difo_t *difo, dtrace_mstate_t *mstate, regs[rd] = dtrace_dif_variable(mstate, state, id, 0); break; + case DIF_OP_STGA: + dtrace_dif_variable_write(mstate, state, r1, regs[r2], + regs[rd]); + break; + case DIF_OP_STGS: id = DIF_INSTR_VAR(instr); @@ -9407,6 +9440,15 @@ dtrace_difo_validate(dtrace_difo_t *dp, dtrace_vstate_t *vstate, uint_t nregs, if (rd == 0) err += efunc(pc, "cannot write to %r0\n"); break; + case DIF_OP_STGA: + if (r1 > DIF_VAR_ARRAY_MAX) + err += efunc(pc, "invalid array %u\n", r1); + if (r2 >= nregs) + err += efunc(pc, "invalid register %u\n", r2); + if (rd >= nregs) + err += efunc(pc, "invalid register %u\n", rd); + dp->dtdo_destructive = 1; + break; case DIF_OP_LDGS: case DIF_OP_LDTS: case DIF_OP_LDLS: @@ -9752,12 +9794,23 @@ dtrace_difo_validate_helper(dtrace_difo_t *dp) break; case DIF_OP_LDTA: + if (v < DIF_VAR_OTHER_UBASE) { + err += efunc(pc, "illegal variable load\n"); + break; + } + /* FALLTHROUGH */ case DIF_OP_LDTS: case DIF_OP_LDGAA: case DIF_OP_LDTAA: err += efunc(pc, "illegal dynamic variable load\n"); break; + case DIF_OP_STGA: + if (v < DIF_VAR_OTHER_UBASE) { + err += efunc(pc, "illegal variable store\n"); + break; + } + /* FALLTHROUGH */ case DIF_OP_STTS: case DIF_OP_STGAA: case DIF_OP_STTAA: |