diff options
| author | Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> | 2006-03-31 05:30:19 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-31 15:18:51 -0500 |
| commit | fbdf2161552a2065047e5df2dbf9ebf69d66a0e9 (patch) | |
| tree | 67d1adf47db4d80b712e276e348f2d4ec6da251d | |
| parent | 12523bdce1a6b5a3a2627b9901162bbd3eef33ed (diff) | |
[PATCH] uml: split ldt.h in arch-independent and arch-dependant code
ldt-{i386,x86_64}.h is made of two different parts - some code for parsing of
LDT descriptors, which is arch-dependant, and the code to handle uml_ldt_t (an
LDT block inside UML), which is mostly arch-independant (among x86 and x86_64,
at least).
Join the common part in a single file (ldt.h) and split the rest away
(host_ldt-{i386,x86_64}.h).
This is needed because processor.h, with next patches, will start including
the LDT descriptor parsing macros in host_ldt.h, but it can't include ldt.h
because it uses semaphores (and to define semaphores one must first include
processor.h!).
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>
| -rw-r--r-- | arch/um/Makefile | 2 | ||||
| -rw-r--r-- | include/asm-um/host_ldt-i386.h | 34 | ||||
| -rw-r--r-- | include/asm-um/host_ldt-x86_64.h (renamed from include/asm-um/ldt-x86_64.h) | 39 | ||||
| -rw-r--r-- | include/asm-um/ldt-i386.h | 69 | ||||
| -rw-r--r-- | include/asm-um/ldt.h | 41 |
5 files changed, 78 insertions, 107 deletions
diff --git a/arch/um/Makefile b/arch/um/Makefile index a08958a3f3c1..24790bed2054 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
| @@ -20,7 +20,7 @@ core-y += $(ARCH_DIR)/kernel/ \ | |||
| 20 | 20 | ||
| 21 | # Have to precede the include because the included Makefiles reference them. | 21 | # Have to precede the include because the included Makefiles reference them. |
| 22 | SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \ | 22 | SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \ |
| 23 | module.h vm-flags.h elf.h ldt.h | 23 | module.h vm-flags.h elf.h host_ldt.h |
| 24 | SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) | 24 | SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) |
| 25 | 25 | ||
| 26 | # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes | 26 | # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes |
diff --git a/include/asm-um/host_ldt-i386.h b/include/asm-um/host_ldt-i386.h new file mode 100644 index 000000000000..b27cb0a9dd30 --- /dev/null +++ b/include/asm-um/host_ldt-i386.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | #ifndef __ASM_HOST_LDT_I386_H | ||
| 2 | #define __ASM_HOST_LDT_I386_H | ||
| 3 | |||
| 4 | #include "asm/arch/ldt.h" | ||
| 5 | |||
| 6 | /* | ||
| 7 | * macros stolen from include/asm-i386/desc.h | ||
| 8 | */ | ||
| 9 | #define LDT_entry_a(info) \ | ||
| 10 | ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) | ||
| 11 | |||
| 12 | #define LDT_entry_b(info) \ | ||
| 13 | (((info)->base_addr & 0xff000000) | \ | ||
| 14 | (((info)->base_addr & 0x00ff0000) >> 16) | \ | ||
| 15 | ((info)->limit & 0xf0000) | \ | ||
| 16 | (((info)->read_exec_only ^ 1) << 9) | \ | ||
| 17 | ((info)->contents << 10) | \ | ||
| 18 | (((info)->seg_not_present ^ 1) << 15) | \ | ||
| 19 | ((info)->seg_32bit << 22) | \ | ||
| 20 | ((info)->limit_in_pages << 23) | \ | ||
| 21 | ((info)->useable << 20) | \ | ||
| 22 | 0x7000) | ||
| 23 | |||
| 24 | #define LDT_empty(info) (\ | ||
| 25 | (info)->base_addr == 0 && \ | ||
| 26 | (info)->limit == 0 && \ | ||
| 27 | (info)->contents == 0 && \ | ||
| 28 | (info)->read_exec_only == 1 && \ | ||
| 29 | (info)->seg_32bit == 0 && \ | ||
| 30 | (info)->limit_in_pages == 0 && \ | ||
| 31 | (info)->seg_not_present == 1 && \ | ||
| 32 | (info)->useable == 0 ) | ||
| 33 | |||
| 34 | #endif | ||
diff --git a/include/asm-um/ldt-x86_64.h b/include/asm-um/host_ldt-x86_64.h index 96b35aada79a..74a63f7d9a90 100644 --- a/include/asm-um/ldt-x86_64.h +++ b/include/asm-um/host_ldt-x86_64.h | |||
| @@ -1,43 +1,8 @@ | |||
| 1 | /* | 1 | #ifndef __ASM_HOST_LDT_X86_64_H |
| 2 | * Copyright (C) 2004 Fujitsu Siemens Computers GmbH | 2 | #define __ASM_HOST_LDT_X86_64_H |
| 3 | * Licensed under the GPL | ||
| 4 | * | ||
| 5 | * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> | ||
| 6 | */ | ||
| 7 | 3 | ||
| 8 | #ifndef __ASM_LDT_X86_64_H | ||
| 9 | #define __ASM_LDT_X86_64_H | ||
| 10 | |||
| 11 | #include "asm/semaphore.h" | ||
| 12 | #include "asm/arch/ldt.h" | 4 | #include "asm/arch/ldt.h" |
| 13 | 5 | ||
| 14 | struct mmu_context_skas; | ||
| 15 | extern void ldt_host_info(void); | ||
| 16 | extern long init_new_ldt(struct mmu_context_skas * to_mm, | ||
| 17 | struct mmu_context_skas * from_mm); | ||
| 18 | extern void free_ldt(struct mmu_context_skas * mm); | ||
| 19 | |||
| 20 | #define LDT_PAGES_MAX \ | ||
| 21 | ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) | ||
| 22 | #define LDT_ENTRIES_PER_PAGE \ | ||
| 23 | (PAGE_SIZE/LDT_ENTRY_SIZE) | ||
| 24 | #define LDT_DIRECT_ENTRIES \ | ||
| 25 | ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) | ||
| 26 | |||
| 27 | struct ldt_entry { | ||
| 28 | __u32 a; | ||
| 29 | __u32 b; | ||
| 30 | }; | ||
| 31 | |||
| 32 | typedef struct uml_ldt { | ||
| 33 | int entry_count; | ||
| 34 | struct semaphore semaphore; | ||
| 35 | union { | ||
| 36 | struct ldt_entry * pages[LDT_PAGES_MAX]; | ||
| 37 | struct ldt_entry entries[LDT_DIRECT_ENTRIES]; | ||
| 38 | } u; | ||
| 39 | } uml_ldt_t; | ||
| 40 | |||
| 41 | /* | 6 | /* |
| 42 | * macros stolen from include/asm-x86_64/desc.h | 7 | * macros stolen from include/asm-x86_64/desc.h |
| 43 | */ | 8 | */ |
diff --git a/include/asm-um/ldt-i386.h b/include/asm-um/ldt-i386.h deleted file mode 100644 index 175722a91164..000000000000 --- a/include/asm-um/ldt-i386.h +++ /dev/null | |||
| @@ -1,69 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2004 Fujitsu Siemens Computers GmbH | ||
| 3 | * Licensed under the GPL | ||
| 4 | * | ||
| 5 | * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __ASM_LDT_I386_H | ||
| 9 | #define __ASM_LDT_I386_H | ||
| 10 | |||
| 11 | #include "asm/semaphore.h" | ||
| 12 | #include "asm/arch/ldt.h" | ||
| 13 | |||
| 14 | struct mmu_context_skas; | ||
| 15 | extern void ldt_host_info(void); | ||
| 16 | extern long init_new_ldt(struct mmu_context_skas * to_mm, | ||
| 17 | struct mmu_context_skas * from_mm); | ||
| 18 | extern void free_ldt(struct mmu_context_skas * mm); | ||
| 19 | |||
| 20 | #define LDT_PAGES_MAX \ | ||
| 21 | ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) | ||
| 22 | #define LDT_ENTRIES_PER_PAGE \ | ||
| 23 | (PAGE_SIZE/LDT_ENTRY_SIZE) | ||
| 24 | #define LDT_DIRECT_ENTRIES \ | ||
| 25 | ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) | ||
| 26 | |||
| 27 | struct ldt_entry { | ||
| 28 | __u32 a; | ||
| 29 | __u32 b; | ||
| 30 | }; | ||
| 31 | |||
| 32 | typedef struct uml_ldt { | ||
| 33 | int entry_count; | ||
| 34 | struct semaphore semaphore; | ||
| 35 | union { | ||
| 36 | struct ldt_entry * pages[LDT_PAGES_MAX]; | ||
| 37 | struct ldt_entry entries[LDT_DIRECT_ENTRIES]; | ||
| 38 | } u; | ||
| 39 | } uml_ldt_t; | ||
| 40 | |||
| 41 | /* | ||
| 42 | * macros stolen from include/asm-i386/desc.h | ||
| 43 | */ | ||
| 44 | #define LDT_entry_a(info) \ | ||
| 45 | ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) | ||
| 46 | |||
| 47 | #define LDT_entry_b(info) \ | ||
| 48 | (((info)->base_addr & 0xff000000) | \ | ||
| 49 | (((info)->base_addr & 0x00ff0000) >> 16) | \ | ||
| 50 | ((info)->limit & 0xf0000) | \ | ||
| 51 | (((info)->read_exec_only ^ 1) << 9) | \ | ||
| 52 | ((info)->contents << 10) | \ | ||
| 53 | (((info)->seg_not_present ^ 1) << 15) | \ | ||
| 54 | ((info)->seg_32bit << 22) | \ | ||
| 55 | ((info)->limit_in_pages << 23) | \ | ||
| 56 | ((info)->useable << 20) | \ | ||
| 57 | 0x7000) | ||
| 58 | |||
| 59 | #define LDT_empty(info) (\ | ||
| 60 | (info)->base_addr == 0 && \ | ||
| 61 | (info)->limit == 0 && \ | ||
| 62 | (info)->contents == 0 && \ | ||
| 63 | (info)->read_exec_only == 1 && \ | ||
| 64 | (info)->seg_32bit == 0 && \ | ||
| 65 | (info)->limit_in_pages == 0 && \ | ||
| 66 | (info)->seg_not_present == 1 && \ | ||
| 67 | (info)->useable == 0 ) | ||
| 68 | |||
| 69 | #endif | ||
diff --git a/include/asm-um/ldt.h b/include/asm-um/ldt.h new file mode 100644 index 000000000000..96f82a456ce6 --- /dev/null +++ b/include/asm-um/ldt.h | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2004 Fujitsu Siemens Computers GmbH | ||
| 3 | * Licensed under the GPL | ||
| 4 | * | ||
| 5 | * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __ASM_LDT_H | ||
| 9 | #define __ASM_LDT_H | ||
| 10 | |||
| 11 | #include "asm/semaphore.h" | ||
| 12 | #include "asm/host_ldt.h" | ||
| 13 | |||
| 14 | struct mmu_context_skas; | ||
| 15 | extern void ldt_host_info(void); | ||
| 16 | extern long init_new_ldt(struct mmu_context_skas * to_mm, | ||
| 17 | struct mmu_context_skas * from_mm); | ||
| 18 | extern void free_ldt(struct mmu_context_skas * mm); | ||
| 19 | |||
| 20 | #define LDT_PAGES_MAX \ | ||
| 21 | ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) | ||
| 22 | #define LDT_ENTRIES_PER_PAGE \ | ||
| 23 | (PAGE_SIZE/LDT_ENTRY_SIZE) | ||
| 24 | #define LDT_DIRECT_ENTRIES \ | ||
| 25 | ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) | ||
| 26 | |||
| 27 | struct ldt_entry { | ||
| 28 | __u32 a; | ||
| 29 | __u32 b; | ||
| 30 | }; | ||
| 31 | |||
| 32 | typedef struct uml_ldt { | ||
| 33 | int entry_count; | ||
| 34 | struct semaphore semaphore; | ||
| 35 | union { | ||
| 36 | struct ldt_entry * pages[LDT_PAGES_MAX]; | ||
| 37 | struct ldt_entry entries[LDT_DIRECT_ENTRIES]; | ||
| 38 | } u; | ||
| 39 | } uml_ldt_t; | ||
| 40 | |||
| 41 | #endif | ||
