2
* Mesa 3-D graphics library
4
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
13
* The above copyright notice and this permission notice shall be included
14
* in all copies or substantial portions of the Software.
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
* OTHER DEALINGS IN THE SOFTWARE.
27
* \file glapi_execmem.c
29
* Function for allocating executable memory for dispatch stubs.
31
* Copied from main/execmem.c and simplified for dispatch stubs.
35
#include "c11/threads.h"
36
#include "util/u_call_once.h"
37
#include "u_execmem.h"
40
#define EXEC_MAP_SIZE (4*1024)
42
static mtx_t exec_mutex;
44
static unsigned int head = 0;
46
static unsigned char *exec_mem = (unsigned char *)0;
49
#if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__sun) || defined(__HAIKU__)
55
#include <selinux/selinux.h>
60
#define MAP_ANONYMOUS MAP_ANON
65
* Dispatch stubs are of fixed size and never freed. Thus, we do not need to
66
* overlay a heap, we just mmap a page and manage through an index.
73
if (is_selinux_enabled()) {
74
if (!security_get_boolean_active("allow_execmem") ||
75
!security_get_boolean_pending("allow_execmem"))
80
exec_mem = mmap(NULL, EXEC_MAP_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE,
81
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
83
return (exec_mem != MAP_FAILED);
93
* Avoid Data Execution Prevention.
99
exec_mem = VirtualAlloc(NULL, EXEC_MAP_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
101
return (exec_mem != NULL);
112
exec_mem = malloc(EXEC_MAP_SIZE);
114
return (exec_mem != NULL);
121
u_execmem_init_once(void)
125
mtx_init(&exec_mutex, mtx_plain);
129
u_execmem_alloc(unsigned int size)
136
static util_once_flag once = UTIL_ONCE_FLAG_INIT;
137
util_call_once(&once, u_execmem_init_once);
138
if (exec_mem == NULL)
141
mtx_lock(&exec_mutex);
143
/* free space check, assumes no integer overflow */
144
if (head + size > EXEC_MAP_SIZE)
147
/* allocation, assumes proper addr and size alignement */
148
addr = exec_mem + head;
152
mtx_unlock(&exec_mutex);
155
#endif /* MESA_EXECMEM */