+2014-06-15 Mark Wielaard <mjw@redhat.com>
+
+ * linux-core-attach.c (core_memory_read): Use libdw/memory-access.h
+ macros read_4ubyte_unaligned_noncvt and read_8ubyte_unaligned_noncvt
+ to read possibly unaligned data.
+ (core_next_thread): Likewise.
+ (core_set_initial_registers): Likewise.
+ (dwfl_core_file_attach): Likewise.
+
2014-06-11 Mark Wielaard <mjw@redhat.com>
* dwfl_frame.c (__libdwfl_process_free): Reset dwfl->attacherr.
#include <fcntl.h>
#include "system.h"
+#include "../libdw/memory-access.h"
+
#ifndef MIN
# define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
return false;
}
assert (data->d_size == bytes);
- /* FIXME: Currently any arch supported for unwinding supports
- unaligned access. */
if (bytes == 8)
- *result = *(const uint64_t *) data->d_buf;
+ *result = read_8ubyte_unaligned_noncvt (data->d_buf);
else
- *result = *(const uint32_t *) data->d_buf;
+ *result = read_4ubyte_unaligned_noncvt (data->d_buf);
return true;
}
__libdwfl_seterrno (DWFL_E_ADDR_OUTOFRANGE);
break;
if (item == items + nitems)
continue;
- uint32_t val32 = *(const uint32_t *) (desc + item->offset);
+ uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be32toh (val32) : le32toh (val32));
pid_t tid = (int32_t) val32;
assert (item < items + nitems);
pid_t tid;
{
- uint32_t val32 = *(const uint32_t *) (desc + item->offset);
+ uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be32toh (val32) : le32toh (val32));
tid = (int32_t) val32;
switch (gelf_getclass (core) == ELFCLASS32 ? 32 : 64)
{
case 32:;
- uint32_t val32 = *(const uint32_t *) (desc + item->offset);
+ uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be32toh (val32) : le32toh (val32));
/* Do a host width conversion. */
pc = val32;
break;
case 64:;
- uint64_t val64 = *(const uint64_t *) (desc + item->offset);
+ uint64_t val64 = read_8ubyte_unaligned_noncvt (desc + item->offset);
val64 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be64toh (val64) : le64toh (val64));
pc = val64;
switch (regloc->bits)
{
case 32:;
- uint32_t val32 = *(const uint32_t *) reg_desc;
+ uint32_t val32 = read_4ubyte_unaligned_noncvt (reg_desc);
reg_desc += sizeof val32;
val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be32toh (val32) : le32toh (val32));
val = val32;
break;
case 64:;
- uint64_t val64 = *(const uint64_t *) reg_desc;
+ uint64_t val64 = read_8ubyte_unaligned_noncvt (reg_desc);
reg_desc += sizeof val64;
val64 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be64toh (val64) : le64toh (val64));
break;
if (item == items + nitems)
continue;
- uint32_t val32 = *(const uint32_t *) (desc + item->offset);
+ uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
? be32toh (val32) : le32toh (val32));
pid = (int32_t) val32;