util/ralloc: fix ralloc alignment.

On some malloc implementation, malloc doesn't always align to 16
bytes even on 64 bits system. To make sure ralloc_header always
starts at the wanted alignment, just force the size to be aligned at
the alignment of ralloc_header. This fixes crashed on instruction
like "movaps %xmm0,0x10(%rax)" which requires aligned memory access.

Signed-off-by: Lepton Wu <lepton@chromium.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6314>
This commit is contained in:
Lepton Wu
2020-08-13 19:14:13 -07:00
committed by Marge Bot
parent fd7e1ed86d
commit a4c708dd24

View File

@@ -28,6 +28,9 @@
#include <string.h>
#include <stdint.h>
#include "util/macros.h"
#include "util/u_math.h"
/* Some versions of MinGW are missing _vscprintf's declaration, although they
* still provide the symbol in the import library. */
#ifdef __MINGW32__
@@ -120,7 +123,15 @@ ralloc_context(const void *ctx)
void *
ralloc_size(const void *ctx, size_t size)
{
void *block = malloc(size + sizeof(ralloc_header));
/* Some malloc allocation doesn't always align to 16 bytes even on 64 bits
* system, from Android bionic/tests/malloc_test.cpp:
* - Allocations of a size that rounds up to a multiple of 16 bytes
* must have at least 16 byte alignment.
* - Allocations of a size that rounds up to a multiple of 8 bytes and
* not 16 bytes, are only required to have at least 8 byte alignment.
*/
void *block = malloc(align64(size + sizeof(ralloc_header),
alignof(ralloc_header)));
ralloc_header *info;
ralloc_header *parent;
@@ -167,7 +178,8 @@ resize(void *ptr, size_t size)
ralloc_header *child, *old, *info;
old = get_header(ptr);
info = realloc(old, size + sizeof(ralloc_header));
info = realloc(old, align64(size + sizeof(ralloc_header),
alignof(ralloc_header)));
if (info == NULL)
return NULL;