aboutsummaryrefslogtreecommitdiff
path: root/arch/um/include/shared
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/include/shared')
-rw-r--r--arch/um/include/shared/ldt.h37
-rw-r--r--arch/um/include/shared/sysdep-i386/host_ldt.h34
-rw-r--r--arch/um/include/shared/sysdep-i386/tls.h2
-rw-r--r--arch/um/include/shared/sysdep-x86_64/host_ldt.h38
-rw-r--r--arch/um/include/shared/sysdep-x86_64/tls.h2
-rw-r--r--arch/um/include/shared/um_mmu.h2
6 files changed, 112 insertions, 3 deletions
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 <bstroesser@fujitsu-siemens.com>
+ */
+
+#ifndef __ASM_LDT_H
+#define __ASM_LDT_H
+
+#include <linux/mutex.h>
+#include <sysdep/host_ldt.h>
+
+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 <asm/ldt.h>
+
+/*
+ * 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 <asm/ldt.h>
+# include <ldt.h>
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 <asm/ldt.h>
+
+/*
+ * 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 <asm/ldt.h>
+# include <ldt.h>
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;