static int access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write, void *arg) { if (unlikely (write)) { /* ANDROID support update. */ #ifdef UNW_LOCAL_ONLY if (map_local_is_writable (addr, sizeof(unw_word_t))) { #endif Debug (16, "mem[%016lx] <- %lx\n", addr, *val); *(unw_word_t *) addr = *val; #ifdef UNW_LOCAL_ONLY } else { Debug (16, "Unwritable memory mem[%016lx] <- %lx\n", addr, *val); return -1; } #endif /* End of ANDROID update. */ } else { /* validate address */ const struct cursor *c = (const struct cursor *)arg; if (likely (c != NULL) && unlikely (c->validate) && unlikely (validate_mem (addr))) return -1; /* ANDROID support update. */ #ifdef UNW_LOCAL_ONLY if (map_local_is_readable (addr, sizeof(unw_word_t))) { #endif *val = *(unw_word_t *) addr; Debug (16, "mem[%016lx] -> %lx\n", addr, *val); #ifdef UNW_LOCAL_ONLY } else { Debug (16, "Unreadable memory mem[%016lx] -> XXX\n", addr); return -1; } #endif /* End of ANDROID update. */ } return 0; }
static int access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write, void *arg) { if (write) { /* ANDROID support update. */ #ifdef UNW_LOCAL_ONLY if (map_local_is_writable (addr)) { #endif Debug (16, "mem[%llx] <- %llx\n", (long long) addr, (long long) *val); *(unw_word_t *) (uintptr_t) addr = *val; #ifdef UNW_LOCAL_ONLY } else { Debug (16, "Unwritable memory mem[%llx] <- %llx\n", (long long) addr, (long long) *val); return -1; } #endif /* End of ANDROID update. */ } else { /* ANDROID support update. */ #ifdef UNW_LOCAL_ONLY if (map_local_is_readable (addr)) { #endif *val = *(unw_word_t *) (uintptr_t) addr; Debug (16, "mem[%llx] -> %llx\n", (long long) addr, (long long) *val); #ifdef UNW_LOCAL_ONLY } else { Debug (16, "Unreadable memory mem[%llx] -> XXX\n", (long long) addr); return -1; } #endif /* End of ANDROID update. */ } return 0; }