10b0e7057128c213bee8d2158b976869475f7cb42José Fonseca/**************************************************************************
20b0e7057128c213bee8d2158b976869475f7cb42José Fonseca *
30b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Copyright 2008-2010 VMware, Inc.
40b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * All Rights Reserved.
50b0e7057128c213bee8d2158b976869475f7cb42José Fonseca *
60b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
70b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * copy of this software and associated documentation files (the
80b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * "Software"), to deal in the Software without restriction, including
90b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
100b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
110b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * permit persons to whom the Software is furnished to do so, subject to
120b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * the following conditions:
130b0e7057128c213bee8d2158b976869475f7cb42José Fonseca *
140b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * The above copyright notice and this permission notice (including the
150b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * next paragraph) shall be included in all copies or substantial portions
160b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * of the Software.
170b0e7057128c213bee8d2158b976869475f7cb42José Fonseca *
180b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
190b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
200b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
210b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
220b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
230b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
240b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
250b0e7057128c213bee8d2158b976869475f7cb42José Fonseca *
260b0e7057128c213bee8d2158b976869475f7cb42José Fonseca **************************************************************************/
270b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
280b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
290b0e7057128c213bee8d2158b976869475f7cb42José Fonseca/*
300b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Memory alignment wrappers.
310b0e7057128c213bee8d2158b976869475f7cb42José Fonseca */
320b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
330b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
340b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#ifndef _OS_MEMORY_H_
350b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#error "Must not be included directly. Include os_memory.h instead"
360b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#endif
370b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
380b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
390b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include "pipe/p_compiler.h"
400b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
410b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
420b0e7057128c213bee8d2158b976869475f7cb42José Fonseca/**
430b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Return memory on given byte alignment
440b0e7057128c213bee8d2158b976869475f7cb42José Fonseca */
450b0e7057128c213bee8d2158b976869475f7cb42José Fonsecastatic INLINE void *
4624ea02553efccc52581479819d8ead8d2bb06aafJosé Fonsecaos_malloc_aligned(size_t size, size_t alignment)
470b0e7057128c213bee8d2158b976869475f7cb42José Fonseca{
480b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   char *ptr, *buf;
490b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
500b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   ptr = (char *) os_malloc(size + alignment + sizeof(void *));
510b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   if (!ptr)
520b0e7057128c213bee8d2158b976869475f7cb42José Fonseca      return NULL;
530b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
5424ea02553efccc52581479819d8ead8d2bb06aafJosé Fonseca   buf = (char *)(((uintptr_t)ptr + sizeof(void *) + alignment - 1) & ~((uintptr_t)(alignment - 1)));
550b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   *(char **)(buf - sizeof(void *)) = ptr;
560b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
570b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   return buf;
580b0e7057128c213bee8d2158b976869475f7cb42José Fonseca}
590b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
600b0e7057128c213bee8d2158b976869475f7cb42José Fonseca
610b0e7057128c213bee8d2158b976869475f7cb42José Fonseca/**
620b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Free memory returned by align_malloc().
630b0e7057128c213bee8d2158b976869475f7cb42José Fonseca */
640b0e7057128c213bee8d2158b976869475f7cb42José Fonsecastatic INLINE void
650b0e7057128c213bee8d2158b976869475f7cb42José Fonsecaos_free_aligned(void *ptr)
660b0e7057128c213bee8d2158b976869475f7cb42José Fonseca{
670b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   if (ptr) {
680b0e7057128c213bee8d2158b976869475f7cb42José Fonseca      void **cubbyHole = (void **) ((char *) ptr - sizeof(void *));
690b0e7057128c213bee8d2158b976869475f7cb42José Fonseca      void *realAddr = *cubbyHole;
700b0e7057128c213bee8d2158b976869475f7cb42José Fonseca      os_free(realAddr);
710b0e7057128c213bee8d2158b976869475f7cb42José Fonseca   }
720b0e7057128c213bee8d2158b976869475f7cb42José Fonseca}
73