diff options
-rw-r--r-- | arch/um/sys-x86_64/Makefile | 7 | ||||
-rw-r--r-- | arch/um/sys-x86_64/ksyms.c | 23 | ||||
-rw-r--r-- | arch/um/sys-x86_64/um_module.c | 19 | ||||
-rw-r--r-- | arch/x86_64/kernel/module.c | 4 | ||||
-rw-r--r-- | include/asm-um/elf.h | 27 |
5 files changed, 79 insertions, 1 deletions
diff --git a/arch/um/sys-x86_64/Makefile b/arch/um/sys-x86_64/Makefile index d7ed2f7908df..e60c9da8fb48 100644 --- a/arch/um/sys-x86_64/Makefile +++ b/arch/um/sys-x86_64/Makefile | |||
@@ -4,16 +4,20 @@ | |||
4 | # Licensed under the GPL | 4 | # Licensed under the GPL |
5 | # | 5 | # |
6 | 6 | ||
7 | #XXX: why into lib-y? | ||
7 | lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o mem.o memcpy.o \ | 8 | lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o mem.o memcpy.o \ |
8 | ptrace.o ptrace_user.o semaphore.o sigcontext.o signal.o \ | 9 | ptrace.o ptrace_user.o semaphore.o sigcontext.o signal.o \ |
9 | syscalls.o sysrq.o thunk.o syscall_table.o | 10 | syscalls.o sysrq.o thunk.o syscall_table.o |
10 | 11 | ||
12 | obj-y := ksyms.o | ||
13 | obj-$(CONFIG_MODULES) += module.o um_module.o | ||
14 | |||
11 | USER_OBJS := ptrace_user.o sigcontext.o | 15 | USER_OBJS := ptrace_user.o sigcontext.o |
12 | 16 | ||
13 | include arch/um/scripts/Makefile.rules | 17 | include arch/um/scripts/Makefile.rules |
14 | 18 | ||
15 | SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c memcpy.S \ | 19 | SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c memcpy.S \ |
16 | semaphore.c thunk.S | 20 | semaphore.c thunk.S module.c |
17 | 21 | ||
18 | # this needs to be before the foreach, because clean-files does not accept | 22 | # this needs to be before the foreach, because clean-files does not accept |
19 | # complete paths like $(src)/$f. | 23 | # complete paths like $(src)/$f. |
@@ -30,6 +34,7 @@ csum-wrappers.c-dir = lib | |||
30 | memcpy.S-dir = lib | 34 | memcpy.S-dir = lib |
31 | semaphore.c-dir = kernel | 35 | semaphore.c-dir = kernel |
32 | thunk.S-dir = lib | 36 | thunk.S-dir = lib |
37 | module.c-dir = kernel | ||
33 | 38 | ||
34 | $(SYMLINKS): FORCE | 39 | $(SYMLINKS): FORCE |
35 | $(call if_changed,make_link) | 40 | $(call if_changed,make_link) |
diff --git a/arch/um/sys-x86_64/ksyms.c b/arch/um/sys-x86_64/ksyms.c new file mode 100644 index 000000000000..8d30fa8393c8 --- /dev/null +++ b/arch/um/sys-x86_64/ksyms.c | |||
@@ -0,0 +1,23 @@ | |||
1 | #include "linux/module.h" | ||
2 | #include "linux/in6.h" | ||
3 | #include "linux/rwsem.h" | ||
4 | #include "asm/byteorder.h" | ||
5 | #include "asm/semaphore.h" | ||
6 | #include "asm/uaccess.h" | ||
7 | #include "asm/checksum.h" | ||
8 | #include "asm/errno.h" | ||
9 | |||
10 | EXPORT_SYMBOL(__down_failed); | ||
11 | EXPORT_SYMBOL(__down_failed_interruptible); | ||
12 | EXPORT_SYMBOL(__down_failed_trylock); | ||
13 | EXPORT_SYMBOL(__up_wakeup); | ||
14 | |||
15 | /*XXX: we need them because they would be exported by x86_64 */ | ||
16 | EXPORT_SYMBOL(__memcpy); | ||
17 | EXPORT_SYMBOL(strcmp); | ||
18 | EXPORT_SYMBOL(strcat); | ||
19 | EXPORT_SYMBOL(strcpy); | ||
20 | |||
21 | /* Networking helper routines. */ | ||
22 | /*EXPORT_SYMBOL(csum_partial_copy_from); | ||
23 | EXPORT_SYMBOL(csum_partial_copy_to);*/ | ||
diff --git a/arch/um/sys-x86_64/um_module.c b/arch/um/sys-x86_64/um_module.c new file mode 100644 index 000000000000..8b8eff1bd977 --- /dev/null +++ b/arch/um/sys-x86_64/um_module.c | |||
@@ -0,0 +1,19 @@ | |||
1 | #include <linux/vmalloc.h> | ||
2 | #include <linux/moduleloader.h> | ||
3 | |||
4 | /*Copied from i386 arch/i386/kernel/module.c */ | ||
5 | void *module_alloc(unsigned long size) | ||
6 | { | ||
7 | if (size == 0) | ||
8 | return NULL; | ||
9 | return vmalloc_exec(size); | ||
10 | } | ||
11 | |||
12 | /* Free memory returned from module_alloc */ | ||
13 | void module_free(struct module *mod, void *module_region) | ||
14 | { | ||
15 | vfree(module_region); | ||
16 | /* FIXME: If module_region == mod->init_region, trim exception | ||
17 | table entries. */ | ||
18 | } | ||
19 | |||
diff --git a/arch/x86_64/kernel/module.c b/arch/x86_64/kernel/module.c index c2ffea8845ed..bac195c74bcc 100644 --- a/arch/x86_64/kernel/module.c +++ b/arch/x86_64/kernel/module.c | |||
@@ -30,9 +30,12 @@ | |||
30 | 30 | ||
31 | #define DEBUGP(fmt...) | 31 | #define DEBUGP(fmt...) |
32 | 32 | ||
33 | #ifndef CONFIG_UML | ||
33 | void module_free(struct module *mod, void *module_region) | 34 | void module_free(struct module *mod, void *module_region) |
34 | { | 35 | { |
35 | vfree(module_region); | 36 | vfree(module_region); |
37 | /* FIXME: If module_region == mod->init_region, trim exception | ||
38 | table entries. */ | ||
36 | } | 39 | } |
37 | 40 | ||
38 | void *module_alloc(unsigned long size) | 41 | void *module_alloc(unsigned long size) |
@@ -51,6 +54,7 @@ void *module_alloc(unsigned long size) | |||
51 | 54 | ||
52 | return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC); | 55 | return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC); |
53 | } | 56 | } |
57 | #endif | ||
54 | 58 | ||
55 | /* We don't need anything special. */ | 59 | /* We don't need anything special. */ |
56 | int module_frob_arch_sections(Elf_Ehdr *hdr, | 60 | int module_frob_arch_sections(Elf_Ehdr *hdr, |
diff --git a/include/asm-um/elf.h b/include/asm-um/elf.h index 7908f8fe8231..d41112bfb299 100644 --- a/include/asm-um/elf.h +++ b/include/asm-um/elf.h | |||
@@ -21,6 +21,8 @@ extern long elf_aux_hwcap; | |||
21 | 21 | ||
22 | #define USE_ELF_CORE_DUMP | 22 | #define USE_ELF_CORE_DUMP |
23 | 23 | ||
24 | #if defined(CONFIG_UML_X86) && !defined(CONFIG_64BIT) | ||
25 | |||
24 | #define R_386_NONE 0 | 26 | #define R_386_NONE 0 |
25 | #define R_386_32 1 | 27 | #define R_386_32 1 |
26 | #define R_386_PC32 2 | 28 | #define R_386_PC32 2 |
@@ -34,4 +36,29 @@ extern long elf_aux_hwcap; | |||
34 | #define R_386_GOTPC 10 | 36 | #define R_386_GOTPC 10 |
35 | #define R_386_NUM 11 | 37 | #define R_386_NUM 11 |
36 | 38 | ||
39 | #elif defined(CONFIG_UML_X86) && defined(CONFIG_64BIT) | ||
40 | |||
41 | /* x86-64 relocation types */ | ||
42 | #define R_X86_64_NONE 0 /* No reloc */ | ||
43 | #define R_X86_64_64 1 /* Direct 64 bit */ | ||
44 | #define R_X86_64_PC32 2 /* PC relative 32 bit signed */ | ||
45 | #define R_X86_64_GOT32 3 /* 32 bit GOT entry */ | ||
46 | #define R_X86_64_PLT32 4 /* 32 bit PLT address */ | ||
47 | #define R_X86_64_COPY 5 /* Copy symbol at runtime */ | ||
48 | #define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ | ||
49 | #define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ | ||
50 | #define R_X86_64_RELATIVE 8 /* Adjust by program base */ | ||
51 | #define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative | ||
52 | offset to GOT */ | ||
53 | #define R_X86_64_32 10 /* Direct 32 bit zero extended */ | ||
54 | #define R_X86_64_32S 11 /* Direct 32 bit sign extended */ | ||
55 | #define R_X86_64_16 12 /* Direct 16 bit zero extended */ | ||
56 | #define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ | ||
57 | #define R_X86_64_8 14 /* Direct 8 bit sign extended */ | ||
58 | #define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ | ||
59 | |||
60 | #define R_X86_64_NUM 16 | ||
61 | |||
62 | #endif | ||
63 | |||
37 | #endif | 64 | #endif |