If you use GDB 7.4 together with Valgrind 3.7.0, then you have
unlimited “emulated” hardware watchpoints.
Start your program under Valgrind, giving the arguments
--vgdb=full --vgdb-error=0
then use GDB to connect to it (target remote | vgdb).
Then you can e.g. watch or awatch or rwatch a memory range by doing
rwatch (char[100]) *0x5180040
See the Valgrind user manual on gdb integration for more details