annotate loader/ldt_keeper.c @ 18715:30d7ddf08889

Fix window position when changing videos while in fullscreen and for window managers that modify position on Map. Oked by Alexander Strasser.
author reimar
date Thu, 15 Jun 2006 08:00:37 +0000
parents 29b2221982b3
children 0783dd397f74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
1 /**
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
2 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
3 * This file MUST be in main library because LDT must
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
4 * be modified before program creates first thread
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
5 * - avifile includes this file from C++ code
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
6 * and initializes it at the start of player!
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
7 * it might sound like a hack and it really is - but
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
8 * as aviplay is deconding video with more than just one
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
9 * thread currently it's necessary to do it this way
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
10 * this might change in the future
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
11 */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
12
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
13 /* applied some modification to make make our xine friend more happy */
15166
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
14
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
15 /*
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
16 * Modified for use with MPlayer, detailed CVS changelog at
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
17 * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
18 * $Id$
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
19 */
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 14537
diff changeset
20
2139
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
21 #include "ldt_keeper.h"
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
22
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
23 #include <string.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
24 #include <stdlib.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
25 #include <errno.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
26 #include <fcntl.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
27 #include <sys/mman.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
28 #include <sys/types.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
29 #include <stdio.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
30 #include <unistd.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
31 #ifdef __linux__
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
32 #include <asm/unistd.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
33 #include <asm/ldt.h>
8213
9d3e1476ecd0 2.5.47+ support
arpi
parents: 7386
diff changeset
34 // 2.5.xx+ calls this user_desc:
9d3e1476ecd0 2.5.47+ support
arpi
parents: 7386
diff changeset
35 #include <linux/version.h>
9d3e1476ecd0 2.5.47+ support
arpi
parents: 7386
diff changeset
36 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,47)
9d3e1476ecd0 2.5.47+ support
arpi
parents: 7386
diff changeset
37 #define modify_ldt_ldt_s user_desc
9d3e1476ecd0 2.5.47+ support
arpi
parents: 7386
diff changeset
38 #endif
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
39 /* prototype it here, so we won't depend on kernel headers */
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
40 #ifdef __cplusplus
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
41 extern "C" {
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
42 #endif
13351
698fe63084d3 declare modify_ldt with syscall3 macro for older glibcs patch by Mikulas Patocka <mikulas at artax.karlin.mff.cuni.cz>
faust3
parents: 10821
diff changeset
43 /// declare modify_ldt with the _syscall3 macro for older glibcs
13361
faust3
parents: 13351
diff changeset
44 #if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0))
13351
698fe63084d3 declare modify_ldt with syscall3 macro for older glibcs patch by Mikulas Patocka <mikulas at artax.karlin.mff.cuni.cz>
faust3
parents: 10821
diff changeset
45 _syscall3( int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount );
698fe63084d3 declare modify_ldt with syscall3 macro for older glibcs patch by Mikulas Patocka <mikulas at artax.karlin.mff.cuni.cz>
faust3
parents: 10821
diff changeset
46 #else
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
47 int modify_ldt(int func, void *ptr, unsigned long bytecount);
13351
698fe63084d3 declare modify_ldt with syscall3 macro for older glibcs patch by Mikulas Patocka <mikulas at artax.karlin.mff.cuni.cz>
faust3
parents: 10821
diff changeset
48 #endif
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
49 #ifdef __cplusplus
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
50 }
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
51 #endif
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
52 #else
15566
3758536dcef3 DragonFly BSD support
diego
parents: 15166
diff changeset
53 #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
5872
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 5747
diff changeset
54 #include <machine/segments.h>
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
55 #include <machine/sysarch.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
56 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
57
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
58 #ifdef __svr4__
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
59 #include <sys/segment.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
60 #include <sys/sysi86.h>
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
61
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
62 /* solaris x86: add missing prototype for sysi86() */
18362
29b2221982b3 Add a check for sysi86() on Solaris systems, solving a build failure on Solaris
diego
parents: 17605
diff changeset
63 #ifdef HAVE_SYSI86
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
64 #ifdef __cplusplus
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
65 extern "C" {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
66 #endif
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
67 int sysi86(int, void*);
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
68 #ifdef __cplusplus
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
69 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
70 #endif
18362
29b2221982b3 Add a check for sysi86() on Solaris systems, solving a build failure on Solaris
diego
parents: 17605
diff changeset
71 #endif
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
72
2139
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
73 #ifndef NUMSYSLDTS /* SunOS 2.5.1 does not define NUMSYSLDTS */
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
74 #define NUMSYSLDTS 6 /* Let's hope the SunOS 5.8 value is OK */
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
75 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
76
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
77 #define TEB_SEL_IDX NUMSYSLDTS
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
78 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
79
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
80 #define LDT_ENTRIES 8192
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
81 #define LDT_ENTRY_SIZE 8
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
82 #pragma pack(4)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
83 struct modify_ldt_ldt_s {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
84 unsigned int entry_number;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
85 unsigned long base_addr;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
86 unsigned int limit;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
87 unsigned int seg_32bit:1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
88 unsigned int contents:2;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
89 unsigned int read_exec_only:1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
90 unsigned int limit_in_pages:1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
91 unsigned int seg_not_present:1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
92 unsigned int useable:1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
93 };
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
94
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
95 #define MODIFY_LDT_CONTENTS_DATA 0
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
96 #define MODIFY_LDT_CONTENTS_STACK 1
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
97 #define MODIFY_LDT_CONTENTS_CODE 2
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
98 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
99
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
100
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
101 /* user level (privilege level: 3) ldt (1<<2) segment selector */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
102 #define LDT_SEL(idx) ((idx) << 3 | 1 << 2 | 3)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
103
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
104 /* i got this value from wine sources, it's the first free LDT entry */
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
105 #if defined(__FreeBSD__) && defined(LDT_AUTO_ALLOC)
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
106 #define TEB_SEL_IDX LDT_AUTO_ALLOC
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
107 #endif
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
108
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
109 #ifndef TEB_SEL_IDX
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
110 #define TEB_SEL_IDX 17
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
111 #endif
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
112
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
113 static unsigned int fs_ldt = TEB_SEL_IDX;
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
114
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
115
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
116 /**
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
117 * here is a small logical problem with Restore for multithreaded programs -
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
118 * in C++ we use static class for this...
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
119 */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
120
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
121 #ifdef __cplusplus
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
122 extern "C"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
123 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
124 void Setup_FS_Segment(void)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
125 {
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
126 unsigned int ldt_desc = LDT_SEL(fs_ldt);
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
127
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
128 __asm__ __volatile__(
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
129 "movl %0,%%eax; movw %%ax, %%fs" : : "r" (ldt_desc)
14212
540903a59fc0 add missing registers in clobber list, fixes bug #169
reimar
parents: 13361
diff changeset
130 :"eax"
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
131 );
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
132 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
133
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
134 /* we don't need this - use modify_ldt instead */
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
135 #if 0
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
136 #ifdef __linux__
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
137 /* XXX: why is this routine from libc redefined here? */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
138 /* NOTE: the redefined version ignores the count param, count is hardcoded as 16 */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
139 static int LDT_Modify( int func, struct modify_ldt_ldt_s *ptr,
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
140 unsigned long count )
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
141 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
142 int res;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
143 #ifdef __PIC__
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
144 __asm__ __volatile__( "pushl %%ebx\n\t"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
145 "movl %2,%%ebx\n\t"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
146 "int $0x80\n\t"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
147 "popl %%ebx"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
148 : "=a" (res)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
149 : "0" (__NR_modify_ldt),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
150 "r" (func),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
151 "c" (ptr),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
152 "d"(16)//sizeof(*ptr) from kernel point of view
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
153 :"esi" );
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
154 #else
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
155 __asm__ __volatile__("int $0x80"
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
156 : "=a" (res)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
157 : "0" (__NR_modify_ldt),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
158 "b" (func),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
159 "c" (ptr),
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
160 "d"(16)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
161 :"esi");
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
162 #endif /* __PIC__ */
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
163 if (res >= 0) return res;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
164 errno = -res;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
165 return -1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
166 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
167 #endif
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
168 #endif
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
169
15566
3758536dcef3 DragonFly BSD support
diego
parents: 15166
diff changeset
170 #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
171 static void LDT_EntryToBytes( unsigned long *buffer, const struct modify_ldt_ldt_s *content )
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
172 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
173 *buffer++ = ((content->base_addr & 0x0000ffff) << 16) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
174 (content->limit & 0x0ffff);
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
175 *buffer = (content->base_addr & 0xff000000) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
176 ((content->base_addr & 0x00ff0000)>>16) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
177 (content->limit & 0xf0000) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
178 (content->contents << 10) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
179 ((content->read_exec_only == 0) << 9) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
180 ((content->seg_32bit != 0) << 22) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
181 ((content->limit_in_pages != 0) << 23) |
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
182 0xf000;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
183 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
184 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
185
8223
a88e53ef3029 exporting fs_seg
alex
parents: 8213
diff changeset
186 void* fs_seg=0;
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
187
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
188 ldt_fs_t* Setup_LDT_Keeper(void)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
189 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
190 struct modify_ldt_ldt_s array;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
191 int ret;
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
192 ldt_fs_t* ldt_fs = (ldt_fs_t*) malloc(sizeof(ldt_fs_t));
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
193
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
194 if (!ldt_fs)
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
195 return NULL;
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
196
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
197 ldt_fs->fd = open("/dev/zero", O_RDWR);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
198 if(ldt_fs->fd<0){
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
199 perror( "Cannot open /dev/zero for READ+WRITE. Check permissions! error: ");
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
200 return NULL;
3775
aa1491f8167b /dev/zero bad permissions error message
arpi
parents: 2779
diff changeset
201 }
8223
a88e53ef3029 exporting fs_seg
alex
parents: 8213
diff changeset
202 fs_seg=
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
203 ldt_fs->fs_seg = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_PRIVATE,
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
204 ldt_fs->fd, 0);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
205 if (ldt_fs->fs_seg == (void*)-1)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
206 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
207 perror("ERROR: Couldn't allocate memory for fs segment");
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
208 close(ldt_fs->fd);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
209 free(ldt_fs);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
210 return NULL;
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
211 }
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
212 *(void**)((char*)ldt_fs->fs_seg+0x18) = ldt_fs->fs_seg;
14537
f832c3ec3e4b initialize modify_ldt struct to 0.
reimar
parents: 14212
diff changeset
213 memset(&array, 0, sizeof(array));
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
214 array.base_addr=(int)ldt_fs->fs_seg;
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
215 array.entry_number=TEB_SEL_IDX;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
216 array.limit=array.base_addr+getpagesize()-1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
217 array.seg_32bit=1;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
218 array.read_exec_only=0;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
219 array.seg_not_present=0;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
220 array.contents=MODIFY_LDT_CONTENTS_DATA;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
221 array.limit_in_pages=0;
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
222 #ifdef __linux__
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
223 //ret=LDT_Modify(0x1, &array, sizeof(struct modify_ldt_ldt_s));
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
224 ret=modify_ldt(0x1, &array, sizeof(struct modify_ldt_ldt_s));
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
225 if(ret<0)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
226 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
227 perror("install_fs");
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
228 printf("Couldn't install fs segment, expect segfault\n");
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
229 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
230 #endif /*linux*/
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
231
15566
3758536dcef3 DragonFly BSD support
diego
parents: 15166
diff changeset
232 #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
233 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
234 unsigned long d[2];
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
235
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
236 LDT_EntryToBytes( d, &array );
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
237 #if defined(__FreeBSD__) && defined(LDT_AUTO_ALLOC)
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
238 ret = i386_set_ldt(LDT_AUTO_ALLOC, (union descriptor *)d, 1);
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
239 array.entry_number = ret;
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
240 fs_ldt = ret;
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
241 #else
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
242 ret = i386_set_ldt(array.entry_number, (union descriptor *)d, 1);
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
243 #endif
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
244 if (ret < 0)
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
245 {
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
246 perror("install_fs");
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
247 printf("Couldn't install fs segment, expect segfault\n");
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
248 printf("Did you reconfigure the kernel with \"options USER_LDT\"?\n");
17605
dcc1be050037 one more hint for openbsd
alex
parents: 15566
diff changeset
249 #ifdef __OpenBSD__
dcc1be050037 one more hint for openbsd
alex
parents: 15566
diff changeset
250 printf("On newer OpenBSD systems did you set machdep.userldt to 1?\n");
dcc1be050037 one more hint for openbsd
alex
parents: 15566
diff changeset
251 #endif
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
252 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
253 }
15566
3758536dcef3 DragonFly BSD support
diego
parents: 15166
diff changeset
254 #endif /* __NetBSD__ || __FreeBSD__ || __OpenBSD__ || __DragonFly__ */
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
255
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
256 #if defined(__svr4__)
2070
c1edbb8bfc0c (solaris x86) C++ style variable declaration not at the start of a block does
jkeil
parents: 2069
diff changeset
257 {
2139
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
258 struct ssd ssd;
10821
e9e5dca4af9e FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
alex
parents: 8223
diff changeset
259 ssd.sel = LDT_SEL(TEB_SEL_IDX);
2139
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
260 ssd.bo = array.base_addr;
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
261 ssd.ls = array.limit - array.base_addr;
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
262 ssd.acc1 = ((array.read_exec_only == 0) << 1) |
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
263 (array.contents << 2) |
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
264 0xf0; /* P(resent) | DPL3 | S */
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
265 ssd.acc2 = 0x4; /* byte limit, 32-bit segment */
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
266 if (sysi86(SI86DSCR, &ssd) < 0) {
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
267 perror("sysi86(SI86DSCR)");
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
268 printf("Couldn't install fs segment, expect segfault\n");
e06cabbd1a9b changes merged back from avifile cvs
arpi
parents: 2070
diff changeset
269 }
2070
c1edbb8bfc0c (solaris x86) C++ style variable declaration not at the start of a block does
jkeil
parents: 2069
diff changeset
270 }
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
271 #endif
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
272
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
273 Setup_FS_Segment();
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
274
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
275 ldt_fs->prev_struct = (char*)malloc(sizeof(char) * 8);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
276 *(void**)array.base_addr = ldt_fs->prev_struct;
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
277
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
278 return ldt_fs;
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
279 }
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
280
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
281 void Restore_LDT_Keeper(ldt_fs_t* ldt_fs)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
282 {
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
283 if (ldt_fs == NULL || ldt_fs->fs_seg == 0)
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
284 return;
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
285 if (ldt_fs->prev_struct)
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
286 free(ldt_fs->prev_struct);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
287 munmap((char*)ldt_fs->fs_seg, getpagesize());
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
288 ldt_fs->fs_seg = 0;
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
289 close(ldt_fs->fd);
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 5872
diff changeset
290 free(ldt_fs);
2067
a5a4143d5599 setup_FS.c -> ldt_keeper.c (avifile sync)
arpi
parents:
diff changeset
291 }