/* *Tracinga32-bitprocesswitha64-bitstraceandviceversawillnot *work.Idon'tknowhowtofixthis.
*/ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
compat_ulong_t caddr, compat_ulong_t cdata)
{ int addr = caddr; int data = cdata; int ret;
switch (request) {
/* *Read4bytesoftheotherprocess'storage *dataisapointerspecifyingwheretheuserwantsthe *4bytescopiedinto *addrisapointerintheuser'sstoragethatcontainsan8byte *addressintheotherprocessofthe4bytesthatistoberead *(thisisrunina32-bitprocesslookingata64-bitprocess) *whenIandDspaceareseparate,thesewillneedtobefixed.
*/ case PTRACE_PEEKTEXT_3264: case PTRACE_PEEKDATA_3264: {
u32 tmp; int copied;
u32 __user * addrOthers;
ret = -EIO;
/* Get the addr in the other process that we want to read */ if (get_user(addrOthers, (u32 __user * __user *) (unsignedlong) addr) != 0) break;
if (!tsk_used_math(child)) { /* FP not yet used */
tmp = -1; break;
}
fregs = get_fpu_regs(child); if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) { /* *Theoddregistersareactuallythehigh *orderbitsofthevaluesstoredintheeven *registers.
*/
tmp = get_fpr32(&fregs[(addr & ~1) - FPR_BASE],
addr & 1); break;
}
tmp = get_fpr64(&fregs[addr - FPR_BASE], 0); break;
} case FPC_CSR:
tmp = child->thread.fpu.fcr31; break; case FPC_EIR: /* implementation / version register */
tmp = boot_cpu_data.fpu_id; break; #endif/* CONFIG_MIPS_FP_SUPPORT */ case PC:
tmp = regs->cp0_epc; break; case CAUSE:
tmp = regs->cp0_cause; break; case BADVADDR:
tmp = regs->cp0_badvaddr; break; case MMHI:
tmp = regs->hi; break; case MMLO:
tmp = regs->lo; break; case DSP_BASE ... DSP_BASE + 5: {
dspreg_t *dregs;
if (!cpu_has_dsp) {
tmp = 0;
ret = -EIO; goto out;
}
dregs = __get_dsp_regs(child);
tmp = dregs[addr - DSP_BASE]; break;
} case DSP_CONTROL: if (!cpu_has_dsp) {
tmp = 0;
ret = -EIO; goto out;
}
tmp = child->thread.dsp.dspcontrol; break; default:
tmp = 0;
ret = -EIO; goto out;
}
ret = put_user(tmp, (unsigned __user *) (unsignedlong) data); break;
}
/* *Write4bytesintotheotherprocess'storage *dataisthe4bytesthattheuserwantswritten *addrisapointerintheuser'sstoragethatcontainsan *8byteaddressintheotherprocesswherethe4bytes *thatistobewritten *(thisisrunina32-bitprocesslookingata64-bitprocess) *whenIandDspaceareseparate,thesewillneedtobefixed.
*/ case PTRACE_POKETEXT_3264: case PTRACE_POKEDATA_3264: {
u32 __user * addrOthers;
/* Get the addr in the other process that we want to write into */
ret = -EIO; if (get_user(addrOthers, (u32 __user * __user *) (unsignedlong) addr) != 0) break;
ret = 0; if (ptrace_access_vm(child, (u64)addrOthers, &data, sizeof(data),
FOLL_FORCE | FOLL_WRITE) == sizeof(data)) break;
ret = -EIO; break;
}
case PTRACE_POKEUSR: { struct pt_regs *regs;
ret = 0;
regs = task_pt_regs(child);
switch (addr) { case0 ... 31:
regs->regs[addr] = data; /* System call number may have been changed */ if (addr == 2)
mips_syscall_update_nr(child, regs); elseif (addr == 4 &&
mips_syscall_is_indirect(child, regs))
mips_syscall_update_nr(child, regs); break; #ifdef CONFIG_MIPS_FP_SUPPORT case FPR_BASE ... FPR_BASE + 31: { union fpureg *fregs = get_fpu_regs(child);
if (!tsk_used_math(child)) { /* FP not yet used */
memset(&child->thread.fpu, ~0, sizeof(child->thread.fpu));
child->thread.fpu.fcr31 = 0;
} if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) { /* *Theoddregistersareactuallythehigh *orderbitsofthevaluesstoredintheeven *registers.
*/
set_fpr32(&fregs[(addr & ~1) - FPR_BASE],
addr & 1, data); break;
}
set_fpr64(&fregs[addr - FPR_BASE], 0, data); break;
} case FPC_CSR:
child->thread.fpu.fcr31 = data; break; #endif/* CONFIG_MIPS_FP_SUPPORT */ case PC:
regs->cp0_epc = data; break; case MMHI:
regs->hi = data; break; case MMLO:
regs->lo = data; break; case DSP_BASE ... DSP_BASE + 5: {
dspreg_t *dregs;
if (!cpu_has_dsp) {
ret = -EIO; break;
}
dregs = __get_dsp_regs(child);
dregs[addr - DSP_BASE] = data; break;
} case DSP_CONTROL: if (!cpu_has_dsp) {
ret = -EIO; break;
}
child->thread.dsp.dspcontrol = data; break; default: /* The rest are not allowed. */
ret = -EIO; break;
} break;
}
case PTRACE_GETREGS:
ret = ptrace_getregs(child,
(struct user_pt_regs __user *) (__u64) data); break;
case PTRACE_SETREGS:
ret = ptrace_setregs(child,
(struct user_pt_regs __user *) (__u64) data); break;
#ifdef CONFIG_MIPS_FP_SUPPORT case PTRACE_GETFPREGS:
ret = ptrace_getfpregs(child, (__u32 __user *) (__u64) data); break;
case PTRACE_SETFPREGS:
ret = ptrace_setfpregs(child, (__u32 __user *) (__u64) data); break; #endif case PTRACE_GET_THREAD_AREA:
ret = put_user(task_thread_info(child)->tp_value,
(unsignedint __user *) (unsignedlong) data); break;
case PTRACE_GET_THREAD_AREA_3264:
ret = put_user(task_thread_info(child)->tp_value,
(unsignedlong __user *) (unsignedlong) data); break;
case PTRACE_GET_WATCH_REGS:
ret = ptrace_get_watch_regs(child,
(struct pt_watch_regs __user *) (unsignedlong) addr); break;
case PTRACE_SET_WATCH_REGS:
ret = ptrace_set_watch_regs(child,
(struct pt_watch_regs __user *) (unsignedlong) addr); break;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.