In add_sw_breakpoint and remove_sw_breakpoint, the address is translated from GVA to GPA using translate_gva, but then the resulting GPA is passed to read_addrs/write_addrs which internally call translate_gva again, treating the already-translated GPA as a GVA.
I would expect this to cause incorrect memory access since the physical address gets translated a second time?