[PATCH] uml: check for differences in host support
If running on a host not supporting TLS (for instance 2.4) we should report that cleanly to the user, instead of printing not comprehensible "error 5" for that. Additionally, i386 and x86_64 support different ranges for user_desc->entry_number, and we must account for that; we couldn't pass ourselves -1 because we need to override previously existing TLS descriptors which glibc has possibly set, so test at startup the range to use. x86 and x86_64 existing ranges are hardcoded. Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Acked-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
54d8d3b5a0
commit
3feb88562d
@@ -3,7 +3,7 @@
|
||||
# Licensed under the GPL
|
||||
#
|
||||
|
||||
obj-$(CONFIG_MODE_SKAS) = registers.o
|
||||
obj-$(CONFIG_MODE_SKAS) = registers.o tls.o
|
||||
|
||||
USER_OBJS := $(obj-y)
|
||||
|
||||
|
33
arch/um/os-Linux/sys-i386/tls.c
Normal file
33
arch/um/os-Linux/sys-i386/tls.c
Normal file
@@ -0,0 +1,33 @@
|
||||
#include <linux/unistd.h>
|
||||
#include "sysdep/tls.h"
|
||||
#include "user_util.h"
|
||||
|
||||
static _syscall1(int, get_thread_area, user_desc_t *, u_info);
|
||||
|
||||
/* Checks whether host supports TLS, and sets *tls_min according to the value
|
||||
* valid on the host.
|
||||
* i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */
|
||||
void check_host_supports_tls(int *supports_tls, int *tls_min) {
|
||||
/* Values for x86 and x86_64.*/
|
||||
int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(val); i++) {
|
||||
user_desc_t info;
|
||||
info.entry_number = val[i];
|
||||
|
||||
if (get_thread_area(&info) == 0) {
|
||||
*tls_min = val[i];
|
||||
*supports_tls = 1;
|
||||
return;
|
||||
} else {
|
||||
if (errno == EINVAL)
|
||||
continue;
|
||||
else if (errno == ENOSYS)
|
||||
*supports_tls = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
*supports_tls = 0;
|
||||
}
|
@@ -48,8 +48,8 @@ int os_get_thread_area(user_desc_t *info, int pid)
|
||||
#ifdef UML_CONFIG_MODE_TT
|
||||
#include "linux/unistd.h"
|
||||
|
||||
_syscall1(int, get_thread_area, user_desc_t *, u_info);
|
||||
_syscall1(int, set_thread_area, user_desc_t *, u_info);
|
||||
static _syscall1(int, get_thread_area, user_desc_t *, u_info);
|
||||
static _syscall1(int, set_thread_area, user_desc_t *, u_info);
|
||||
|
||||
int do_set_thread_area_tt(user_desc_t *info)
|
||||
{
|
||||
|
Reference in New Issue
Block a user