19bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu/**************************************************************************
29bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
39bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * Copyright 2011 LunarG, Inc.
49bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * All Rights Reserved.
59bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
69bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
79bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * copy of this software and associated documentation files (the
89bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * "Software"), to deal in the Software without restriction, including
99bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
109bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
119bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * permit persons to whom the Software is furnished to do so, subject to
129bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * the following conditions:
139bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
149bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * The above copyright notice and this permission notice (including the
159bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * next paragraph) shall be included in all copies or substantial portions
169bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * of the Software.
179bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
189bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
199bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
219bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
229bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
239bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
249bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
259bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
269bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu **************************************************************************/
279bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
289bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu/**
299bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * @file
309bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * OS independent memory mapping (with large file support).
319bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu *
329bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu * @author Chia-I Wu <olvaffe@gmail.com>
339bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu */
349bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
359bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#ifndef _OS_MMAN_H_
369bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#define _OS_MMAN_H_
379bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
389bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
399bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#include "pipe/p_config.h"
409bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#include "pipe/p_compiler.h"
419bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
429bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#if defined(PIPE_OS_UNIX)
439bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  ifndef _FILE_OFFSET_BITS
449bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#    error _FILE_OFFSET_BITS must be defined to 64
459bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  endif
469bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  include <sys/mman.h>
479bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#else
489bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  error Unsupported OS
499bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif
509bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
519bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#if defined(PIPE_OS_ANDROID)
529bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  include <errno.h> /* for EINVAL */
539bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif
549bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
559bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#ifdef  __cplusplus
569bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wuextern "C" {
579bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif
589bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
599bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
609bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#if defined(PIPE_OS_ANDROID)
619bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
629bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wuextern void *__mmap2(void *, size_t, int, int, int, size_t);
639bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
649bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wustatic INLINE void *os_mmap(void *addr, size_t length, int prot, int flags, int fd, loff_t offset)
659bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu{
669bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu   /* offset must be aligned to 4096 (not necessarily the page size) */
679bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu   if (unlikely(offset & 4095)) {
689bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu      errno = EINVAL;
699bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu      return MAP_FAILED;
709bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu   }
719bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
729bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu   return __mmap2(addr, length, prot, flags, fd, (size_t) (offset >> 12));
739bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu}
749bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
759bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#else
769bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu/* assume large file support exists */
779bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#  define os_mmap(addr, length, prot, flags, fd, offset) mmap(addr, length, prot, flags, fd, offset)
789bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif
799bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
809bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#define os_munmap(addr, length) munmap(addr, length)
819bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
829bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
839bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#ifdef	__cplusplus
849bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu}
859bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif
869bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu
879bda86c3550090f5370ef2d010e659758dc9a540Chia-I Wu#endif /* _OS_MMAN_H_ */
88