Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/*
2
 * Mesa 3-D graphics library
3
 *
4
 * Copyright (C) 2010 LunarG Inc.
5
 *
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:
12
 *
13
 * The above copyright notice and this permission notice shall be included
14
 * in all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * 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 OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
 * DEALINGS IN THE SOFTWARE.
23
 *
24
 * Authors:
25
 *    Chia-I Wu 
26
 */
27
 
28
#include 
29
#include "u_macros.h"
30
 
31
__asm__(".text");
32
 
33
__asm__("x86_current_tls:\n\t"
34
	"call 1f\n"
35
        "1:\n\t"
36
        "popl %eax\n\t"
37
	"addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t"
38
	"movl " ENTRY_CURRENT_TABLE "@GOTNTPOFF(%eax), %eax\n\t"
39
	"ret");
40
 
41
#ifndef GLX_X86_READONLY_TEXT
42
__asm__(".section wtext, \"awx\", @progbits");
43
#endif /* GLX_X86_READONLY_TEXT */
44
 
45
__asm__(".balign 16\n"
46
        "x86_entry_start:");
47
 
48
#define STUB_ASM_ENTRY(func)     \
49
   ".globl " func "\n"           \
50
   ".type " func ", @function\n" \
51
   ".balign 16\n"                \
52
   func ":"
53
 
54
#define STUB_ASM_CODE(slot)      \
55
   "call x86_current_tls\n\t"    \
56
   "movl %gs:(%eax), %eax\n\t"   \
57
   "jmp *(4 * " slot ")(%eax)"
58
 
59
#define MAPI_TMP_STUB_ASM_GCC
60
#include "mapi_tmp.h"
61
 
62
#ifndef GLX_X86_READONLY_TEXT
63
__asm__(".balign 16\n"
64
        "x86_entry_end:");
65
__asm__(".text");
66
#endif /* GLX_X86_READONLY_TEXT */
67
 
68
#ifndef MAPI_MODE_BRIDGE
69
 
70
#include "u_execmem.h"
71
 
72
extern unsigned long
73
x86_current_tls();
74
 
75
static char x86_entry_start[];
76
static char x86_entry_end[];
77
 
78
void
79
entry_patch_public(void)
80
{
81
#ifndef GLX_X86_READONLY_TEXT
82
   char patch[8] = {
83
      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
84
      0x90, 0x90                          /* nop's */
85
   };
86
   char *entry;
87
 
88
   *((unsigned long *) (patch + 2)) = x86_current_tls();
89
 
90
   for (entry = x86_entry_start; entry < x86_entry_end; entry += 16)
91
      memcpy(entry, patch, sizeof(patch));
92
#endif
93
}
94
 
95
mapi_func
96
entry_get_public(int slot)
97
{
98
   return (mapi_func) (x86_entry_start + slot * 16);
99
}
100
 
101
void
102
entry_patch(mapi_func entry, int slot)
103
{
104
   char *code = (char *) entry;
105
   *((unsigned long *) (code + 8)) = slot * sizeof(mapi_func);
106
}
107
 
108
mapi_func
109
entry_generate(int slot)
110
{
111
   const char code_templ[16] = {
112
      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
113
      0xff, 0xa0, 0x34, 0x12, 0x00, 0x00, /* jmp *0x1234(%eax) */
114
      0x90, 0x90, 0x90, 0x90              /* nop's */
115
   };
116
   void *code;
117
   mapi_func entry;
118
 
119
   code = u_execmem_alloc(sizeof(code_templ));
120
   if (!code)
121
      return NULL;
122
 
123
   memcpy(code, code_templ, sizeof(code_templ));
124
 
125
   *((unsigned long *) (code + 2)) = x86_current_tls();
126
   entry = (mapi_func) code;
127
   entry_patch(entry, slot);
128
 
129
   return entry;
130
}
131
 
132
#endif /* MAPI_MODE_BRIDGE */