1f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#ifndef REMOTE_H 2f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#define REMOTE_H 3f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 4f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang/* Helper functions for accessing (remote) memory. These functions 5f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang assume that all addresses are naturally aligned (e.g., 32-bit 6f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang quantity is stored at a 32-bit-aligned address. */ 7f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 8f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#ifdef UNW_LOCAL_ONLY 9f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 10f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 11f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch8 (unw_addr_space_t as, unw_accessors_t *a, 12f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int8_t *valp, void *arg) 13f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *valp = *(int8_t *) (uintptr_t) *addr; 15f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 1; 16f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return 0; 17f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 18f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 19f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 20f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch16 (unw_addr_space_t as, unw_accessors_t *a, 21f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int16_t *valp, void *arg) 22f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *valp = *(int16_t *) (uintptr_t) *addr; 24f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 2; 25f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return 0; 26f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 27f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 28f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 29f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch32 (unw_addr_space_t as, unw_accessors_t *a, 30f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int32_t *valp, void *arg) 31f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *valp = *(int32_t *) (uintptr_t) *addr; 33f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 4; 34f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return 0; 35f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 36f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 37f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 38f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetchw (unw_addr_space_t as, unw_accessors_t *a, 39f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, unw_word_t *valp, void *arg) 40f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *valp = *(unw_word_t *) (uintptr_t) *addr; 42f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += sizeof (unw_word_t); 43f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return 0; 44f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 45f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 46f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#else /* !UNW_LOCAL_ONLY */ 47f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 48f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#define WSIZE (sizeof (unw_word_t)) 49f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 50f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 51f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch8 (unw_addr_space_t as, unw_accessors_t *a, 52f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int8_t *valp, void *arg) 53f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 54f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr; 55f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang int ret; 56f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 57f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 1; 58f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 59f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ret = (*a->access_mem) (as, aligned_addr, &val, 0, arg); 60f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 61f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#if __BYTE_ORDER == __LITTLE_ENDIAN 62f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*off; 63f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#else 64f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*(WSIZE - 1 - off); 65f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#endif 66f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *valp = val & 0xff; 67f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return ret; 68f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 69f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 70f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 71f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch16 (unw_addr_space_t as, unw_accessors_t *a, 72f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int16_t *valp, void *arg) 73f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 74f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr; 75f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang int ret; 76f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 77f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang assert ((off & 0x1) == 0); 78f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 79f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 2; 80f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 81f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ret = (*a->access_mem) (as, aligned_addr, &val, 0, arg); 82f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 83f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#if __BYTE_ORDER == __LITTLE_ENDIAN 84f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*off; 85f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#else 86f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*(WSIZE - 2 - off); 87f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#endif 88f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *valp = val & 0xffff; 89f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return ret; 90f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 91f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 92f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 93f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetch32 (unw_addr_space_t as, unw_accessors_t *a, 94f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, int32_t *valp, void *arg) 95f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 96f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr; 97f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang int ret; 98f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 99f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang assert ((off & 0x3) == 0); 100f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 101f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += 4; 102f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 103f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ret = (*a->access_mem) (as, aligned_addr, &val, 0, arg); 104f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 105f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#if __BYTE_ORDER == __LITTLE_ENDIAN 106f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*off; 107f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#else 108f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang val >>= 8*(WSIZE - 4 - off); 109f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#endif 110f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *valp = val & 0xffffffff; 111f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return ret; 112f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 113f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 114f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangstatic inline int 115f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangfetchw (unw_addr_space_t as, unw_accessors_t *a, 116f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang unw_word_t *addr, unw_word_t *valp, void *arg) 117f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 118f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang int ret; 119f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 120f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ret = (*a->access_mem) (as, *addr, valp, 0, arg); 121f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang *addr += WSIZE; 122f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return ret; 123f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 124f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 125f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#endif /* !UNW_LOCAL_ONLY */ 126f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 127f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#endif /* REMOTE_H */ 128