From efb21cc2384e385c4873ac6e7b23f16659469ea9 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 18 Aug 2008 01:26:38 -0400 Subject: x86, um: untangle uml ldt.h * turn asm/ldt.h into ldt.h; update the (very few) users * take host_ldt.h into sysdep, kill symlink mess * includes of asm/arch/ldt.h turn into asm/ldt.h now Signed-off-by: Al Viro Signed-off-by: H. Peter Anvin --- arch/um/include/shared/ldt.h | 37 ++++++++++++++++++++++++ arch/um/include/shared/sysdep-i386/host_ldt.h | 34 ++++++++++++++++++++++ arch/um/include/shared/sysdep-i386/tls.h | 2 +- arch/um/include/shared/sysdep-x86_64/host_ldt.h | 38 +++++++++++++++++++++++++ arch/um/include/shared/sysdep-x86_64/tls.h | 2 +- arch/um/include/shared/um_mmu.h | 2 +- 6 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 arch/um/include/shared/ldt.h create mode 100644 arch/um/include/shared/sysdep-i386/host_ldt.h create mode 100644 arch/um/include/shared/sysdep-x86_64/host_ldt.h (limited to 'arch/um/include/shared') diff --git a/arch/um/include/shared/ldt.h b/arch/um/include/shared/ldt.h new file mode 100644 index 00000000000..a7f999a5877 --- /dev/null +++ b/arch/um/include/shared/ldt.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2004 Fujitsu Siemens Computers GmbH + * Licensed under the GPL + * + * Author: Bodo Stroesser + */ + +#ifndef __ASM_LDT_H +#define __ASM_LDT_H + +#include +#include + +extern void ldt_host_info(void); + +#define LDT_PAGES_MAX \ + ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) +#define LDT_ENTRIES_PER_PAGE \ + (PAGE_SIZE/LDT_ENTRY_SIZE) +#define LDT_DIRECT_ENTRIES \ + ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) + +struct ldt_entry { + __u32 a; + __u32 b; +}; + +typedef struct uml_ldt { + int entry_count; + struct mutex lock; + union { + struct ldt_entry * pages[LDT_PAGES_MAX]; + struct ldt_entry entries[LDT_DIRECT_ENTRIES]; + } u; +} uml_ldt_t; + +#endif diff --git a/arch/um/include/shared/sysdep-i386/host_ldt.h b/arch/um/include/shared/sysdep-i386/host_ldt.h new file mode 100644 index 00000000000..0953cc4df65 --- /dev/null +++ b/arch/um/include/shared/sysdep-i386/host_ldt.h @@ -0,0 +1,34 @@ +#ifndef __ASM_HOST_LDT_I386_H +#define __ASM_HOST_LDT_I386_H + +#include + +/* + * macros stolen from include/asm-i386/desc.h + */ +#define LDT_entry_a(info) \ + ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) + +#define LDT_entry_b(info) \ + (((info)->base_addr & 0xff000000) | \ + (((info)->base_addr & 0x00ff0000) >> 16) | \ + ((info)->limit & 0xf0000) | \ + (((info)->read_exec_only ^ 1) << 9) | \ + ((info)->contents << 10) | \ + (((info)->seg_not_present ^ 1) << 15) | \ + ((info)->seg_32bit << 22) | \ + ((info)->limit_in_pages << 23) | \ + ((info)->useable << 20) | \ + 0x7000) + +#define LDT_empty(info) (\ + (info)->base_addr == 0 && \ + (info)->limit == 0 && \ + (info)->contents == 0 && \ + (info)->read_exec_only == 1 && \ + (info)->seg_32bit == 0 && \ + (info)->limit_in_pages == 0 && \ + (info)->seg_not_present == 1 && \ + (info)->useable == 0 ) + +#endif diff --git a/arch/um/include/shared/sysdep-i386/tls.h b/arch/um/include/shared/sysdep-i386/tls.h index 918fd3c5ff9..34550755b2a 100644 --- a/arch/um/include/shared/sysdep-i386/tls.h +++ b/arch/um/include/shared/sysdep-i386/tls.h @@ -21,7 +21,7 @@ typedef struct um_dup_user_desc { # else /* __KERNEL__ */ -# include +# include typedef struct user_desc user_desc_t; # endif /* __KERNEL__ */ diff --git a/arch/um/include/shared/sysdep-x86_64/host_ldt.h b/arch/um/include/shared/sysdep-x86_64/host_ldt.h new file mode 100644 index 00000000000..e8b1be1e154 --- /dev/null +++ b/arch/um/include/shared/sysdep-x86_64/host_ldt.h @@ -0,0 +1,38 @@ +#ifndef __ASM_HOST_LDT_X86_64_H +#define __ASM_HOST_LDT_X86_64_H + +#include + +/* + * macros stolen from include/asm-x86_64/desc.h + */ +#define LDT_entry_a(info) \ + ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) + +/* Don't allow setting of the lm bit. It is useless anyways because + * 64bit system calls require __USER_CS. */ +#define LDT_entry_b(info) \ + (((info)->base_addr & 0xff000000) | \ + (((info)->base_addr & 0x00ff0000) >> 16) | \ + ((info)->limit & 0xf0000) | \ + (((info)->read_exec_only ^ 1) << 9) | \ + ((info)->contents << 10) | \ + (((info)->seg_not_present ^ 1) << 15) | \ + ((info)->seg_32bit << 22) | \ + ((info)->limit_in_pages << 23) | \ + ((info)->useable << 20) | \ + /* ((info)->lm << 21) | */ \ + 0x7000) + +#define LDT_empty(info) (\ + (info)->base_addr == 0 && \ + (info)->limit == 0 && \ + (info)->contents == 0 && \ + (info)->read_exec_only == 1 && \ + (info)->seg_32bit == 0 && \ + (info)->limit_in_pages == 0 && \ + (info)->seg_not_present == 1 && \ + (info)->useable == 0 && \ + (info)->lm == 0) + +#endif diff --git a/arch/um/include/shared/sysdep-x86_64/tls.h b/arch/um/include/shared/sysdep-x86_64/tls.h index 35f19f25bd3..18c000d0357 100644 --- a/arch/um/include/shared/sysdep-x86_64/tls.h +++ b/arch/um/include/shared/sysdep-x86_64/tls.h @@ -22,7 +22,7 @@ typedef struct um_dup_user_desc { # else /* __KERNEL__ */ -# include +# include typedef struct user_desc user_desc_t; # endif /* __KERNEL__ */ diff --git a/arch/um/include/shared/um_mmu.h b/arch/um/include/shared/um_mmu.h index f575ff91f2a..4cc1ef4d022 100644 --- a/arch/um/include/shared/um_mmu.h +++ b/arch/um/include/shared/um_mmu.h @@ -8,7 +8,7 @@ #include "uml-config.h" #include "mm_id.h" -#include "asm/ldt.h" +#include "ldt.h" typedef struct mm_context { struct mm_id id; -- cgit v1.2.3