----- Original Message ----- > On 04/25/2016 03:48 PM, Sam Ravnborg wrote: > > Hi Dave. > > > >> Sparc64 requires type-aligned memory access. Since data buffers may not > >> be properly aligned, implement a safe copy from memory per data type. > >> > >> Signed-off-by: Dave Kleikamp <dave.kleikamp@xxxxxxxxxx> > >> --- > >> defs.h | 41 +++++++++++++++++++++++++++++++++++++++++ > >> 1 files changed, 41 insertions(+), 0 deletions(-) > >> > >> diff --git a/defs.h b/defs.h > >> index e3afc58..d9d4559 100644 > >> --- a/defs.h > >> +++ b/defs.h > >> @@ -2187,6 +2187,45 @@ struct builtin_debug_table { > >> * Facilitators for pulling correctly-sized data out of a buffer at a > >> * known address. > >> */ > >> + > >> +#ifdef NEED_ALIGNED_MEM_ACCESS > >> + > >> +#define DEF_LOADER(TYPE) \ > >> +static inline TYPE \ > >> +load_##TYPE (char *addr) \ > >> +{ \ > >> + TYPE ret; \ > >> + size_t i = sizeof(TYPE); \ > >> + while (i--) \ > >> + ((char *)&ret)[i] = addr[i]; \ > >> + return ret; \ > >> +} > >> + > >> +DEF_LOADER(int); > >> +DEF_LOADER(uint); > >> +DEF_LOADER(long); > >> +DEF_LOADER(ulong); > >> +DEF_LOADER(ulonglong); > >> +DEF_LOADER(ushort); > >> +DEF_LOADER(short); > >> +typedef void *pointer_t; > >> +DEF_LOADER(pointer_t); > >> + > >> +#define LOADER(TYPE) load_##TYPE > > A simpler model would be > > #define LOADER(TYPE, addr) \ > > ({ \ > > TYPE ret; \ > > memcpy(&ret, (void *)addr, sizeof(TYPE)); \ > > ret; \ > > }) > > This does simplify things a bit. > > > > > I would expect the compiler to optimize this away for archs > > that do not require aligned access. > > I hesitate to to replace the macros for every architecture with this. > I'll let Dave A. make that call, but I think it can improve the > NEED_ALIGNED_MEM_ACCESS case. Do not modify the macros for the existing architectures. Thanks, Dave > > > > > Quick test: > > > > #include <string.h> > > #include <stdio.h> > > > > #define LOADER(TYPE, addr) \ > > ({ \ > > TYPE ret; \ > > memcpy(&ret, (void*)addr, sizeof(TYPE)); \ > > ret; \ > > }) > > > > #define INT(ADDR) LOADER(int, ADDR) > > > > void main(void) > > { > > int i = 37; > > int j = -17; > > > > printf("i=%d j=%d\n", INT(&i), INT(&j)); > > } > > > > > > Sam > > > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility