From: Tomas Szepe <szepe@pinerecords.com>
To: "David S. Miller" <davem@redhat.com>
Cc: zaitcev@redhat.com, linux-kernel@vger.kernel.org
Subject: Re: sparc32 sunrpc.o
Date: Sat, 28 Sep 2002 14:28:17 +0200 [thread overview]
Message-ID: <20020928122817.GV27082@louise.pinerecords.com> (raw)
In-Reply-To: <20020926.142910.124086325.davem@redhat.com>
> From: Pete Zaitcev <zaitcev@redhat.com>
> Date: Thu, 26 Sep 2002 17:27:24 -0400
>
> > Since 2.4.20-pre2 or 3, sunrpc.o has had this problem on sparc32:
> >
> > depmod: *** Unresolved symbols in /lib/modules/2.4.20-pre8/kernel/net/sunrpc/sunrpc.o
> > depmod: ___illegal_use_of_BTFIXUP_SETHI_in_module
> > depmod: ___f_set_pte
> > depmod: fix_kmap_begin
> > depmod: ___f_flush_cache_all
> > depmod: ___f_pte_clear
> > depmod: ___f_mk_pte
> > depmod: ___f_flush_tlb_all
>
> Try these two things:
>
> No Peter, it really does use kmap_atomic stuff from modules, and this
> precludes providing those routines inline in highmem.h, they must
> live statically in main kernel image so that flush/pte calls can
> be properly BTFIXUP'd.
>
> See my other email.
Ok, DaveM, could you have a look at this patch?
T.
diff -urN linux-2.4.20-pre8.vanilla/arch/sparc/kernel/sparc_ksyms.c linux-2.4.20-pre8/arch/sparc/kernel/sparc_ksyms.c
--- linux-2.4.20-pre8.vanilla/arch/sparc/kernel/sparc_ksyms.c 2002-08-03 06:12:08.000000000 +0200
+++ linux-2.4.20-pre8/arch/sparc/kernel/sparc_ksyms.c 2002-09-28 14:15:53.000000000 +0200
@@ -46,6 +46,9 @@
#include <asm/sbus.h>
#include <asm/dma.h>
#endif
+#ifdef CONFIG_HIGHMEM
+#include <asm/highmem.h>
+#endif
#include <asm/a.out.h>
#include <asm/io-unit.h>
@@ -204,6 +207,14 @@
EXPORT_SYMBOL(pci_dma_sync_single);
#endif
+/* Highmem helpers from arch/sparc/mm/highmem.c */
+#ifdef CONFIG_HIGHMEM
+EXPORT_SYMBOL(kmap);
+EXPORT_SYMBOL(kunmap);
+EXPORT_SYMBOL(kmap_atomic);
+EXPORT_SYMBOL(kunmap_atomic);
+#endif
+
/* Solaris/SunOS binary compatibility */
EXPORT_SYMBOL(svr4_setcontext);
EXPORT_SYMBOL(svr4_getcontext);
diff -urN linux-2.4.20-pre8.vanilla/arch/sparc/mm/Makefile linux-2.4.20-pre8/arch/sparc/mm/Makefile
--- linux-2.4.20-pre8.vanilla/arch/sparc/mm/Makefile 2000-12-29 23:07:21.000000000 +0100
+++ linux-2.4.20-pre8/arch/sparc/mm/Makefile 2002-09-28 13:33:55.000000000 +0200
@@ -11,7 +11,7 @@
$(CC) $(AFLAGS) -ansi -c -o $*.o $<
O_TARGET := mm.o
-obj-y := fault.o init.o loadmmu.o generic.o extable.o btfixup.o
+obj-y := fault.o init.o loadmmu.o generic.o extable.o highmem.o btfixup.o
ifeq ($(CONFIG_SUN4),y)
obj-y += nosrmmu.o
diff -urN linux-2.4.20-pre8.vanilla/arch/sparc/mm/highmem.c linux-2.4.20-pre8/arch/sparc/mm/highmem.c
--- linux-2.4.20-pre8.vanilla/arch/sparc/mm/highmem.c 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.4.20-pre8/arch/sparc/mm/highmem.c 2002-09-28 13:56:56.000000000 +0200
@@ -0,0 +1,101 @@
+/*
+ * highmem.c: virtual kernel memory mappings for high memory
+ *
+ * Uninlined versions of kmap(), kunmap(), kmap_atomic(),
+ * and kunmap_atomic() split from include/asm-sparc/highmem.h.
+ * -- Tomas Szepe <szepe@pinerecords.com>, September 2002
+ */
+
+#include <linux/mm.h>
+#include <linux/highmem.h>
+#include <asm/highmem.h>
+
+void *kmap(struct page *page)
+{
+ if (in_interrupt())
+ BUG();
+ if (page < highmem_start_page)
+ return page_address(page);
+ return kmap_high(page);
+}
+
+void kunmap(struct page *page)
+{
+ if (in_interrupt())
+ BUG();
+ if (page < highmem_start_page)
+ return;
+ kunmap_high(page);
+}
+
+/*
+ * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap
+ * gives a more generic (and caching) interface. But kmap_atomic can
+ * be used in IRQ contexts, so in some (very limited) cases we need
+ * it.
+ */
+void *kmap_atomic(struct page *page, enum km_type type)
+{
+ unsigned long idx;
+ unsigned long vaddr;
+
+ if (page < highmem_start_page)
+ return page_address(page);
+
+ idx = type + KM_TYPE_NR*smp_processor_id();
+ vaddr = fix_kmap_begin + idx * PAGE_SIZE;
+
+/* XXX Fix - Anton */
+#if 0
+ __flush_cache_one(vaddr);
+#else
+ flush_cache_all();
+#endif
+
+#if HIGHMEM_DEBUG
+ if (!pte_none(*(kmap_pte+idx)))
+ BUG();
+#endif
+ set_pte(kmap_pte+idx, mk_pte(page, kmap_prot));
+/* XXX Fix - Anton */
+#if 0
+ __flush_tlb_one(vaddr);
+#else
+ flush_tlb_all();
+#endif
+
+ return (void*) vaddr;
+}
+
+void kunmap_atomic(void *kvaddr, enum km_type type)
+{
+ unsigned long vaddr = (unsigned long) kvaddr;
+ unsigned long idx = type + KM_TYPE_NR*smp_processor_id();
+
+ if (vaddr < fix_kmap_begin) // FIXME
+ return;
+
+ if (vaddr != fix_kmap_begin + idx * PAGE_SIZE)
+ BUG();
+
+/* XXX Fix - Anton */
+#if 0
+ __flush_cache_one(vaddr);
+#else
+ flush_cache_all();
+#endif
+
+#ifdef HIGHMEM_DEBUG
+ /*
+ * force other mappings to Oops if they'll try to access
+ * this pte without first remap it
+ */
+ pte_clear(kmap_pte+idx);
+/* XXX Fix - Anton */
+#if 0
+ __flush_tlb_one(vaddr);
+#else
+ flush_tlb_all();
+#endif
+#endif
+}
diff -urN linux-2.4.20-pre8.vanilla/include/asm-sparc/highmem.h linux-2.4.20-pre8/include/asm-sparc/highmem.h
--- linux-2.4.20-pre8.vanilla/include/asm-sparc/highmem.h 2002-09-28 14:18:17.000000000 +0200
+++ linux-2.4.20-pre8/include/asm-sparc/highmem.h 2002-09-28 14:10:12.000000000 +0200
@@ -29,6 +29,10 @@
/* undef for production */
#define HIGHMEM_DEBUG 1
+/* in mm/highmem.c */
+extern void *kmap_high(struct page *page);
+extern void kunmap_high(struct page *page);
+
/* declarations for highmem.c */
extern unsigned long highstart_pfn, highend_pfn;
@@ -55,98 +59,11 @@
#define PKMAP_NR(virt) ((virt - pkmap_base) >> PAGE_SHIFT)
#define PKMAP_ADDR(nr) (pkmap_base + ((nr) << PAGE_SHIFT))
-extern void *kmap_high(struct page *page);
-extern void kunmap_high(struct page *page);
-
-static inline void *kmap(struct page *page)
-{
- if (in_interrupt())
- BUG();
- if (page < highmem_start_page)
- return page_address(page);
- return kmap_high(page);
-}
-
-static inline void kunmap(struct page *page)
-{
- if (in_interrupt())
- BUG();
- if (page < highmem_start_page)
- return;
- kunmap_high(page);
-}
-
-/*
- * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap
- * gives a more generic (and caching) interface. But kmap_atomic can
- * be used in IRQ contexts, so in some (very limited) cases we need
- * it.
- */
-static inline void *kmap_atomic(struct page *page, enum km_type type)
-{
- unsigned long idx;
- unsigned long vaddr;
-
- if (page < highmem_start_page)
- return page_address(page);
-
- idx = type + KM_TYPE_NR*smp_processor_id();
- vaddr = fix_kmap_begin + idx * PAGE_SIZE;
-
-/* XXX Fix - Anton */
-#if 0
- __flush_cache_one(vaddr);
-#else
- flush_cache_all();
-#endif
-
-#if HIGHMEM_DEBUG
- if (!pte_none(*(kmap_pte+idx)))
- BUG();
-#endif
- set_pte(kmap_pte+idx, mk_pte(page, kmap_prot));
-/* XXX Fix - Anton */
-#if 0
- __flush_tlb_one(vaddr);
-#else
- flush_tlb_all();
-#endif
-
- return (void*) vaddr;
-}
-
-static inline void kunmap_atomic(void *kvaddr, enum km_type type)
-{
- unsigned long vaddr = (unsigned long) kvaddr;
- unsigned long idx = type + KM_TYPE_NR*smp_processor_id();
-
- if (vaddr < fix_kmap_begin) // FIXME
- return;
-
- if (vaddr != fix_kmap_begin + idx * PAGE_SIZE)
- BUG();
-
-/* XXX Fix - Anton */
-#if 0
- __flush_cache_one(vaddr);
-#else
- flush_cache_all();
-#endif
-
-#ifdef HIGHMEM_DEBUG
- /*
- * force other mappings to Oops if they'll try to access
- * this pte without first remap it
- */
- pte_clear(kmap_pte+idx);
-/* XXX Fix - Anton */
-#if 0
- __flush_tlb_one(vaddr);
-#else
- flush_tlb_all();
-#endif
-#endif
-}
+/* in arch/sparc/mm/highmem.c */
+void *kmap(struct page *page);
+void kunmap(struct page *page);
+void *kmap_atomic(struct page *page, enum km_type type);
+void kunmap_atomic(void *kvaddr, enum km_type type);
#endif /* __KERNEL__ */
next prev parent reply other threads:[~2002-09-28 12:23 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <mailman.1033072381.13688.linux-kernel2news@redhat.com>
2002-09-26 21:27 ` Pete Zaitcev
2002-09-26 21:29 ` David S. Miller
2002-09-28 12:28 ` Tomas Szepe [this message]
2002-09-28 16:13 ` Tomas Szepe
2002-09-29 6:23 ` David S. Miller
2002-09-29 10:22 ` Tomas Szepe
2002-09-29 23:56 ` Pete Zaitcev
2002-09-30 0:50 ` David S. Miller
2002-09-30 2:05 ` Horst von Brand
2002-09-30 2:09 ` Tomas Szepe
2002-09-26 20:25 Tomas Szepe
2002-09-26 21:09 ` David S. Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020928122817.GV27082@louise.pinerecords.com \
--to=szepe@pinerecords.com \
--cc=davem@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=zaitcev@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®