int tracer_copy_out( struct tracer *t, const void *data, const void *uaddr, int length ) { int result; static int has_fast_write=1; UPTRINT_T iuaddr = (UPTRINT_T)uaddr; if(length==0) return 0; #if !defined(CCTOOLS_CPU_I386) if(!tracer_is_64bit(t)) iuaddr &= 0xffffffff; #endif if(has_fast_write) { result = full_pwrite64(t->memory_file,data,length,iuaddr); if( result!=length ) { has_fast_write = 0; debug(D_SYSCALL,"writing to /proc/X/mem failed, falling back to slow ptrace write"); } else { return result; } } result = tracer_copy_out_slow(t,data,(void*)iuaddr,length); return result; }
ssize_t tracer_copy_out( struct tracer *t, const void *data, const void *uaddr, size_t length, int flags ) { if(length==0) return 0; #if !defined(CCTOOLS_CPU_I386) if(!tracer_is_64bit(t)) { uaddr = VOID_MATH(uaddr, & 0xffffffff); } #endif ssize_t rc = copy_out_fast(t,data,uaddr,length,flags); if (rc == -1 && errno == ENOSYS && !(flags & TRACER_O_FAST)) rc = tracer_copy_out_slow(t,data,uaddr,length,flags); assert(!(flags & TRACER_O_ATOMIC) || (rc == -1 || (size_t)rc == length)); return rc; }