From: Zachary Amsden <zach@vmware.com>
To: Albert Cahalan <acahalan@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
torvalds@osdl.org, jeremy@goop.org, mingo@elte.hu, ak@suse.de,
arjan@infradead.org, linux-kernel@vger.kernel.org
Subject: Re: Assignment of GDT entries
Date: Thu, 14 Sep 2006 00:24:13 -0700 [thread overview]
Message-ID: <4509039D.6000905@vmware.com> (raw)
In-Reply-To: <787b0d920609140012i220a189es68d077f3c67c68e2@mail.gmail.com>
Albert Cahalan wrote
>>
>> There are only 32 possible GDT entries in 32-bit i386 Linux, and only
>> three of them are usable for userspace. You can't find out which slots
>> are in use, but you can cause one to be allocated and returned to you.
>> This seems like a perfectly reasonable API to me, why do you think it is
>> so ugly?
>
> Eh, "returned to you" doesn't work for me. I need to
> figure out what other code (not written by me) uses.
I don't understand. Why do you need to figure that out? You need a
selector, you ask for one, and you get assigned one. It is that
simple. You can't figure out what other code uses, and the kernel has
no way to tell you, because that is an application level allocation
problem, not a kernel responsibility. The kernel has no visibility into
userspace intentions regarding segment usage.
> I may need to "borrow" a slot if all three slots are in
> use. Without using evil knowledge of the GDT, how
> am I to do that? I don't know what slots might have
> been allocated by other libraries.
What kind of libraries are you using? Unless this is really, really,
special purpose, they are going to allocate at most one, and that is
only if you use TLS libraries.
If all three slots are in use (i.e. your allocation fails), you'll have
to allocate an LDT selector, just like wine:
void wine_ldt_init_fs( unsigned short sel, const LDT_ENTRY *entry )
{
if ((sel & ~3) == (global_fs_sel & ~3))
{
#ifdef __linux__
struct modify_ldt_s ldt_info;
int ret;
ldt_info.entry_number = sel >> 3;
fill_modify_ldt_struct( &ldt_info, entry );
if ((ret = set_thread_area( &ldt_info ) < 0)) perror(
"set_thread_area" );
#elif defined(__APPLE__)
int ret = thread_set_user_ldt( wine_ldt_get_base(entry),
wine_ldt_get_limit(entry), 0 );
if (ret == -1) perror( "thread_set_user_ldt" );
else assert( ret == global_fs_sel );
#endif /* __APPLE__ */
}
else /* LDT selector */
{
internal_set_entry( sel, entry ); <---- just like this
}
wine_set_fs( sel );
}
Zach
next prev parent reply other threads:[~2006-09-14 7:24 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-14 4:06 Assignment of GDT entries Albert Cahalan
2006-09-14 4:44 ` Eric W. Biederman
2006-09-14 6:19 ` Albert Cahalan
2006-09-14 6:28 ` Zachary Amsden
2006-09-14 7:12 ` Albert Cahalan
2006-09-14 7:24 ` Zachary Amsden [this message]
2006-09-14 6:29 ` Jeremy Fitzhardinge
-- strict thread matches above, loose matches on Subject: below --
2006-09-15 7:55 Mikael Pettersson
2006-09-15 8:20 ` Jeremy Fitzhardinge
2006-09-15 8:58 ` Mikael Pettersson
2006-09-15 18:27 ` Jeremy Fitzhardinge
2006-09-14 3:23 Albert Cahalan
2006-09-14 6:11 ` Jeremy Fitzhardinge
2006-09-13 18:58 Jeremy Fitzhardinge
2006-09-13 19:16 ` Arjan van de Ven
2006-09-13 20:00 ` Alan Cox
2006-09-13 20:02 ` Jeremy Fitzhardinge
2006-09-13 20:20 ` Jeremy Fitzhardinge
2006-09-13 20:59 ` Zachary Amsden
2006-09-13 21:15 ` Jeremy Fitzhardinge
2006-09-13 21:35 ` Alan Cox
2006-09-14 0:25 ` Zachary Amsden
2006-09-14 1:40 ` Stephen Rothwell
2006-09-14 13:03 ` Alan Cox
2006-09-13 19:55 ` linux-os (Dick Johnson)
2006-09-13 20:08 ` Jeremy Fitzhardinge
2006-09-13 20:32 ` linux-os (Dick Johnson)
2006-09-13 21:21 ` Linus Torvalds
2006-09-13 21:47 ` Jeremy Fitzhardinge
2006-09-13 22:05 ` Linus Torvalds
2006-09-13 22:22 ` Jeremy Fitzhardinge
2006-09-14 6:00 ` Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4509039D.6000905@vmware.com \
--to=zach@vmware.com \
--cc=acahalan@gmail.com \
--cc=ak@suse.de \
--cc=arjan@infradead.org \
--cc=ebiederm@xmission.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox