Commit 87c1a3fb7c07322dfd63a63dd6d42339ad52ddee
1 parent
790edb61c0
Exists in
master
and in
7 other branches
unicore32 core architecture: generic elf and ksyms stuff
This patch includes some generic stuff including elf and ksyms. Because all one-line asm-generic headers are auto-generated by ASM_GENERIC_HEADERS in arch/unicore32/Makefile, so the rest seems very little. ELF handling functions and module handling functions are also here. Signed-off-by: Guan Xuetao <gxt@mprc.pku.edu.cn> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Showing 8 changed files with 571 additions and 0 deletions Side-by-side Diff
arch/unicore32/include/asm/elf.h
1 | +/* | |
2 | + * linux/arch/unicore32/include/asm/elf.h | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | + | |
13 | +#ifndef __UNICORE_ELF_H__ | |
14 | +#define __UNICORE_ELF_H__ | |
15 | + | |
16 | +#include <asm/hwcap.h> | |
17 | + | |
18 | +/* | |
19 | + * ELF register definitions.. | |
20 | + */ | |
21 | +#include <asm/ptrace.h> | |
22 | + | |
23 | +typedef unsigned long elf_greg_t; | |
24 | +typedef unsigned long elf_freg_t[3]; | |
25 | + | |
26 | +#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) | |
27 | +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | |
28 | + | |
29 | +typedef struct fp_state elf_fpregset_t; | |
30 | + | |
31 | +#define EM_UNICORE 110 | |
32 | + | |
33 | +#define R_UNICORE_NONE 0 | |
34 | +#define R_UNICORE_PC24 1 | |
35 | +#define R_UNICORE_ABS32 2 | |
36 | +#define R_UNICORE_CALL 28 | |
37 | +#define R_UNICORE_JUMP24 29 | |
38 | + | |
39 | +/* | |
40 | + * These are used to set parameters in the core dumps. | |
41 | + */ | |
42 | +#define ELF_CLASS ELFCLASS32 | |
43 | +#define ELF_DATA ELFDATA2LSB | |
44 | +#define ELF_ARCH EM_UNICORE | |
45 | + | |
46 | +/* | |
47 | + * This yields a string that ld.so will use to load implementation | |
48 | + * specific libraries for optimization. This is more specific in | |
49 | + * intent than poking at uname or /proc/cpuinfo. | |
50 | + * | |
51 | + */ | |
52 | +#define ELF_PLATFORM_SIZE 8 | |
53 | +#define ELF_PLATFORM (elf_platform) | |
54 | + | |
55 | +extern char elf_platform[]; | |
56 | + | |
57 | +struct elf32_hdr; | |
58 | + | |
59 | +/* | |
60 | + * This is used to ensure we don't load something for the wrong architecture. | |
61 | + */ | |
62 | +extern int elf_check_arch(const struct elf32_hdr *); | |
63 | +#define elf_check_arch elf_check_arch | |
64 | + | |
65 | +struct task_struct; | |
66 | +int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | |
67 | +#define ELF_CORE_COPY_TASK_REGS dump_task_regs | |
68 | + | |
69 | +#define ELF_EXEC_PAGESIZE 4096 | |
70 | + | |
71 | +/* This is the location that an ET_DYN program is loaded if exec'ed. Typical | |
72 | + use of this is to invoke "./ld.so someprog" to test out a new version of | |
73 | + the loader. We need to make sure that it is out of the way of the program | |
74 | + that it will "exec", and that there is sufficient room for the brk. */ | |
75 | + | |
76 | +#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | |
77 | + | |
78 | +/* When the program starts, a1 contains a pointer to a function to be | |
79 | + registered with atexit, as per the SVR4 ABI. A value of 0 means we | |
80 | + have no such handler. */ | |
81 | +#define ELF_PLAT_INIT(_r, load_addr) {(_r)->UCreg_00 = 0; } | |
82 | + | |
83 | +extern void elf_set_personality(const struct elf32_hdr *); | |
84 | +#define SET_PERSONALITY(ex) elf_set_personality(&(ex)) | |
85 | + | |
86 | +struct mm_struct; | |
87 | +extern unsigned long arch_randomize_brk(struct mm_struct *mm); | |
88 | +#define arch_randomize_brk arch_randomize_brk | |
89 | + | |
90 | +extern int vectors_user_mapping(void); | |
91 | +#define arch_setup_additional_pages(bprm, uses_interp) vectors_user_mapping() | |
92 | +#define ARCH_HAS_SETUP_ADDITIONAL_PAGES | |
93 | + | |
94 | +#endif |
arch/unicore32/include/asm/string.h
1 | +/* | |
2 | + * linux/arch/unicore32/include/asm/string.h | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | +#ifndef __UNICORE_STRING_H__ | |
13 | +#define __UNICORE_STRING_H__ | |
14 | + | |
15 | +/* | |
16 | + * We don't do inline string functions, since the | |
17 | + * optimised inline asm versions are not small. | |
18 | + */ | |
19 | + | |
20 | +#define __HAVE_ARCH_STRRCHR | |
21 | +extern char *strrchr(const char *s, int c); | |
22 | + | |
23 | +#define __HAVE_ARCH_STRCHR | |
24 | +extern char *strchr(const char *s, int c); | |
25 | + | |
26 | +#define __HAVE_ARCH_MEMCPY | |
27 | +extern void *memcpy(void *, const void *, __kernel_size_t); | |
28 | + | |
29 | +#define __HAVE_ARCH_MEMMOVE | |
30 | +extern void *memmove(void *, const void *, __kernel_size_t); | |
31 | + | |
32 | +#define __HAVE_ARCH_MEMCHR | |
33 | +extern void *memchr(const void *, int, __kernel_size_t); | |
34 | + | |
35 | +#define __HAVE_ARCH_MEMSET | |
36 | +extern void *memset(void *, int, __kernel_size_t); | |
37 | + | |
38 | +#endif |
arch/unicore32/kernel/asm-offsets.c
1 | +/* | |
2 | + * linux/arch/unicore32/kernel/asm-offsets.c | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * Generate definitions needed by assembly language modules. | |
9 | + * This code generates raw asm output which is post-processed to extract | |
10 | + * and format the required data. | |
11 | + * | |
12 | + * This program is free software; you can redistribute it and/or modify | |
13 | + * it under the terms of the GNU General Public License version 2 as | |
14 | + * published by the Free Software Foundation. | |
15 | + */ | |
16 | +#include <linux/sched.h> | |
17 | +#include <linux/mm.h> | |
18 | +#include <linux/dma-mapping.h> | |
19 | +#include <linux/kbuild.h> | |
20 | +#include <linux/suspend.h> | |
21 | +#include <linux/thread_info.h> | |
22 | +#include <asm/memory.h> | |
23 | +#include <asm/suspend.h> | |
24 | + | |
25 | +/* | |
26 | + * GCC 3.0, 3.1: general bad code generation. | |
27 | + * GCC 3.2.0: incorrect function argument offset calculation. | |
28 | + * GCC 3.2.x: miscompiles NEW_AUX_ENT in fs/binfmt_elf.c | |
29 | + * (http://gcc.gnu.org/PR8896) and incorrect structure | |
30 | + * initialisation in fs/jffs2/erase.c | |
31 | + */ | |
32 | +#if (__GNUC__ < 4) | |
33 | +#error Your compiler should upgrade to uc4 | |
34 | +#error Known good compilers: 4.2.2 | |
35 | +#endif | |
36 | + | |
37 | +int main(void) | |
38 | +{ | |
39 | + DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); | |
40 | + BLANK(); | |
41 | + DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); | |
42 | + DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); | |
43 | + DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); | |
44 | + DEFINE(TI_TASK, offsetof(struct thread_info, task)); | |
45 | + DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain)); | |
46 | + DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); | |
47 | + DEFINE(TI_CPU_SAVE, offsetof(struct thread_info, cpu_context)); | |
48 | + DEFINE(TI_USED_CP, offsetof(struct thread_info, used_cp)); | |
49 | +#ifdef CONFIG_UNICORE_FPU_F64 | |
50 | + DEFINE(TI_FPSTATE, offsetof(struct thread_info, fpstate)); | |
51 | +#endif | |
52 | + BLANK(); | |
53 | + DEFINE(S_R0, offsetof(struct pt_regs, UCreg_00)); | |
54 | + DEFINE(S_R1, offsetof(struct pt_regs, UCreg_01)); | |
55 | + DEFINE(S_R2, offsetof(struct pt_regs, UCreg_02)); | |
56 | + DEFINE(S_R3, offsetof(struct pt_regs, UCreg_03)); | |
57 | + DEFINE(S_R4, offsetof(struct pt_regs, UCreg_04)); | |
58 | + DEFINE(S_R5, offsetof(struct pt_regs, UCreg_05)); | |
59 | + DEFINE(S_R6, offsetof(struct pt_regs, UCreg_06)); | |
60 | + DEFINE(S_R7, offsetof(struct pt_regs, UCreg_07)); | |
61 | + DEFINE(S_R8, offsetof(struct pt_regs, UCreg_08)); | |
62 | + DEFINE(S_R9, offsetof(struct pt_regs, UCreg_09)); | |
63 | + DEFINE(S_R10, offsetof(struct pt_regs, UCreg_10)); | |
64 | + DEFINE(S_R11, offsetof(struct pt_regs, UCreg_11)); | |
65 | + DEFINE(S_R12, offsetof(struct pt_regs, UCreg_12)); | |
66 | + DEFINE(S_R13, offsetof(struct pt_regs, UCreg_13)); | |
67 | + DEFINE(S_R14, offsetof(struct pt_regs, UCreg_14)); | |
68 | + DEFINE(S_R15, offsetof(struct pt_regs, UCreg_15)); | |
69 | + DEFINE(S_R16, offsetof(struct pt_regs, UCreg_16)); | |
70 | + DEFINE(S_R17, offsetof(struct pt_regs, UCreg_17)); | |
71 | + DEFINE(S_R18, offsetof(struct pt_regs, UCreg_18)); | |
72 | + DEFINE(S_R19, offsetof(struct pt_regs, UCreg_19)); | |
73 | + DEFINE(S_R20, offsetof(struct pt_regs, UCreg_20)); | |
74 | + DEFINE(S_R21, offsetof(struct pt_regs, UCreg_21)); | |
75 | + DEFINE(S_R22, offsetof(struct pt_regs, UCreg_22)); | |
76 | + DEFINE(S_R23, offsetof(struct pt_regs, UCreg_23)); | |
77 | + DEFINE(S_R24, offsetof(struct pt_regs, UCreg_24)); | |
78 | + DEFINE(S_R25, offsetof(struct pt_regs, UCreg_25)); | |
79 | + DEFINE(S_R26, offsetof(struct pt_regs, UCreg_26)); | |
80 | + DEFINE(S_FP, offsetof(struct pt_regs, UCreg_fp)); | |
81 | + DEFINE(S_IP, offsetof(struct pt_regs, UCreg_ip)); | |
82 | + DEFINE(S_SP, offsetof(struct pt_regs, UCreg_sp)); | |
83 | + DEFINE(S_LR, offsetof(struct pt_regs, UCreg_lr)); | |
84 | + DEFINE(S_PC, offsetof(struct pt_regs, UCreg_pc)); | |
85 | + DEFINE(S_PSR, offsetof(struct pt_regs, UCreg_asr)); | |
86 | + DEFINE(S_OLD_R0, offsetof(struct pt_regs, UCreg_ORIG_00)); | |
87 | + DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs)); | |
88 | + BLANK(); | |
89 | + DEFINE(VMA_VM_MM, offsetof(struct vm_area_struct, vm_mm)); | |
90 | + DEFINE(VMA_VM_FLAGS, offsetof(struct vm_area_struct, vm_flags)); | |
91 | + BLANK(); | |
92 | + DEFINE(VM_EXEC, VM_EXEC); | |
93 | + BLANK(); | |
94 | + DEFINE(PAGE_SZ, PAGE_SIZE); | |
95 | + BLANK(); | |
96 | + DEFINE(SYS_ERROR0, 0x9f0000); | |
97 | + BLANK(); | |
98 | + DEFINE(PBE_ADDRESS, offsetof(struct pbe, address)); | |
99 | + DEFINE(PBE_ORIN_ADDRESS, offsetof(struct pbe, orig_address)); | |
100 | + DEFINE(PBE_NEXT, offsetof(struct pbe, next)); | |
101 | + DEFINE(SWSUSP_CPU, offsetof(struct swsusp_arch_regs, \ | |
102 | + cpu_context)); | |
103 | +#ifdef CONFIG_UNICORE_FPU_F64 | |
104 | + DEFINE(SWSUSP_FPSTATE, offsetof(struct swsusp_arch_regs, \ | |
105 | + fpstate)); | |
106 | +#endif | |
107 | + BLANK(); | |
108 | + DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL); | |
109 | + DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE); | |
110 | + DEFINE(DMA_FROM_DEVICE, DMA_FROM_DEVICE); | |
111 | + return 0; | |
112 | +} |
arch/unicore32/kernel/elf.c
1 | +/* | |
2 | + * linux/arch/unicore32/kernel/elf.c | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | +#include <linux/module.h> | |
13 | +#include <linux/sched.h> | |
14 | +#include <linux/personality.h> | |
15 | +#include <linux/binfmts.h> | |
16 | +#include <linux/elf.h> | |
17 | + | |
18 | +int elf_check_arch(const struct elf32_hdr *x) | |
19 | +{ | |
20 | + /* Make sure it's an UniCore executable */ | |
21 | + if (x->e_machine != EM_UNICORE) | |
22 | + return 0; | |
23 | + | |
24 | + /* Make sure the entry address is reasonable */ | |
25 | + if (x->e_entry & 3) | |
26 | + return 0; | |
27 | + | |
28 | + return 1; | |
29 | +} | |
30 | +EXPORT_SYMBOL(elf_check_arch); | |
31 | + | |
32 | +void elf_set_personality(const struct elf32_hdr *x) | |
33 | +{ | |
34 | + unsigned int personality = PER_LINUX; | |
35 | + | |
36 | + set_personality(personality); | |
37 | +} | |
38 | +EXPORT_SYMBOL(elf_set_personality); |
arch/unicore32/kernel/ksyms.c
1 | +/* | |
2 | + * linux/arch/unicore32/kernel/ksyms.c | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | +#include <linux/module.h> | |
13 | +#include <linux/sched.h> | |
14 | +#include <linux/string.h> | |
15 | +#include <linux/cryptohash.h> | |
16 | +#include <linux/delay.h> | |
17 | +#include <linux/in6.h> | |
18 | +#include <linux/syscalls.h> | |
19 | +#include <linux/uaccess.h> | |
20 | +#include <linux/io.h> | |
21 | + | |
22 | +#include <asm/checksum.h> | |
23 | +#include <asm/system.h> | |
24 | + | |
25 | +#include "ksyms.h" | |
26 | + | |
27 | +EXPORT_SYMBOL(__uc32_find_next_zero_bit); | |
28 | +EXPORT_SYMBOL(__uc32_find_next_bit); | |
29 | + | |
30 | +EXPORT_SYMBOL(__backtrace); | |
31 | + | |
32 | + /* platform dependent support */ | |
33 | +EXPORT_SYMBOL(__udelay); | |
34 | +EXPORT_SYMBOL(__const_udelay); | |
35 | + | |
36 | + /* networking */ | |
37 | +EXPORT_SYMBOL(csum_partial); | |
38 | +EXPORT_SYMBOL(csum_partial_copy_from_user); | |
39 | +EXPORT_SYMBOL(csum_partial_copy_nocheck); | |
40 | +EXPORT_SYMBOL(__csum_ipv6_magic); | |
41 | + | |
42 | + /* io */ | |
43 | +#ifndef __raw_readsb | |
44 | +EXPORT_SYMBOL(__raw_readsb); | |
45 | +#endif | |
46 | +#ifndef __raw_readsw | |
47 | +EXPORT_SYMBOL(__raw_readsw); | |
48 | +#endif | |
49 | +#ifndef __raw_readsl | |
50 | +EXPORT_SYMBOL(__raw_readsl); | |
51 | +#endif | |
52 | +#ifndef __raw_writesb | |
53 | +EXPORT_SYMBOL(__raw_writesb); | |
54 | +#endif | |
55 | +#ifndef __raw_writesw | |
56 | +EXPORT_SYMBOL(__raw_writesw); | |
57 | +#endif | |
58 | +#ifndef __raw_writesl | |
59 | +EXPORT_SYMBOL(__raw_writesl); | |
60 | +#endif | |
61 | + | |
62 | + /* string / mem functions */ | |
63 | +EXPORT_SYMBOL(strchr); | |
64 | +EXPORT_SYMBOL(strrchr); | |
65 | +EXPORT_SYMBOL(memset); | |
66 | +EXPORT_SYMBOL(memcpy); | |
67 | +EXPORT_SYMBOL(memmove); | |
68 | +EXPORT_SYMBOL(memchr); | |
69 | + | |
70 | + /* user mem (segment) */ | |
71 | +EXPORT_SYMBOL(__strnlen_user); | |
72 | +EXPORT_SYMBOL(__strncpy_from_user); | |
73 | + | |
74 | +EXPORT_SYMBOL(copy_page); | |
75 | + | |
76 | +EXPORT_SYMBOL(__copy_from_user); | |
77 | +EXPORT_SYMBOL(__copy_to_user); | |
78 | +EXPORT_SYMBOL(__clear_user); | |
79 | + | |
80 | +EXPORT_SYMBOL(__get_user_1); | |
81 | +EXPORT_SYMBOL(__get_user_2); | |
82 | +EXPORT_SYMBOL(__get_user_4); | |
83 | + | |
84 | +EXPORT_SYMBOL(__put_user_1); | |
85 | +EXPORT_SYMBOL(__put_user_2); | |
86 | +EXPORT_SYMBOL(__put_user_4); | |
87 | +EXPORT_SYMBOL(__put_user_8); | |
88 | + | |
89 | +EXPORT_SYMBOL(__ashldi3); | |
90 | +EXPORT_SYMBOL(__ashrdi3); | |
91 | +EXPORT_SYMBOL(__divsi3); | |
92 | +EXPORT_SYMBOL(__lshrdi3); | |
93 | +EXPORT_SYMBOL(__modsi3); | |
94 | +EXPORT_SYMBOL(__muldi3); | |
95 | +EXPORT_SYMBOL(__ucmpdi2); | |
96 | +EXPORT_SYMBOL(__udivsi3); | |
97 | +EXPORT_SYMBOL(__umodsi3); | |
98 | +EXPORT_SYMBOL(__bswapsi2); |
arch/unicore32/kernel/ksyms.h
1 | +/* | |
2 | + * libgcc functions - functions that are used internally by the | |
3 | + * compiler... (prototypes are not correct though, but that | |
4 | + * doesn't really matter since they're not versioned). | |
5 | + */ | |
6 | +extern void __ashldi3(void); | |
7 | +extern void __ashrdi3(void); | |
8 | +extern void __divsi3(void); | |
9 | +extern void __lshrdi3(void); | |
10 | +extern void __modsi3(void); | |
11 | +extern void __muldi3(void); | |
12 | +extern void __ucmpdi2(void); | |
13 | +extern void __udivsi3(void); | |
14 | +extern void __umodsi3(void); | |
15 | +extern void __bswapsi2(void); |
arch/unicore32/kernel/module.c
1 | +/* | |
2 | + * linux/arch/unicore32/kernel/module.c | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | +#include <linux/module.h> | |
13 | +#include <linux/moduleloader.h> | |
14 | +#include <linux/kernel.h> | |
15 | +#include <linux/mm.h> | |
16 | +#include <linux/elf.h> | |
17 | +#include <linux/vmalloc.h> | |
18 | +#include <linux/fs.h> | |
19 | +#include <linux/string.h> | |
20 | +#include <linux/gfp.h> | |
21 | + | |
22 | +#include <asm/pgtable.h> | |
23 | +#include <asm/sections.h> | |
24 | + | |
25 | +void *module_alloc(unsigned long size) | |
26 | +{ | |
27 | + struct vm_struct *area; | |
28 | + | |
29 | + size = PAGE_ALIGN(size); | |
30 | + if (!size) | |
31 | + return NULL; | |
32 | + | |
33 | + area = __get_vm_area(size, VM_ALLOC, MODULES_VADDR, MODULES_END); | |
34 | + if (!area) | |
35 | + return NULL; | |
36 | + | |
37 | + return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC); | |
38 | +} | |
39 | + | |
40 | +void module_free(struct module *module, void *region) | |
41 | +{ | |
42 | + vfree(region); | |
43 | +} | |
44 | + | |
45 | +int module_frob_arch_sections(Elf_Ehdr *hdr, | |
46 | + Elf_Shdr *sechdrs, | |
47 | + char *secstrings, | |
48 | + struct module *mod) | |
49 | +{ | |
50 | + return 0; | |
51 | +} | |
52 | + | |
53 | +int | |
54 | +apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |
55 | + unsigned int relindex, struct module *module) | |
56 | +{ | |
57 | + Elf32_Shdr *symsec = sechdrs + symindex; | |
58 | + Elf32_Shdr *relsec = sechdrs + relindex; | |
59 | + Elf32_Shdr *dstsec = sechdrs + relsec->sh_info; | |
60 | + Elf32_Rel *rel = (void *)relsec->sh_addr; | |
61 | + unsigned int i; | |
62 | + | |
63 | + for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { | |
64 | + unsigned long loc; | |
65 | + Elf32_Sym *sym; | |
66 | + s32 offset; | |
67 | + | |
68 | + offset = ELF32_R_SYM(rel->r_info); | |
69 | + if (offset < 0 || offset > | |
70 | + (symsec->sh_size / sizeof(Elf32_Sym))) { | |
71 | + printk(KERN_ERR "%s: bad relocation, " | |
72 | + "section %d reloc %d\n", | |
73 | + module->name, relindex, i); | |
74 | + return -ENOEXEC; | |
75 | + } | |
76 | + | |
77 | + sym = ((Elf32_Sym *)symsec->sh_addr) + offset; | |
78 | + | |
79 | + if (rel->r_offset < 0 || rel->r_offset > | |
80 | + dstsec->sh_size - sizeof(u32)) { | |
81 | + printk(KERN_ERR "%s: out of bounds relocation, " | |
82 | + "section %d reloc %d offset %d size %d\n", | |
83 | + module->name, relindex, i, rel->r_offset, | |
84 | + dstsec->sh_size); | |
85 | + return -ENOEXEC; | |
86 | + } | |
87 | + | |
88 | + loc = dstsec->sh_addr + rel->r_offset; | |
89 | + | |
90 | + switch (ELF32_R_TYPE(rel->r_info)) { | |
91 | + case R_UNICORE_NONE: | |
92 | + /* ignore */ | |
93 | + break; | |
94 | + | |
95 | + case R_UNICORE_ABS32: | |
96 | + *(u32 *)loc += sym->st_value; | |
97 | + break; | |
98 | + | |
99 | + case R_UNICORE_PC24: | |
100 | + case R_UNICORE_CALL: | |
101 | + case R_UNICORE_JUMP24: | |
102 | + offset = (*(u32 *)loc & 0x00ffffff) << 2; | |
103 | + if (offset & 0x02000000) | |
104 | + offset -= 0x04000000; | |
105 | + | |
106 | + offset += sym->st_value - loc; | |
107 | + if (offset & 3 || | |
108 | + offset <= (s32)0xfe000000 || | |
109 | + offset >= (s32)0x02000000) { | |
110 | + printk(KERN_ERR | |
111 | + "%s: relocation out of range, section " | |
112 | + "%d reloc %d sym '%s'\n", module->name, | |
113 | + relindex, i, strtab + sym->st_name); | |
114 | + return -ENOEXEC; | |
115 | + } | |
116 | + | |
117 | + offset >>= 2; | |
118 | + | |
119 | + *(u32 *)loc &= 0xff000000; | |
120 | + *(u32 *)loc |= offset & 0x00ffffff; | |
121 | + break; | |
122 | + | |
123 | + default: | |
124 | + printk(KERN_ERR "%s: unknown relocation: %u\n", | |
125 | + module->name, ELF32_R_TYPE(rel->r_info)); | |
126 | + return -ENOEXEC; | |
127 | + } | |
128 | + } | |
129 | + return 0; | |
130 | +} | |
131 | + | |
132 | +int | |
133 | +apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |
134 | + unsigned int symindex, unsigned int relsec, | |
135 | + struct module *module) | |
136 | +{ | |
137 | + printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", | |
138 | + module->name); | |
139 | + return -ENOEXEC; | |
140 | +} | |
141 | + | |
142 | +int | |
143 | +module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | |
144 | + struct module *module) | |
145 | +{ | |
146 | + return 0; | |
147 | +} | |
148 | + | |
149 | +void | |
150 | +module_arch_cleanup(struct module *mod) | |
151 | +{ | |
152 | +} |
arch/unicore32/mm/proc-syms.c
1 | +/* | |
2 | + * linux/arch/unicore32/mm/proc-syms.c | |
3 | + * | |
4 | + * Code specific to PKUnity SoC and UniCore ISA | |
5 | + * | |
6 | + * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License version 2 as | |
10 | + * published by the Free Software Foundation. | |
11 | + */ | |
12 | +#include <linux/module.h> | |
13 | +#include <linux/mm.h> | |
14 | + | |
15 | +#include <asm/cacheflush.h> | |
16 | +#include <asm/tlbflush.h> | |
17 | +#include <asm/page.h> | |
18 | + | |
19 | +EXPORT_SYMBOL(cpu_dcache_clean_area); | |
20 | +EXPORT_SYMBOL(cpu_set_pte); | |
21 | + | |
22 | +EXPORT_SYMBOL(__cpuc_dma_flush_range); | |
23 | +EXPORT_SYMBOL(__cpuc_dma_clean_range); |