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

[PATCH] frv: implement and export various things required by modules

Export a number of features required to build all the modules. It also
implements the following simple features:

(*) csum_partial_copy_from_user() for MMU as well as no-MMU.

(*) __ucmpdi2().

so that they can be exported too.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

David Howells and committed by
Linus Torvalds
40234401 8369ce4c

+155 -14
+18 -7
arch/frv/kernel/frv_ksyms.c
··· 16 16 #include <asm/semaphore.h> 17 17 #include <asm/checksum.h> 18 18 #include <asm/hardirq.h> 19 - #include <asm/current.h> 19 + #include <asm/cacheflush.h> 20 20 21 21 extern void dump_thread(struct pt_regs *, struct user *); 22 22 extern long __memcpy_user(void *dst, const void *src, size_t count); 23 + extern long __memset_user(void *dst, const void *src, size_t count); 23 24 24 25 /* platform dependent support */ 25 26 ··· 51 50 EXPORT_SYMBOL(__res_bus_clock_speed_HZ); 52 51 EXPORT_SYMBOL(__page_offset); 53 52 EXPORT_SYMBOL(__memcpy_user); 54 - EXPORT_SYMBOL(flush_dcache_page); 53 + EXPORT_SYMBOL(__memset_user); 54 + EXPORT_SYMBOL(frv_dcache_writeback); 55 + EXPORT_SYMBOL(frv_cache_invalidate); 56 + EXPORT_SYMBOL(frv_icache_invalidate); 57 + EXPORT_SYMBOL(frv_cache_wback_inv); 55 58 56 59 #ifndef CONFIG_MMU 57 60 EXPORT_SYMBOL(memory_start); ··· 77 72 EXPORT_SYMBOL(memscan); 78 73 EXPORT_SYMBOL(memmove); 79 74 75 + EXPORT_SYMBOL(__outsl_ns); 76 + EXPORT_SYMBOL(__insl_ns); 77 + 80 78 EXPORT_SYMBOL(get_wchan); 81 79 82 80 #ifdef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS ··· 88 80 EXPORT_SYMBOL(atomic_test_and_XOR_mask); 89 81 EXPORT_SYMBOL(atomic_add_return); 90 82 EXPORT_SYMBOL(atomic_sub_return); 91 - EXPORT_SYMBOL(__xchg_8); 92 - EXPORT_SYMBOL(__xchg_16); 93 83 EXPORT_SYMBOL(__xchg_32); 94 - EXPORT_SYMBOL(__cmpxchg_8); 95 - EXPORT_SYMBOL(__cmpxchg_16); 96 84 EXPORT_SYMBOL(__cmpxchg_32); 97 85 #endif 86 + 87 + EXPORT_SYMBOL(__debug_bug_printk); 88 + EXPORT_SYMBOL(__delay_loops_MHz); 98 89 99 90 /* 100 91 * libgcc functions - functions that are used internally by the ··· 108 101 extern void __lshrdi3(void); 109 102 extern void __moddi3(void); 110 103 extern void __muldi3(void); 104 + extern void __mulll(void); 105 + extern void __umulll(void); 111 106 extern void __negdi2(void); 112 107 extern void __ucmpdi2(void); 113 108 extern void __udivdi3(void); ··· 125 116 EXPORT_SYMBOL(__lshrdi3); 126 117 //EXPORT_SYMBOL(__moddi3); 127 118 EXPORT_SYMBOL(__muldi3); 119 + EXPORT_SYMBOL(__mulll); 120 + EXPORT_SYMBOL(__umulll); 128 121 EXPORT_SYMBOL(__negdi2); 129 - //EXPORT_SYMBOL(__ucmpdi2); 122 + EXPORT_SYMBOL(__ucmpdi2); 130 123 //EXPORT_SYMBOL(__udivdi3); 131 124 //EXPORT_SYMBOL(__udivmoddi4); 132 125 //EXPORT_SYMBOL(__umoddi3);
+17
arch/frv/kernel/irq.c
··· 32 32 #include <linux/irq.h> 33 33 #include <linux/proc_fs.h> 34 34 #include <linux/seq_file.h> 35 + #include <linux/module.h> 35 36 36 37 #include <asm/atomic.h> 37 38 #include <asm/io.h> ··· 179 178 spin_unlock_irqrestore(&level->lock, flags); 180 179 } 181 180 181 + EXPORT_SYMBOL(disable_irq_nosync); 182 + 182 183 /** 183 184 * disable_irq - disable an irq and wait for completion 184 185 * @irq: Interrupt to disable ··· 206 203 } 207 204 #endif 208 205 } 206 + 207 + EXPORT_SYMBOL(disable_irq); 209 208 210 209 /** 211 210 * enable_irq - enable handling of an irq ··· 272 267 273 268 spin_unlock_irqrestore(&level->lock, flags); 274 269 } 270 + 271 + EXPORT_SYMBOL(enable_irq); 275 272 276 273 /*****************************************************************************/ 277 274 /* ··· 432 425 return retval; 433 426 } 434 427 428 + EXPORT_SYMBOL(request_irq); 429 + 435 430 /** 436 431 * free_irq - free an interrupt 437 432 * @irq: Interrupt line to free ··· 505 496 } 506 497 } 507 498 499 + EXPORT_SYMBOL(free_irq); 500 + 508 501 /* 509 502 * IRQ autodetection code.. 510 503 * ··· 530 519 return 0; 531 520 } 532 521 522 + EXPORT_SYMBOL(probe_irq_on); 523 + 533 524 /* 534 525 * Return a mask of triggered interrupts (this 535 526 * can handle only legacy ISA interrupts). ··· 554 541 up(&probe_sem); 555 542 return 0; 556 543 } 544 + 545 + EXPORT_SYMBOL(probe_irq_mask); 557 546 558 547 /* 559 548 * Return the one interrupt that triggered (this can ··· 585 570 up(&probe_sem); 586 571 return -1; 587 572 } 573 + 574 + EXPORT_SYMBOL(probe_irq_off); 588 575 589 576 /* this was setup_x86_irq but it seems pretty generic */ 590 577 int setup_irq(unsigned int irq, struct irqaction *new)
+2
arch/frv/kernel/pm.c
··· 13 13 14 14 #include <linux/config.h> 15 15 #include <linux/init.h> 16 + #include <linux/module.h> 16 17 #include <linux/pm.h> 17 18 #include <linux/pm_legacy.h> 18 19 #include <linux/sched.h> ··· 28 27 #include "local.h" 29 28 30 29 void (*pm_power_off)(void); 30 + EXPORT_SYMBOL(pm_power_off); 31 31 32 32 extern void frv_change_cmode(int); 33 33
+3
arch/frv/kernel/time.c
··· 189 189 tv->tv_usec = usec; 190 190 } 191 191 192 + EXPORT_SYMBOL(do_gettimeofday); 193 + 192 194 int do_settimeofday(struct timespec *tv) 193 195 { 194 196 time_t wtm_sec, sec = tv->tv_sec; ··· 220 218 clock_was_set(); 221 219 return 0; 222 220 } 221 + 223 222 EXPORT_SYMBOL(do_settimeofday); 224 223 225 224 /*
+3
arch/frv/kernel/traps.c
··· 19 19 #include <linux/string.h> 20 20 #include <linux/linkage.h> 21 21 #include <linux/init.h> 22 + #include <linux/module.h> 22 23 23 24 #include <asm/setup.h> 24 25 #include <asm/fpu.h> ··· 250 249 { 251 250 show_stack(NULL, NULL); 252 251 } 252 + 253 + EXPORT_SYMBOL(dump_stack); 253 254 254 255 void show_stack(struct task_struct *task, unsigned long *sp) 255 256 {
+7
arch/frv/kernel/uaccess.c
··· 10 10 */ 11 11 12 12 #include <linux/mm.h> 13 + #include <linux/module.h> 13 14 #include <asm/uaccess.h> 14 15 15 16 /*****************************************************************************/ ··· 59 58 memset(p, 0, count); /* clear remainder of buffer [security] */ 60 59 61 60 return err; 61 + 62 62 } /* end strncpy_from_user() */ 63 + 64 + EXPORT_SYMBOL(strncpy_from_user); 63 65 64 66 /*****************************************************************************/ 65 67 /* ··· 96 92 } 97 93 98 94 return p - src + 1; /* return length including NUL */ 95 + 99 96 } /* end strnlen_user() */ 97 + 98 + EXPORT_SYMBOL(strnlen_user);
+1 -1
arch/frv/lib/Makefile
··· 3 3 # 4 4 5 5 lib-y := \ 6 - __ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o \ 6 + __ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \ 7 7 checksum.o memcpy.o memset.o atomic-ops.o \ 8 8 outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o
+45
arch/frv/lib/__ucmpdi2.S
··· 1 + /* __ucmpdi2.S: 64-bit unsigned compare 2 + * 3 + * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. 4 + * Written by David Howells (dhowells@redhat.com) 5 + * 6 + * This program is free software; you can redistribute it and/or 7 + * modify it under the terms of the GNU General Public License 8 + * as published by the Free Software Foundation; either version 9 + * 2 of the License, or (at your option) any later version. 10 + */ 11 + 12 + 13 + .text 14 + .p2align 4 15 + 16 + ############################################################################### 17 + # 18 + # int __ucmpdi2(unsigned long long a [GR8:GR9], 19 + # unsigned long long b [GR10:GR11]) 20 + # 21 + # - returns 0, 1, or 2 as a <, =, > b respectively. 22 + # 23 + ############################################################################### 24 + .globl __ucmpdi2 25 + .type __ucmpdi2,@function 26 + __ucmpdi2: 27 + or.p gr8,gr0,gr4 28 + subcc gr8,gr10,gr0,icc0 29 + setlos.p #0,gr8 30 + bclr icc0,#2 ; a.msw < b.msw 31 + 32 + setlos.p #2,gr8 33 + bhilr icc0,#0 ; a.msw > b.msw 34 + 35 + subcc.p gr9,gr11,gr0,icc1 36 + setlos #0,gr8 37 + setlos.p #2,gr9 38 + setlos #1,gr7 39 + cknc icc1,cc6 40 + cor.p gr9,gr0,gr8, cc6,#1 41 + cckls icc1,cc4, cc6,#1 42 + andcr cc6,cc4,cc4 43 + cor gr7,gr0,gr8, cc4,#1 44 + bralr 45 + .size __ucmpdi2, .-__ucmpdi2
+25 -6
arch/frv/lib/checksum.c
··· 33 33 34 34 #include <net/checksum.h> 35 35 #include <asm/checksum.h> 36 + #include <linux/module.h> 36 37 37 38 static inline unsigned short from32to16(unsigned long x) 38 39 { ··· 116 115 return result; 117 116 } 118 117 118 + EXPORT_SYMBOL(csum_partial); 119 + 119 120 /* 120 121 * this routine is used for miscellaneous IP-like checksums, mainly 121 122 * in icmp.c 122 123 */ 123 124 unsigned short ip_compute_csum(const unsigned char * buff, int len) 124 125 { 125 - return ~do_csum(buff,len); 126 + return ~do_csum(buff, len); 126 127 } 128 + 129 + EXPORT_SYMBOL(ip_compute_csum); 127 130 128 131 /* 129 132 * copy from fs while checksumming, otherwise like csum_partial 130 133 */ 131 - 132 134 unsigned int 133 - csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *csum_err) 135 + csum_partial_copy_from_user(const char __user *src, char *dst, 136 + int len, int sum, int *csum_err) 134 137 { 135 - if (csum_err) *csum_err = 0; 136 - memcpy(dst, src, len); 138 + int rem; 139 + 140 + if (csum_err) 141 + *csum_err = 0; 142 + 143 + rem = copy_from_user(dst, src, len); 144 + if (rem != 0) { 145 + if (csum_err) 146 + *csum_err = -EFAULT; 147 + memset(dst + len - rem, 0, rem); 148 + len = rem; 149 + } 150 + 137 151 return csum_partial(dst, len, sum); 138 152 } 153 + 154 + EXPORT_SYMBOL(csum_partial_copy_from_user); 139 155 140 156 /* 141 157 * copy from ds while checksumming, otherwise like csum_partial 142 158 */ 143 - 144 159 unsigned int 145 160 csum_partial_copy(const char *src, char *dst, int len, int sum) 146 161 { 147 162 memcpy(dst, src, len); 148 163 return csum_partial(dst, len, sum); 149 164 } 165 + 166 + EXPORT_SYMBOL(csum_partial_copy);
+8
arch/frv/mb93090-mb00/pci-dma-nommu.c
··· 83 83 return NULL; 84 84 } 85 85 86 + EXPORT_SYMBOL(dma_alloc_coherent); 87 + 86 88 void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) 87 89 { 88 90 struct dma_alloc_record *rec; ··· 104 102 BUG(); 105 103 } 106 104 105 + EXPORT_SYMBOL(dma_free_coherent); 106 + 107 107 /* 108 108 * Map a single buffer of the indicated size for DMA in streaming mode. 109 109 * The 32-bit bus address to use is returned. ··· 123 119 124 120 return virt_to_bus(ptr); 125 121 } 122 + 123 + EXPORT_SYMBOL(dma_map_single); 126 124 127 125 /* 128 126 * Map a set of buffers described by scatterlist in streaming ··· 156 150 157 151 return nents; 158 152 } 153 + 154 + EXPORT_SYMBOL(dma_map_sg);
+10
arch/frv/mb93090-mb00/pci-dma.c
··· 28 28 return ret; 29 29 } 30 30 31 + EXPORT_SYMBOL(dma_alloc_coherent); 32 + 31 33 void dma_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) 32 34 { 33 35 consistent_free(vaddr); 34 36 } 37 + 38 + EXPORT_SYMBOL(dma_free_coherent); 35 39 36 40 /* 37 41 * Map a single buffer of the indicated size for DMA in streaming mode. ··· 54 50 55 51 return virt_to_bus(ptr); 56 52 } 53 + 54 + EXPORT_SYMBOL(dma_map_single); 57 55 58 56 /* 59 57 * Map a set of buffers described by scatterlist in streaming ··· 102 96 return nents; 103 97 } 104 98 99 + EXPORT_SYMBOL(dma_map_sg); 100 + 105 101 dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, 106 102 size_t size, enum dma_data_direction direction) 107 103 { ··· 111 103 flush_dcache_page(page); 112 104 return (dma_addr_t) page_to_phys(page) + offset; 113 105 } 106 + 107 + EXPORT_SYMBOL(dma_map_page);
+5
arch/frv/mm/cache-page.c
··· 11 11 #include <linux/sched.h> 12 12 #include <linux/mm.h> 13 13 #include <linux/highmem.h> 14 + #include <linux/module.h> 14 15 #include <asm/pgalloc.h> 15 16 16 17 /*****************************************************************************/ ··· 39 38 40 39 } /* end flush_dcache_page() */ 41 40 41 + EXPORT_SYMBOL(flush_dcache_page); 42 + 42 43 /*****************************************************************************/ 43 44 /* 44 45 * ICI takes a virtual address and the page may not currently have one ··· 67 64 } 68 65 69 66 } /* end flush_icache_user_range() */ 67 + 68 + EXPORT_SYMBOL(flush_icache_user_range);
+8
arch/frv/mm/highmem.c
··· 9 9 * 2 of the License, or (at your option) any later version. 10 10 */ 11 11 #include <linux/highmem.h> 12 + #include <linux/module.h> 12 13 13 14 void *kmap(struct page *page) 14 15 { ··· 18 17 return page_address(page); 19 18 return kmap_high(page); 20 19 } 20 + 21 + EXPORT_SYMBOL(kmap); 21 22 22 23 void kunmap(struct page *page) 23 24 { ··· 30 27 kunmap_high(page); 31 28 } 32 29 30 + EXPORT_SYMBOL(kunmap); 31 + 33 32 struct page *kmap_atomic_to_page(void *ptr) 34 33 { 35 34 return virt_to_page(ptr); 36 35 } 36 + 37 + 38 + EXPORT_SYMBOL(kmap_atomic_to_page);
+3
lib/find_next_bit.c
··· 10 10 */ 11 11 12 12 #include <linux/bitops.h> 13 + #include <linux/module.h> 13 14 14 15 int find_next_bit(const unsigned long *addr, int size, int offset) 15 16 { ··· 54 53 55 54 return offset; 56 55 } 56 + 57 + EXPORT_SYMBOL(find_next_bit);