blob: 6070afc4a6c24b0261b84f4b10b8097486c855cd [file] [log] [blame]
[Julian replying to Greg Parker's notes about darwin/ppc32]
> Some notes about porting Valgrind 3.x to Mac OS X / PowerPC:
>
> * Darwin always uses a 64-bit off_t, even on 32-bit architectures.
> (FreeBSD may also do this.) Valgrind currently allows off_t to
> be pointer sized only, but it doesn't look like there is any
> strong dependence on this anywhere.
Ok. This sounds fairly harmless.
> * dispatch.S should be platform-specific instead of arch-specific.
> In particular, Darwin's assembler is not GNU as, so the file's
> syntax would be wrong even if everything else were the same.
> It should be reasonable to change dispatch-$VG_ARCH.S to
> dispatch-$VG_OS-$VG_ARCH.S .
True.
> * Some Darwin syscalls take 7 arguments (in particular, mmap()
> with 64-bit off_t offset). Valgrind currently provides
> arg1..arg6. I don't see any obvious 8-argument syscalls.
> Do other architectures define a 7th syscall argument and
> just never use it, or do they have a 6 argument max?
6 args is as many as Linux uses, it seems, and that's why the
m_syswrap abstractions stop at 6. But clearly that could be
extended to 7 with minimal effort.
> * Darwin syscalls return a full 64-bit result, even on 32-bit
> architectures. In particular, the lseek() syscall returns
> a 64-bit off_t in registers r3 and r4. For syscalls that
> return a 32-bit int, the kernel sets the other return
> register to zero (or the appropriate sign extension for
> signed return types). I don't know how much of an effect
> changing this would have.
I think the m_syswrap abstractions should be able to hide that OK.
> * Darwin/PPC syscalls indicate success and failure in an unusual
> way: successful calls and failed calls return to different
> points. A syscall call usually looks like this:
>
> // ...set up parameters here...
> sc // make the syscall
> b BAD // failed calls return here
> GOOD:
> nop // successful calls return here
> // ...handle success case here...
> blr
> BAD:
> // ...handle failure case here...
> blr
So you're saying that after sc, execution continues either at
CIA+4 or CIA+8 depending on outcome. Right?
> Handling this in VG_(do_syscall_for_client) isn't too bad.
> One option is to store the PC of the last simulated `sc`
> in the thread state, updating it before each call. Another
> is to store a "sc failed" bit in each thread state, updating
> it after each call. In either case, the simulated PC after
> completion of the simulated `sc` would be adjusted based on
> the result of the real `sc` or the syscall wrapper. The
> syscall restarter would use the extra thread state to decide
> whether to back up on instruction or two.
>
> Handling this in VEX might be more difficult, because VEX
> might need to know that `sc` looks like a conditional branch
> in basic block analysis.
Probably pretty harmless. There's all sorts of tricks that can
be played. I think it's a non-problem.
> (Of course, Mach traps use `sc` but don't use the PC-modifying
> calling convention. However, Mach traps are an entirely different
> ball of wax, and much will be said about them later.)