[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.)