Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+571
+94
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
+38
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
+112
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 + }
+38
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);
+99
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); 99 +
+15
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);
+152
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 + }
+23
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);