From 9689fa480235038e19a30e5f5f4a77e6f51f5cd6 Mon Sep 17 00:00:00 2001 From: duane Date: Thu, 4 Dec 2008 01:15:13 +0000 Subject: Fix for Hiroshi Ito discovery of mis-aligned memory allocation git-svn-id: svn://svn.berlios.de/openocd/trunk@1205 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/jtag.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/jtag/jtag.c') diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 605d58aa..663518a3 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -463,6 +463,39 @@ void* cmd_queue_alloc(size_t size) int offset; u8 *t; + /* + * WARNING: + * We align/round the *SIZE* per below + * so that all pointers returned by + * this function are reasonably well + * aligned. + * + * If we did not, then an "odd-length" request would cause the + * *next* allocation to be at an *odd* address, and because + * this function has the same type of api as malloc() - we + * must also return pointers that have the same type of + * alignment. + * + * What I do not/have is a reasonable portable means + * to align by... + * + * The solution here, is based on these suggestions. + * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html + * + */ + union worse_case_align { + int i; + long l; + float f; + void *v; + }; +#define ALIGN_SIZE (sizeof(union worse_case_align)) + + // The alignment process. + size = (size + ALIGN_SIZE -1) & (~(ALIGN_SIZE-1)); + // Done... + + if (*p_page) { while ((*p_page)->next) -- cgit v1.2.3