public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
@ 2008-11-06 12:08 ` Arnd Bergmann
  2009-04-30 16:06   ` Ingo Molnar
  2008-11-06 12:24 ` [PATCH 03/27] asm-generic: make pci.h usable directly Arnd Bergmann
                   ` (27 subsequent siblings)
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 12:08 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The existing asm-generic/atomic.h only defines the
atomic_long type. This renames it to atomic-long.h
so we have a place to add a truly generic atomic.h
that can be used on all non-SMP systems.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/alpha/include/asm/atomic.h                 |    2 +-
 arch/arm/include/asm/atomic.h                   |    2 +-
 arch/avr32/include/asm/atomic.h                 |    2 +-
 arch/blackfin/include/asm/atomic.h              |    2 +-
 arch/cris/include/asm/atomic.h                  |    2 +-
 arch/frv/include/asm/atomic.h                   |    2 +-
 arch/h8300/include/asm/atomic.h                 |    2 +-
 arch/ia64/include/asm/atomic.h                  |    2 +-
 arch/m32r/include/asm/atomic.h                  |    2 +-
 arch/m68k/include/asm/atomic_mm.h               |    2 +-
 arch/m68k/include/asm/atomic_no.h               |    2 +-
 arch/microblaze/include/asm/atomic.h            |    2 +-
 arch/mips/include/asm/atomic.h                  |    2 +-
 arch/mn10300/include/asm/atomic.h               |    2 +-
 arch/parisc/include/asm/atomic.h                |    2 +-
 arch/powerpc/include/asm/atomic.h               |    2 +-
 arch/s390/include/asm/atomic.h                  |    2 +-
 arch/sh/include/asm/atomic.h                    |    2 +-
 arch/sparc/include/asm/atomic_32.h              |    2 +-
 arch/sparc/include/asm/atomic_64.h              |    2 +-
 arch/x86/include/asm/atomic_32.h                |    2 +-
 arch/x86/include/asm/atomic_64.h                |    2 +-
 arch/xtensa/include/asm/atomic.h                |    2 +-
 include/asm-generic/{atomic.h => atomic-long.h} |    6 +++---
 include/asm-generic/bitops/atomic.h             |    1 +
 25 files changed, 27 insertions(+), 26 deletions(-)
 rename include/asm-generic/{atomic.h => atomic-long.h} (97%)

diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h
index 62b3635..610dff4 100644
--- a/arch/alpha/include/asm/atomic.h
+++ b/arch/alpha/include/asm/atomic.h
@@ -256,5 +256,5 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 #define smp_mb__before_atomic_inc()	smp_mb()
 #define smp_mb__after_atomic_inc()	smp_mb()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* _ALPHA_ATOMIC_H */
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
index ee99723..828e1e7 100644
--- a/arch/arm/include/asm/atomic.h
+++ b/arch/arm/include/asm/atomic.h
@@ -206,6 +206,6 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif
 #endif
diff --git a/arch/avr32/include/asm/atomic.h b/arch/avr32/include/asm/atomic.h
index 3188151..b131c27 100644
--- a/arch/avr32/include/asm/atomic.h
+++ b/arch/avr32/include/asm/atomic.h
@@ -196,6 +196,6 @@ static inline int atomic_sub_if_positive(int i, atomic_t *v)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif /*  __ASM_AVR32_ATOMIC_H */
diff --git a/arch/blackfin/include/asm/atomic.h b/arch/blackfin/include/asm/atomic.h
index 94b2a9b..7bbf44e 100644
--- a/arch/blackfin/include/asm/atomic.h
+++ b/arch/blackfin/include/asm/atomic.h
@@ -208,6 +208,6 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
 #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
 #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif				/* __ARCH_BLACKFIN_ATOMIC __ */
diff --git a/arch/cris/include/asm/atomic.h b/arch/cris/include/asm/atomic.h
index 5718dd8..a6aca81 100644
--- a/arch/cris/include/asm/atomic.h
+++ b/arch/cris/include/asm/atomic.h
@@ -158,5 +158,5 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 #define smp_mb__before_atomic_inc()    barrier()
 #define smp_mb__after_atomic_inc()     barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif
diff --git a/arch/frv/include/asm/atomic.h b/arch/frv/include/asm/atomic.h
index 296c35c..0409d98 100644
--- a/arch/frv/include/asm/atomic.h
+++ b/arch/frv/include/asm/atomic.h
@@ -194,5 +194,5 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
 
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* _ASM_ATOMIC_H */
diff --git a/arch/h8300/include/asm/atomic.h b/arch/h8300/include/asm/atomic.h
index 833186c..33c8c0f 100644
--- a/arch/h8300/include/asm/atomic.h
+++ b/arch/h8300/include/asm/atomic.h
@@ -141,5 +141,5 @@ static __inline__ void atomic_set_mask(unsigned long mask, unsigned long *v)
 #define smp_mb__before_atomic_inc()    barrier()
 #define smp_mb__after_atomic_inc() barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __ARCH_H8300_ATOMIC __ */
diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h
index d37292b..88405cb 100644
--- a/arch/ia64/include/asm/atomic.h
+++ b/arch/ia64/include/asm/atomic.h
@@ -216,5 +216,5 @@ atomic64_add_negative (__s64 i, atomic64_t *v)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* _ASM_IA64_ATOMIC_H */
diff --git a/arch/m32r/include/asm/atomic.h b/arch/m32r/include/asm/atomic.h
index 2eed30f..63f0cf0 100644
--- a/arch/m32r/include/asm/atomic.h
+++ b/arch/m32r/include/asm/atomic.h
@@ -314,5 +314,5 @@ static __inline__ void atomic_set_mask(unsigned long  mask, atomic_t *addr)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif	/* _ASM_M32R_ATOMIC_H */
diff --git a/arch/m68k/include/asm/atomic_mm.h b/arch/m68k/include/asm/atomic_mm.h
index eb0ab9d..88b7af2 100644
--- a/arch/m68k/include/asm/atomic_mm.h
+++ b/arch/m68k/include/asm/atomic_mm.h
@@ -192,5 +192,5 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __ARCH_M68K_ATOMIC __ */
diff --git a/arch/m68k/include/asm/atomic_no.h b/arch/m68k/include/asm/atomic_no.h
index 6bb6748..5674cb9 100644
--- a/arch/m68k/include/asm/atomic_no.h
+++ b/arch/m68k/include/asm/atomic_no.h
@@ -151,5 +151,5 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic_inc_return(v) atomic_add_return(1,(v))
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __ARCH_M68KNOMMU_ATOMIC __ */
diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h
index a448d94..0de612a 100644
--- a/arch/microblaze/include/asm/atomic.h
+++ b/arch/microblaze/include/asm/atomic.h
@@ -118,6 +118,6 @@ static inline int atomic_dec_if_positive(atomic_t *v)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif /* _ASM_MICROBLAZE_ATOMIC_H */
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h
index 1b332e1..eb7f01c 100644
--- a/arch/mips/include/asm/atomic.h
+++ b/arch/mips/include/asm/atomic.h
@@ -793,6 +793,6 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 #define smp_mb__before_atomic_inc()	smp_llsc_mb()
 #define smp_mb__after_atomic_inc()	smp_llsc_mb()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif /* _ASM_ATOMIC_H */
diff --git a/arch/mn10300/include/asm/atomic.h b/arch/mn10300/include/asm/atomic.h
index bc06482..5bf5be9 100644
--- a/arch/mn10300/include/asm/atomic.h
+++ b/arch/mn10300/include/asm/atomic.h
@@ -151,7 +151,7 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_ATOMIC_H */
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h
index ada3e53..7eeaff9 100644
--- a/arch/parisc/include/asm/atomic.h
+++ b/arch/parisc/include/asm/atomic.h
@@ -338,6 +338,6 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 
 #endif /* CONFIG_64BIT */
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 
 #endif /* _ASM_PARISC_ATOMIC_H_ */
diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h
index b401950..b7d2d07 100644
--- a/arch/powerpc/include/asm/atomic.h
+++ b/arch/powerpc/include/asm/atomic.h
@@ -472,6 +472,6 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 
 #endif /* __powerpc64__ */
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_ATOMIC_H_ */
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h
index de432f2..fca9dff 100644
--- a/arch/s390/include/asm/atomic.h
+++ b/arch/s390/include/asm/atomic.h
@@ -275,6 +275,6 @@ static __inline__ int atomic64_add_unless(atomic64_t *v,
 #define smp_mb__before_atomic_inc()	smp_mb()
 #define smp_mb__after_atomic_inc()	smp_mb()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __KERNEL__ */
 #endif /* __ARCH_S390_ATOMIC__  */
diff --git a/arch/sh/include/asm/atomic.h b/arch/sh/include/asm/atomic.h
index 6327ffb..a5647d0 100644
--- a/arch/sh/include/asm/atomic.h
+++ b/arch/sh/include/asm/atomic.h
@@ -84,5 +84,5 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __ASM_SH_ATOMIC_H */
diff --git a/arch/sparc/include/asm/atomic_32.h b/arch/sparc/include/asm/atomic_32.h
index bb91b12..f0d343c 100644
--- a/arch/sparc/include/asm/atomic_32.h
+++ b/arch/sparc/include/asm/atomic_32.h
@@ -161,5 +161,5 @@ static inline int __atomic24_sub(int i, atomic24_t *v)
 
 #endif /* !(__KERNEL__) */
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* !(__ARCH_SPARC_ATOMIC__) */
diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h
index a0a7064..f2e4800 100644
--- a/arch/sparc/include/asm/atomic_64.h
+++ b/arch/sparc/include/asm/atomic_64.h
@@ -114,5 +114,5 @@ static inline int atomic64_add_unless(atomic64_t *v, long a, long u)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* !(__ARCH_SPARC64_ATOMIC__) */
diff --git a/arch/x86/include/asm/atomic_32.h b/arch/x86/include/asm/atomic_32.h
index 85b46fb..c83d314 100644
--- a/arch/x86/include/asm/atomic_32.h
+++ b/arch/x86/include/asm/atomic_32.h
@@ -247,5 +247,5 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* _ASM_X86_ATOMIC_32_H */
diff --git a/arch/x86/include/asm/atomic_64.h b/arch/x86/include/asm/atomic_64.h
index 8c21731..0d63602 100644
--- a/arch/x86/include/asm/atomic_64.h
+++ b/arch/x86/include/asm/atomic_64.h
@@ -455,5 +455,5 @@ static inline void atomic_or_long(unsigned long *v1, unsigned long v2)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* _ASM_X86_ATOMIC_64_H */
diff --git a/arch/xtensa/include/asm/atomic.h b/arch/xtensa/include/asm/atomic.h
index 67ad67b..22d6dde 100644
--- a/arch/xtensa/include/asm/atomic.h
+++ b/arch/xtensa/include/asm/atomic.h
@@ -292,7 +292,7 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
 #define smp_mb__before_atomic_inc()	barrier()
 #define smp_mb__after_atomic_inc()	barrier()
 
-#include <asm-generic/atomic.h>
+#include <asm-generic/atomic-long.h>
 #endif /* __KERNEL__ */
 
 #endif /* _XTENSA_ATOMIC_H */
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic-long.h
similarity index 97%
rename from include/asm-generic/atomic.h
rename to include/asm-generic/atomic-long.h
index 7abdaa9..a24a51c 100644
--- a/include/asm-generic/atomic.h
+++ b/include/asm-generic/atomic-long.h
@@ -1,5 +1,5 @@
-#ifndef _ASM_GENERIC_ATOMIC_H
-#define _ASM_GENERIC_ATOMIC_H
+#ifndef _ASM_GENERIC_ATOMIC_LONG_H
+#define _ASM_GENERIC_ATOMIC_LONG_H
 /*
  * Copyright (C) 2005 Silicon Graphics, Inc.
  *	Christoph Lameter
@@ -255,4 +255,4 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
 
 #endif  /*  BITS_PER_LONG == 64  */
 
-#endif  /*  _ASM_GENERIC_ATOMIC_H  */
+#endif  /*  _ASM_GENERIC_ATOMIC_LONG_H  */
diff --git a/include/asm-generic/bitops/atomic.h b/include/asm-generic/bitops/atomic.h
index 4657f3e..c894646 100644
--- a/include/asm-generic/bitops/atomic.h
+++ b/include/asm-generic/bitops/atomic.h
@@ -2,6 +2,7 @@
 #define _ASM_GENERIC_BITOPS_ATOMIC_H_
 
 #include <asm/types.h>
+#include <asm/system.h>
 
 #ifdef CONFIG_SMP
 #include <asm/spinlock.h>
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 03/27] asm-generic: make pci.h usable directly
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
  2008-11-06 12:08 ` [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h Arnd Bergmann
@ 2008-11-06 12:24 ` Arnd Bergmann
  2008-11-06 13:16 ` [PATCH 04/27] asm-generic: add legacy I/O header files Arnd Bergmann
                   ` (26 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 12:24 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Some generic code is using the horribly misnamed PCI_DMA_BUS_IS_PHYS
from asm/pci.h. This makes sure that an architecture without PCI
support does not have to define this itself but can rely on the
asm-generic version.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 arch/frv/include/asm/pci.h  |   13 +++----------
 arch/m32r/include/asm/pci.h |    2 --
 include/asm-generic/pci.h   |    8 ++++++++
 3 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/arch/frv/include/asm/pci.h b/arch/frv/include/asm/pci.h
index 585d9b4..3ce227b 100644
--- a/arch/frv/include/asm/pci.h
+++ b/arch/frv/include/asm/pci.h
@@ -10,8 +10,8 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#ifndef ASM_PCI_H
-#define	ASM_PCI_H
+#ifndef _ASM_FRV_PCI_H
+#define _ASM_FRV_PCI_H
 
 #include <linux/mm.h>
 #include <asm/scatterlist.h>
@@ -43,12 +43,6 @@ extern void pci_free_consistent(struct pci_dev *hwdev, size_t size,
 /* Return the index of the PCI controller for device PDEV. */
 #define pci_controller_num(PDEV)	(0)
 
-/* The PCI address space does equal the physical memory
- * address space.  The networking and block device layers use
- * this boolean for bounce buffer decisions.
- */
-#define PCI_DMA_BUS_IS_PHYS	(1)
-
 /* pci_unmap_{page,single} is a nop so... */
 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
 #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
@@ -114,5 +108,4 @@ static inline void pci_dma_sync_sg(struct pci_dev *hwdev,
 				    sg_dma_address(&sg[i])+sg_dma_len(&sg[i]));
 }
 
-
-#endif
+#endif /* _ASM_FRV_PCI_H */
diff --git a/arch/m32r/include/asm/pci.h b/arch/m32r/include/asm/pci.h
index fe785d1..07d3834 100644
--- a/arch/m32r/include/asm/pci.h
+++ b/arch/m32r/include/asm/pci.h
@@ -3,6 +3,4 @@
 
 #include <asm-generic/pci.h>
 
-#define PCI_DMA_BUS_IS_PHYS	(1)
-
 #endif /* _ASM_M32R_PCI_H */
diff --git a/include/asm-generic/pci.h b/include/asm-generic/pci.h
index c36a77d..515c6e2 100644
--- a/include/asm-generic/pci.h
+++ b/include/asm-generic/pci.h
@@ -52,4 +52,12 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 }
 #endif /* HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ */
 
+/*
+ * By default, assume that no iommu is in use and that the PCI
+ * space is mapped to address physical 0.
+ */
+#ifndef PCI_DMA_BUS_IS_PHYS
+#define PCI_DMA_BUS_IS_PHYS	(1)
 #endif
+
+#endif /* _ASM_GENERIC_PCI_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
  2008-11-06 12:08 ` [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h Arnd Bergmann
  2008-11-06 12:24 ` [PATCH 03/27] asm-generic: make pci.h usable directly Arnd Bergmann
@ 2008-11-06 13:16 ` Arnd Bergmann
       [not found]   ` <c1a198be0904302309w4154f97dqddd0b2df1924a821@mail.gmail.com>
  2008-11-06 13:38 ` [PATCH 05/27] asm-generic: add generic io.h Arnd Bergmann
                   ` (25 subsequent siblings)
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 13:16 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The dma.h, hw_irq.h, serial.h and timex.h files originally
described PC-style i8237, i8259A, i8250 and i8253 chips.
Modern architectures live happily without these specific
interfaces, but a few definitions from these headers keep
getting used in common code.

The new generic headers are what most architectures use
anyway nowadays, just implementing the minimal definitions.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/dma.h    |   15 +++++++++++++++
 include/asm-generic/hw_irq.h |    9 +++++++++
 include/asm-generic/serial.h |   13 +++++++++++++
 include/asm-generic/timex.h  |   29 +++++++++++++++++++++++++++++
 4 files changed, 66 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/dma.h
 create mode 100644 include/asm-generic/hw_irq.h
 create mode 100644 include/asm-generic/serial.h
 create mode 100644 include/asm-generic/timex.h

diff --git a/include/asm-generic/dma.h b/include/asm-generic/dma.h
new file mode 100644
index 0000000..9dfc3a7
--- /dev/null
+++ b/include/asm-generic/dma.h
@@ -0,0 +1,15 @@
+#ifndef __ASM_GENERIC_DMA_H
+#define __ASM_GENERIC_DMA_H
+/*
+ * This file traditionally describes the i8237 PC style DMA controller.
+ * Most architectures don't have these any more and can get the minimal
+ * implementation from kernel/dma.c by not defining MAX_DMA_CHANNELS.
+ *
+ * Some code relies on seeing MAX_DMA_ADDRESS though.
+ */
+#define MAX_DMA_ADDRESS PAGE_OFFSET
+
+extern int request_dma(unsigned int dmanr, const char *device_id);
+extern void free_dma(unsigned int dmanr);
+
+#endif /* __ASM_GENERIC_DMA_H */
diff --git a/include/asm-generic/hw_irq.h b/include/asm-generic/hw_irq.h
new file mode 100644
index 0000000..89036d7
--- /dev/null
+++ b/include/asm-generic/hw_irq.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_GENERIC_HW_IRQ_H
+#define __ASM_GENERIC_HW_IRQ_H
+/*
+ * hw_irq.h has internal declarations for the low-level interrupt
+ * controller, like the original i8259A.
+ * In general, this is not needed for new architectures.
+ */
+
+#endif /* __ASM_GENERIC_HW_IRQ_H */
diff --git a/include/asm-generic/serial.h b/include/asm-generic/serial.h
new file mode 100644
index 0000000..5e29109
--- /dev/null
+++ b/include/asm-generic/serial.h
@@ -0,0 +1,13 @@
+#ifndef __ASM_GENERIC_SERIAL_H
+#define __ASM_GENERIC_SERIAL_H
+
+/*
+ * This should not be an architecture specific #define, oh well.
+ *
+ * Traditionally, it just describes i8250 and related serial ports
+ * that have this clock rate.
+ */
+
+#define BASE_BAUD (1843200 / 16)
+
+#endif /* __ASM_GENERIC_SERIAL_H */
diff --git a/include/asm-generic/timex.h b/include/asm-generic/timex.h
new file mode 100644
index 0000000..8a8d4a0
--- /dev/null
+++ b/include/asm-generic/timex.h
@@ -0,0 +1,29 @@
+#ifndef __ASM_GENERIC_TIMEX_H
+#define __ASM_GENERIC_TIMEX_H
+
+/*
+ * CLOCK_TICK_RATE is highly PC-specific and should not
+ * be used in portable code. 1193182 is the value for the
+ * original i8253 PIC.
+ */
+#ifndef CLOCK_TICK_RATE
+#define CLOCK_TICK_RATE		1193182
+#endif
+
+/*
+ * If you have a cycle counter, return the value here.
+ */
+typedef unsigned long cycles_t;
+static inline cycles_t get_cycles(void)
+{
+	return 0;
+}
+
+/*
+ * Architectures are encouraged to implement read_current_timer
+ * and define this in order to avoid the expensive delay loop
+ * calibration during boot.
+ */
+#undef ARCH_HAS_READ_CURRENT_TIMER
+
+#endif /* __ASM_GENERIC_TIMEX_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 05/27] asm-generic: add generic io.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (2 preceding siblings ...)
  2008-11-06 13:16 ` [PATCH 04/27] asm-generic: add legacy I/O header files Arnd Bergmann
@ 2008-11-06 13:38 ` Arnd Bergmann
  2009-05-04  7:07   ` Geert Uytterhoeven
  2008-11-06 13:40 ` [PATCH 07/27] asm-generic: add minimal cache description Arnd Bergmann
                   ` (24 subsequent siblings)
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 13:38 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Architectures that only have strictly ordered memory mapped
I/O can use a very simple asm/io.h implementation, which was
first written for the mn10300 architecture.

Make it generic, so that future architectures can use it
directly.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/io.h |  305 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 305 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/io.h

diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h
new file mode 100644
index 0000000..8377715
--- /dev/null
+++ b/include/asm-generic/io.h
@@ -0,0 +1,305 @@
+/* Generic I/O port emulation, based on MN10300 code
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+#ifndef __ASM_GENERIC_IO_H
+#define __ASM_GENERIC_IO_H
+
+#include <asm/page.h> /* I/O is all done through memory accesses */
+#include <asm/cacheflush.h>
+
+#ifdef CONFIG_GENERIC_IOMAP
+#include <asm-generic/iomap.h>
+#endif
+
+#define mmiowb() do {} while (0)
+
+/*****************************************************************************/
+/*
+ * readX/writeX() are used to access memory mapped devices. On some
+ * architectures the memory mapped IO stuff needs to be accessed
+ * differently. On the simple architectures, we just read/write the
+ * memory location directly.
+ */
+static inline u8 __raw_readb(const volatile void __iomem *addr)
+{
+	return *(const volatile u8 *) addr;
+}
+
+static inline u16 __raw_readw(const volatile void __iomem *addr)
+{
+	return *(const volatile u16 *) addr;
+}
+
+static inline u32 __raw_readl(const volatile void __iomem *addr)
+{
+	return *(const volatile u32 *) addr;
+}
+
+#define readb __raw_readb
+#define readw(addr) __le16_to_cpu(__raw_readw(addr))
+#define readl(addr) __le32_to_cpu(__raw_readl(addr))
+
+static inline void __raw_writeb(u8 b, volatile void __iomem *addr)
+{
+	*(volatile u8 *) addr = b;
+}
+
+static inline void __raw_writew(u16 b, volatile void __iomem *addr)
+{
+	*(volatile u16 *) addr = b;
+}
+
+static inline void __raw_writel(u32 b, volatile void __iomem *addr)
+{
+	*(volatile u32 *) addr = b;
+}
+
+#define writeb __raw_writeb
+#define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr)
+#define writel(b,addr) __raw_writel(__cpu_to_le32(b),addr)
+
+#ifdef CONFIG_64BIT
+static inline u64 __raw_readq(const volatile void __iomem *addr)
+{
+	return *(const volatile u64 *) addr;
+}
+#define readq(addr) __le64_to_cpu(__raw_readq(addr))
+
+static inline void __raw_writeq(u64 b, volatile void __iomem *addr)
+{
+	*(volatile u64 *) addr = b;
+}
+#define writeq(b,addr) __raw_writeq(__cpu_to_le64(b),addr)
+#endif
+
+/*****************************************************************************/
+/*
+ * traditional input/output functions
+ */
+
+static inline u8 inb(unsigned long addr)
+{
+	return readb((volatile void __iomem *) addr);
+}
+
+static inline u16 inw(unsigned long addr)
+{
+	return readw((volatile void __iomem *) addr);
+}
+
+static inline u32 inl(unsigned long addr)
+{
+	return readl((volatile void __iomem *) addr);
+}
+
+static inline void outb(u8 b, unsigned long addr)
+{
+	return writeb(b, (volatile void __iomem *) addr);
+}
+
+static inline void outw(u16 b, unsigned long addr)
+{
+	return writew(b, (volatile void __iomem *) addr);
+}
+
+static inline void outl(u32 b, unsigned long addr)
+{
+	return writel(b, (volatile void __iomem *) addr);
+}
+
+#define inb_p(addr)	inb(addr)
+#define inw_p(addr)	inw(addr)
+#define inl_p(addr)	inl(addr)
+#define outb_p(x, addr)	outb((x), (addr))
+#define outw_p(x, addr)	outw((x), (addr))
+#define outl_p(x, addr)	outl((x), (addr))
+
+static inline void insb(unsigned long addr, void *buffer, int count)
+{
+	if (count) {
+		u8 *buf = buffer;
+		do {
+			u8 x = inb(addr);
+			*buf++ = x;
+		} while (--count);
+	}
+}
+
+static inline void insw(unsigned long addr, void *buffer, int count)
+{
+	if (count) {
+		u16 *buf = buffer;
+		do {
+			u16 x = inw(addr);
+			*buf++ = x;
+		} while (--count);
+	}
+}
+
+static inline void insl(unsigned long addr, void *buffer, int count)
+{
+	if (count) {
+		u32 *buf = buffer;
+		do {
+			u32 x = inl(addr);
+			*buf++ = x;
+		} while (--count);
+	}
+}
+
+static inline void outsb(unsigned long addr, const void *buffer, int count)
+{
+	if (count) {
+		const u8 *buf = buffer;
+		do {
+			outb(*buf++, addr);
+		} while (--count);
+	}
+}
+
+static inline void outsw(unsigned long addr, const void *buffer, int count)
+{
+	if (count) {
+		const u16 *buf = buffer;
+		do {
+			outw(*buf++, addr);
+		} while (--count);
+	}
+}
+
+static inline void outsl(unsigned long addr, const void *buffer, int count)
+{
+	if (count) {
+		const u32 *buf = buffer;
+		do {
+			outl(*buf++, addr);
+		} while (--count);
+	}
+}
+
+#ifndef CONFIG_GENERIC_IOMAP
+#define ioread8(addr)		readb(addr)
+#define ioread16(addr)		readw(addr)
+#define ioread32(addr)		readl(addr)
+
+#define iowrite8(v, addr)	writeb((v), (addr))
+#define iowrite16(v, addr)	writew((v), (addr))
+#define iowrite32(v, addr)	writel((v), (addr))
+
+#define ioread8_rep(p, dst, count) \
+	insb((unsigned long) (p), (dst), (count))
+#define ioread16_rep(p, dst, count) \
+	insw((unsigned long) (p), (dst), (count))
+#define ioread32_rep(p, dst, count) \
+	insl((unsigned long) (p), (dst), (count))
+
+#define iowrite8_rep(p, src, count) \
+	outsb((unsigned long) (p), (src), (count))
+#define iowrite16_rep(p, src, count) \
+	outsw((unsigned long) (p), (src), (count))
+#define iowrite32_rep(p, src, count) \
+	outsl((unsigned long) (p), (src), (count))
+#endif /* CONFIG_GENERIC_IOMAP */
+
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+#ifdef __KERNEL__
+
+#include <linux/vmalloc.h>
+#define __io_virt(x) ((void *) (x))
+
+#ifndef CONFIG_GENERIC_IOMAP
+/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
+struct pci_dev;
+extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
+static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p)
+{
+}
+#endif /* CONFIG_GENERIC_IOMAP */
+
+/*
+ * Change virtual addresses to physical addresses and vv.
+ * These are pretty trivial
+ */
+static inline unsigned long virt_to_phys(volatile void *address)
+{
+	return __pa(address);
+}
+
+static inline void *phys_to_virt(unsigned long address)
+{
+	return __va(address);
+}
+
+/*
+ * Change "struct page" to physical address.
+ */
+static inline void *__ioremap(unsigned long offset, unsigned long size,
+			      unsigned long flags)
+{
+	return (void *) offset;
+}
+
+static inline void *ioremap(unsigned long offset, unsigned long size)
+{
+	return (void *) offset;
+}
+
+#ifndef ioremap_nocache
+#define ioremap_nocache ioremap
+#endif
+
+#ifndef ioremap_wc
+#define ioremap_wc ioremap_nocache
+#endif
+
+static inline void iounmap(void *addr)
+{
+}
+
+#ifndef CONFIG_GENERIC_IOMAP
+static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
+{
+	return (void __iomem *) port;
+}
+
+static inline void ioport_unmap(void __iomem *p)
+{
+}
+#else /* CONFIG_GENERIC_IOMAP */
+extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
+extern void ioport_unmap(void __iomem *p);
+#endif /* CONFIG_GENERIC_IOMAP */
+
+#define xlate_dev_kmem_ptr(p)	((void *) (p))
+#define xlate_dev_mem_ptr(p)	((void *) (p))
+
+#ifndef virt_to_bus
+static inline unsigned long virt_to_bus(volatile void *address)
+{
+	return ((unsigned long) address);
+}
+
+static inline void *bus_to_virt(unsigned long address)
+{
+	return (void *) address;
+}
+#endif
+
+#define page_to_bus page_to_phys
+
+#define memset_io(a, b, c)	memset(__io_virt(a), (b), (c))
+#define memcpy_fromio(a, b, c)	memcpy((a), __io_virt(b), (c))
+#define memcpy_toio(a, b, c)	memcpy(__io_virt(a), (b), (c))
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_GENERIC_IO_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 07/27] asm-generic: add minimal cache description
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (3 preceding siblings ...)
  2008-11-06 13:38 ` [PATCH 05/27] asm-generic: add generic io.h Arnd Bergmann
@ 2008-11-06 13:40 ` Arnd Bergmann
       [not found]   ` <c1a198be0904302303h73c5168fi73f8dc24dc677965@mail.gmail.com>
  2008-11-06 15:10 ` [PATCH 09/27] asm-generic: add generic NOMMU versions of some headers Arnd Bergmann
                   ` (23 subsequent siblings)
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 13:40 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Many architectures have a 32 byte cache line and never
require flushing the cache, so they can use these
generic implementation.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/cache.h      |   12 ++++++++++++
 include/asm-generic/cacheflush.h |   30 ++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/cache.h
 create mode 100644 include/asm-generic/cacheflush.h

diff --git a/include/asm-generic/cache.h b/include/asm-generic/cache.h
new file mode 100644
index 0000000..1bfcfe5
--- /dev/null
+++ b/include/asm-generic/cache.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_GENERIC_CACHE_H
+#define __ASM_GENERIC_CACHE_H
+/*
+ * 32 bytes appears to be the most common cache line size,
+ * so make that the default here. Architectures with larger
+ * cache lines need to provide their own cache.h.
+ */
+
+#define L1_CACHE_SHIFT		5
+#define L1_CACHE_BYTES		(1 << L1_CACHE_SHIFT)
+
+#endif /* __ASM_GENERIC_CACHE_H */
diff --git a/include/asm-generic/cacheflush.h b/include/asm-generic/cacheflush.h
new file mode 100644
index 0000000..ba4ec39
--- /dev/null
+++ b/include/asm-generic/cacheflush.h
@@ -0,0 +1,30 @@
+#ifndef __ASM_CACHEFLUSH_H
+#define __ASM_CACHEFLUSH_H
+
+/* Keep includes the same across arches.  */
+#include <linux/mm.h>
+
+/*
+ * The cache doesn't need to be flushed when TLB entries change when
+ * the cache is mapped to physical memory, not virtual memory
+ */
+#define flush_cache_all()			do { } while (0)
+#define flush_cache_mm(mm)			do { } while (0)
+#define flush_cache_dup_mm(mm)			do { } while (0)
+#define flush_cache_range(vma, start, end)	do { } while (0)
+#define flush_cache_page(vma, vmaddr, pfn)	do { } while (0)
+#define flush_dcache_page(page)			do { } while (0)
+#define flush_dcache_mmap_lock(mapping)		do { } while (0)
+#define flush_dcache_mmap_unlock(mapping)	do { } while (0)
+#define flush_icache_range(start, end)		do { } while (0)
+#define flush_icache_page(vma,pg)		do { } while (0)
+#define flush_icache_user_range(vma,pg,adr,len)	do { } while (0)
+#define flush_cache_vmap(start, end)		do { } while (0)
+#define flush_cache_vunmap(start, end)		do { } while (0)
+
+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
+	memcpy(dst, src, len)
+#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
+	memcpy(dst, src, len)
+
+#endif /* __ASM_CACHEFLUSH_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 09/27] asm-generic: add generic NOMMU versions of some headers
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (4 preceding siblings ...)
  2008-11-06 13:40 ` [PATCH 07/27] asm-generic: add minimal cache description Arnd Bergmann
@ 2008-11-06 15:10 ` Arnd Bergmann
  2008-11-06 15:26 ` [PATCH 10/27] asm-generic: rename page.h to getorder.h Arnd Bergmann
                   ` (22 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 15:10 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Memory management in generic is highly architecture specific,
but on NOMMU architectures, it is mostly trivial, so just
add a default implementation in asm-generic that applies
to all NOMMU architectures.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/mmu.h         |   14 +++++++++++
 include/asm-generic/mmu_context.h |   45 +++++++++++++++++++++++++++++++++++++
 include/asm-generic/pgalloc.h     |   12 ++++++++++
 include/asm-generic/segment.h     |    9 +++++++
 include/asm-generic/tlbflush.h    |   18 ++++++++++++++
 5 files changed, 98 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/mmu.h
 create mode 100644 include/asm-generic/mmu_context.h
 create mode 100644 include/asm-generic/pgalloc.h
 create mode 100644 include/asm-generic/segment.h
 create mode 100644 include/asm-generic/tlbflush.h

diff --git a/include/asm-generic/mmu.h b/include/asm-generic/mmu.h
new file mode 100644
index 0000000..eb34fb0
--- /dev/null
+++ b/include/asm-generic/mmu.h
@@ -0,0 +1,14 @@
+#ifndef __ASM_GENERIC_MMU_H
+#define __ASM_GENERIC_MMU_H
+
+/*
+ * This is the mmu.h header for nommu implementations.
+ * Architectures with an MMU need something more complex.
+ */
+
+typedef struct {
+	struct vm_list_struct	*vmlist;
+	unsigned long		end_brk;
+} mm_context_t;
+
+#endif /* __ASM_GENERIC_MMU_H */
diff --git a/include/asm-generic/mmu_context.h b/include/asm-generic/mmu_context.h
new file mode 100644
index 0000000..a7eec91
--- /dev/null
+++ b/include/asm-generic/mmu_context.h
@@ -0,0 +1,45 @@
+#ifndef __ASM_GENERIC_MMU_CONTEXT_H
+#define __ASM_GENERIC_MMU_CONTEXT_H
+
+/*
+ * Generic hooks for NOMMU architectures, which do not need to do
+ * anything special here.
+ */
+
+#include <asm-generic/mm_hooks.h>
+
+struct task_struct;
+struct mm_struct;
+
+static inline void enter_lazy_tlb(struct mm_struct *mm,
+			struct task_struct *tsk)
+{
+}
+
+static inline int init_new_context(struct task_struct *tsk,
+			struct mm_struct *mm)
+{
+	return 0;
+}
+
+static inline void destroy_context(struct mm_struct *mm)
+{
+}
+
+static inline void deactivate_mm(struct task_struct *task,
+			struct mm_struct *mm)
+{
+}
+
+static inline void switch_mm(struct mm_struct *prev,
+			struct mm_struct *next,
+			struct task_struct *tsk)
+{
+}
+
+static inline void activate_mm(struct mm_struct *prev_mm,
+			       struct mm_struct *next_mm)
+{
+}
+
+#endif /* __ASM_GENERIC_MMU_CONTEXT_H */
diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h
new file mode 100644
index 0000000..9e429d0
--- /dev/null
+++ b/include/asm-generic/pgalloc.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_GENERIC_PGALLOC_H
+#define __ASM_GENERIC_PGALLOC_H
+/*
+ * an empty file is enough for a nommu architecture
+ */
+#ifdef CONFIG_MMU
+#error need to implement an architecture specific asm/pgalloc.h
+#endif
+
+#define check_pgt_cache()          do { } while (0)
+
+#endif /* __ASM_GENERIC_PGALLOC_H */
diff --git a/include/asm-generic/segment.h b/include/asm-generic/segment.h
new file mode 100644
index 0000000..5580eac
--- /dev/null
+++ b/include/asm-generic/segment.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_GENERIC_SEGMENT_H
+#define __ASM_GENERIC_SEGMENT_H
+/*
+ * Only here because we have some old header files that expect it...
+ *
+ * New architectures probably don't want to have their own version.
+ */
+
+#endif /* __ASM_GENERIC_SEGMENT_H */
diff --git a/include/asm-generic/tlbflush.h b/include/asm-generic/tlbflush.h
new file mode 100644
index 0000000..c7af037
--- /dev/null
+++ b/include/asm-generic/tlbflush.h
@@ -0,0 +1,18 @@
+#ifndef __ASM_GENERIC_TLBFLUSH_H
+#define __ASM_GENERIC_TLBFLUSH_H
+/*
+ * This is a dummy tlbflush implementation that can be used on all
+ * nommu architectures.
+ * If you have an MMU, you need to write your own functions.
+ */
+#ifdef CONFIG_MMU
+#error need to implement an architecture specific asm/tlbflush.h
+#endif
+
+static inline void flush_tlb_mm(struct mm_struct *mm)
+{
+	BUG();
+}
+
+
+#endif /* __ASM_GENERIC_TLBFLUSH_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 10/27] asm-generic: rename page.h to getorder.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (5 preceding siblings ...)
  2008-11-06 15:10 ` [PATCH 09/27] asm-generic: add generic NOMMU versions of some headers Arnd Bergmann
@ 2008-11-06 15:26 ` Arnd Bergmann
  2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
                   ` (21 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 15:26 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The current asm-generic/page.h only contains the get_order
function. This renames the file to getorder.h to make
room for a new page.h file that will be usable by all
nommu architectures.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/alpha/include/asm/page.h              |    2 +-
 arch/arm/include/asm/page.h                |    2 +-
 arch/blackfin/include/asm/page.h           |    2 +-
 arch/cris/include/asm/page.h               |    2 +-
 arch/frv/include/asm/page.h                |    2 +-
 arch/h8300/include/asm/page.h              |    2 +-
 arch/m32r/include/asm/page.h               |    2 +-
 arch/m68k/include/asm/page_mm.h            |    2 +-
 arch/m68k/include/asm/page_no.h            |    2 +-
 arch/microblaze/include/asm/page.h         |    2 +-
 arch/mips/include/asm/page.h               |    2 +-
 arch/parisc/include/asm/page.h             |    2 +-
 arch/powerpc/include/asm/page_32.h         |    2 +-
 arch/powerpc/include/asm/page_64.h         |    2 +-
 arch/s390/include/asm/page.h               |    2 +-
 arch/sh/include/asm/page.h                 |    2 +-
 arch/sparc/include/asm/page_32.h           |    2 +-
 arch/sparc/include/asm/page_64.h           |    2 +-
 arch/um/include/asm/page.h                 |    2 +-
 arch/x86/include/asm/page.h                |    2 +-
 arch/xtensa/include/asm/page.h             |    2 +-
 include/asm-generic/{page.h => getorder.h} |    8 ++++----
 22 files changed, 25 insertions(+), 25 deletions(-)
 rename include/asm-generic/{page.h => getorder.h} (59%)

diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
index 0995f9d..07af062 100644
--- a/arch/alpha/include/asm/page.h
+++ b/arch/alpha/include/asm/page.h
@@ -93,6 +93,6 @@ typedef struct page *pgtable_t;
 					 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ALPHA_PAGE_H */
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h
index e6eb8a6..dee70a3 100644
--- a/arch/arm/include/asm/page.h
+++ b/arch/arm/include/asm/page.h
@@ -209,6 +209,6 @@ typedef struct page *pgtable_t;
 #define ARCH_SLAB_MINALIGN 8
 #endif
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif
diff --git a/arch/blackfin/include/asm/page.h b/arch/blackfin/include/asm/page.h
index 344f6a8..3ea2016 100644
--- a/arch/blackfin/include/asm/page.h
+++ b/arch/blackfin/include/asm/page.h
@@ -81,7 +81,7 @@ extern unsigned long memory_end;
 #define	virt_addr_valid(kaddr)	(((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
 				((void *)(kaddr) < (void *)memory_end))
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif				/* __ASSEMBLY__ */
 
diff --git a/arch/cris/include/asm/page.h b/arch/cris/include/asm/page.h
index f3fdbd0..be45ee3 100644
--- a/arch/cris/include/asm/page.h
+++ b/arch/cris/include/asm/page.h
@@ -68,7 +68,7 @@ typedef struct page *pgtable_t;
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _CRIS_PAGE_H */
 
diff --git a/arch/frv/include/asm/page.h b/arch/frv/include/asm/page.h
index bd9c220..25c6a50 100644
--- a/arch/frv/include/asm/page.h
+++ b/arch/frv/include/asm/page.h
@@ -73,6 +73,6 @@ extern unsigned long max_pfn;
 #endif /* __ASSEMBLY__ */
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ASM_PAGE_H */
diff --git a/arch/h8300/include/asm/page.h b/arch/h8300/include/asm/page.h
index 0b6acf0..837381a 100644
--- a/arch/h8300/include/asm/page.h
+++ b/arch/h8300/include/asm/page.h
@@ -73,6 +73,6 @@ extern unsigned long memory_end;
 #endif /* __ASSEMBLY__ */
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _H8300_PAGE_H */
diff --git a/arch/m32r/include/asm/page.h b/arch/m32r/include/asm/page.h
index c933308..11777f7 100644
--- a/arch/m32r/include/asm/page.h
+++ b/arch/m32r/include/asm/page.h
@@ -82,6 +82,6 @@ typedef struct page *pgtable_t;
 #define devmem_is_allowed(x) 1
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ASM_M32R_PAGE_H */
diff --git a/arch/m68k/include/asm/page_mm.h b/arch/m68k/include/asm/page_mm.h
index a34b8ba..d009f3e 100644
--- a/arch/m68k/include/asm/page_mm.h
+++ b/arch/m68k/include/asm/page_mm.h
@@ -223,6 +223,6 @@ static inline __attribute_const__ int __virt_to_node_shift(void)
 #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _M68K_PAGE_H */
diff --git a/arch/m68k/include/asm/page_no.h b/arch/m68k/include/asm/page_no.h
index 3a1ede4..9aa3f90 100644
--- a/arch/m68k/include/asm/page_no.h
+++ b/arch/m68k/include/asm/page_no.h
@@ -72,6 +72,6 @@ extern unsigned long memory_end;
 
 #endif /* __ASSEMBLY__ */
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _M68KNOMMU_PAGE_H */
diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h
index 7238dcf..962c210 100644
--- a/arch/microblaze/include/asm/page.h
+++ b/arch/microblaze/include/asm/page.h
@@ -135,6 +135,6 @@ extern unsigned int memory_size;
 #endif /* __KERNEL__ */
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ASM_MICROBLAZE_PAGE_H */
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
index fe7a88e..8a271b6 100644
--- a/arch/mips/include/asm/page.h
+++ b/arch/mips/include/asm/page.h
@@ -186,6 +186,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 #define CAC_ADDR(addr)		((addr) - UNCAC_BASE + PAGE_OFFSET)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ASM_PAGE_H */
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
index 7bc5125..a84cc1f 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -159,6 +159,6 @@ extern int npmem_ranges;
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _PARISC_PAGE_H */
diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h
index a0e3f6e..bd0849d 100644
--- a/arch/powerpc/include/asm/page_32.h
+++ b/arch/powerpc/include/asm/page_32.h
@@ -41,7 +41,7 @@ extern void clear_pages(void *page, int order);
 static inline void clear_page(void *page) { clear_pages(page, 0); }
 extern void copy_page(void *to, void *from);
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #define PGD_T_LOG2	(__builtin_ffs(sizeof(pgd_t)) - 1)
 #define PTE_T_LOG2	(__builtin_ffs(sizeof(pte_t)) - 1)
diff --git a/arch/powerpc/include/asm/page_64.h b/arch/powerpc/include/asm/page_64.h
index 043bfdf..5817a3b 100644
--- a/arch/powerpc/include/asm/page_64.h
+++ b/arch/powerpc/include/asm/page_64.h
@@ -180,6 +180,6 @@ do {						\
 	(test_thread_flag(TIF_32BIT) ? \
 	 VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64)
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _ASM_POWERPC_PAGE_64_H */
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h
index 32e8f6a..3e3594d 100644
--- a/arch/s390/include/asm/page.h
+++ b/arch/s390/include/asm/page.h
@@ -150,7 +150,7 @@ void arch_alloc_page(struct page *page, int order);
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #define __HAVE_ARCH_GATE_AREA 1
 
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
index 9c6d21e..49592c7 100644
--- a/arch/sh/include/asm/page.h
+++ b/arch/sh/include/asm/page.h
@@ -163,7 +163,7 @@ typedef struct page *pgtable_t;
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 /* vDSO support */
 #ifdef CONFIG_VSYSCALL
diff --git a/arch/sparc/include/asm/page_32.h b/arch/sparc/include/asm/page_32.h
index d1806ed..f72080b 100644
--- a/arch/sparc/include/asm/page_32.h
+++ b/arch/sparc/include/asm/page_32.h
@@ -152,6 +152,6 @@ extern unsigned long pfn_base;
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _SPARC_PAGE_H */
diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h
index 4274ed1..f0d09b4 100644
--- a/arch/sparc/include/asm/page_64.h
+++ b/arch/sparc/include/asm/page_64.h
@@ -132,6 +132,6 @@ typedef struct page *pgtable_t;
 #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif /* _SPARC64_PAGE_H */
diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h
index 55f28a0..4cc9b6c 100644
--- a/arch/um/include/asm/page.h
+++ b/arch/um/include/asm/page.h
@@ -116,7 +116,7 @@ extern unsigned long uml_physmem;
 #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #endif	/* __ASSEMBLY__ */
 #endif	/* __UM_PAGE_H */
diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
index 89ed9d7..625c3f0 100644
--- a/arch/x86/include/asm/page.h
+++ b/arch/x86/include/asm/page.h
@@ -56,7 +56,7 @@ extern bool __virt_addr_valid(unsigned long kaddr);
 #endif	/* __ASSEMBLY__ */
 
 #include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
+#include <asm-generic/getorder.h>
 
 #define __HAVE_ARCH_GATE_AREA 1
 
diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h
index 17e0c53..161bb89 100644
--- a/arch/xtensa/include/asm/page.h
+++ b/arch/xtensa/include/asm/page.h
@@ -129,7 +129,7 @@ static inline __attribute_const__ int get_order(unsigned long size)
 
 #else
 
-# include <asm-generic/page.h>
+# include <asm-generic/getorder.h>
 
 #endif
 
diff --git a/include/asm-generic/page.h b/include/asm-generic/getorder.h
similarity index 59%
rename from include/asm-generic/page.h
rename to include/asm-generic/getorder.h
index 14db733..67e7245 100644
--- a/include/asm-generic/page.h
+++ b/include/asm-generic/getorder.h
@@ -1,12 +1,12 @@
-#ifndef _ASM_GENERIC_PAGE_H
-#define _ASM_GENERIC_PAGE_H
+#ifndef __ASM_GENERIC_GETORDER_H
+#define __ASM_GENERIC_GETORDER_H
 
 #ifndef __ASSEMBLY__
 
 #include <linux/compiler.h>
 
 /* Pure 2^n version of get_order */
-static __inline__ __attribute_const__ int get_order(unsigned long size)
+static inline __attribute_const__ int get_order(unsigned long size)
 {
 	int order;
 
@@ -21,4 +21,4 @@ static __inline__ __attribute_const__ int get_order(unsigned long size)
 
 #endif	/* __ASSEMBLY__ */
 
-#endif	/* _ASM_GENERIC_PAGE_H */
+#endif	/* __ASM_GENERIC_GETORDER_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (6 preceding siblings ...)
  2008-11-06 15:26 ` [PATCH 10/27] asm-generic: rename page.h to getorder.h Arnd Bergmann
@ 2008-11-06 15:31 ` Arnd Bergmann
  2009-05-01 10:07   ` Michal Simek
                     ` (3 more replies)
  2008-11-07 20:43 ` [PATCH 14/27] asm-generic: make bitops.h usable Arnd Bergmann
                   ` (20 subsequent siblings)
  28 siblings, 4 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-06 15:31 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

This uaccess.h can be used by all NOMMU architectures,
but it does not provide exception handlers that would
be needed for an architecture with an MMU.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 arch/parisc/include/asm/uaccess.h                  |    2 +-
 arch/sparc/include/asm/uaccess_64.h                |    2 +-
 .../asm-generic/{uaccess.h => uaccess-unaligned.h} |    6 +-
 include/asm-generic/uaccess.h                      |  235 +++++++++++++++++---
 4 files changed, 214 insertions(+), 31 deletions(-)
 rename include/asm-generic/{uaccess.h => uaccess-unaligned.h} (82%)
 rewrite include/asm-generic/uaccess.h (96%)

diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h
index cd4c0b2..7cf799d 100644
--- a/arch/parisc/include/asm/uaccess.h
+++ b/arch/parisc/include/asm/uaccess.h
@@ -7,7 +7,7 @@
 #include <asm/page.h>
 #include <asm/system.h>
 #include <asm/cache.h>
-#include <asm-generic/uaccess.h>
+#include <asm-generic/uaccess-unaligned.h>
 
 #define VERIFY_READ 0
 #define VERIFY_WRITE 1
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
index c64e767..a38c032 100644
--- a/arch/sparc/include/asm/uaccess_64.h
+++ b/arch/sparc/include/asm/uaccess_64.h
@@ -12,7 +12,7 @@
 #include <asm/asi.h>
 #include <asm/system.h>
 #include <asm/spitfire.h>
-#include <asm-generic/uaccess.h>
+#include <asm-generic/uaccess-unaligned.h>
 #endif
 
 #ifndef __ASSEMBLY__
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess-unaligned.h
similarity index 82%
rename from include/asm-generic/uaccess.h
rename to include/asm-generic/uaccess-unaligned.h
index 549cb3a..67deb89 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess-unaligned.h
@@ -1,5 +1,5 @@
-#ifndef _ASM_GENERIC_UACCESS_H_
-#define _ASM_GENERIC_UACCESS_H_
+#ifndef __ASM_GENERIC_UACCESS_UNALIGNED_H
+#define __ASM_GENERIC_UACCESS_UNALIGNED_H
 
 /*
  * This macro should be used instead of __get_user() when accessing
@@ -23,4 +23,4 @@
 	__copy_to_user((ptr), &__x, sizeof(*(ptr))) ? -EFAULT : 0;	\
 })
 
-#endif /* _ASM_GENERIC_UACCESS_H */
+#endif /* __ASM_GENERIC_UACCESS_UNALIGNED_H */
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
dissimilarity index 96%
index 549cb3a..ebeacd9 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -1,26 +1,209 @@
-#ifndef _ASM_GENERIC_UACCESS_H_
-#define _ASM_GENERIC_UACCESS_H_
-
-/*
- * This macro should be used instead of __get_user() when accessing
- * values at locations that are not known to be aligned.
- */
-#define __get_user_unaligned(x, ptr)					\
-({									\
-	__typeof__ (*(ptr)) __x;					\
-	__copy_from_user(&__x, (ptr), sizeof(*(ptr))) ? -EFAULT : 0;	\
-	(x) = __x;							\
-})
-
-
-/*
- * This macro should be used instead of __put_user() when accessing
- * values at locations that are not known to be aligned.
- */
-#define __put_user_unaligned(x, ptr)					\
-({									\
-	__typeof__ (*(ptr)) __x = (x);					\
-	__copy_to_user((ptr), &__x, sizeof(*(ptr))) ? -EFAULT : 0;	\
-})
-
-#endif /* _ASM_GENERIC_UACCESS_H */
+#ifndef __ASM_GENERIC_UACCESS_H
+#define __ASM_GENERIC_UACCESS_H
+
+/*
+ * User space memory access functions, these should work
+ * on a ny machine that has kernel and user data in the same
+ * address space, e.g. all NOMMU machines.
+ */
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+
+#include <asm/segment.h>
+
+#ifndef get_fs
+#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
+#define KERNEL_DS	MAKE_MM_SEG(~0UL)
+#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
+
+#define get_ds() (KERNEL_DS)
+#define get_fs() (current_thread_info()->addr_limit)
+
+static inline void set_fs(mm_segment_t fs)
+{
+	current_thread_info()->addr_limit = fs;
+}
+#endif
+
+#define segment_eq(a, b) ((a).seg == (b).seg)
+
+#define VERIFY_READ	0
+#define VERIFY_WRITE	1
+
+#define access_ok(type, addr, size) _access_ok((unsigned long)(addr),(size))
+
+/*
+ * The architecture should really override this if possible, at least
+ * doing a check on the get_fs()
+ */
+#ifndef _access_ok
+static inline int _access_ok(unsigned long addr, unsigned long size)
+{
+	return 1;
+}
+#endif
+
+/*
+ * The exception table consists of pairs of addresses: the first is the
+ * address of an instruction that is allowed to fault, and the second is
+ * the address at which the program should continue.  No registers are
+ * modified, so it is entirely up to the continuation code to figure out
+ * what to do.
+ *
+ * All the routines below use bits of fixup code that are out of line
+ * with the main instruction path.  This means when everything is well,
+ * we don't even have to jump over them.  Further, they do not intrude
+ * on our cache or tlb entries.
+ */
+
+struct exception_table_entry
+{
+	unsigned long insn, fixup;
+};
+
+/* Returns 0 if exception not found and fixup otherwise.  */
+extern unsigned long search_exception_table(unsigned long);
+
+/*
+ * These are the main single-value transfer routines.  They automatically
+ * use the right size if we just have the right pointer type.
+ */
+#ifndef __put_user
+#define __put_user(x, ptr)				\
+({							\
+	int __pu_err = 0;				\
+	typeof(*(ptr)) __pu_val = (x);			\
+	switch (sizeof (*(ptr))) {			\
+	case 1:						\
+	case 2:						\
+	case 4:						\
+		*(ptr) = (__pu_val);			\
+		break;					\
+	case 8:						\
+		memcpy(ptr, &__pu_val, sizeof (*(ptr)));\
+		break;					\
+	default:					\
+		__pu_err = __put_user_bad();		\
+		break;					\
+	}						\
+	__pu_err;					\
+})
+extern int __put_user_bad(void);
+#endif
+
+#define put_user(x, ptr) (				\
+	access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?	\
+		__put_user(x, ptr) :			\
+		-EFAULT)
+
+#ifndef __get_user
+#define __get_user(x, ptr)				\
+({							\
+	int __gu_err = 0;				\
+	unsigned long __gu_val = (unsigned long)*ptr;	\
+	switch (sizeof(*(ptr))) {			\
+	case 1:						\
+	case 2:						\
+	case 4:						\
+	case 8:						\
+		break;					\
+	default:					\
+		__gu_err = __get_user_bad();		\
+		__gu_val = 0;				\
+		break;					\
+	}						\
+	(x) = (typeof(*ptr))__gu_val;			\
+	__gu_err;					\
+})
+extern int __get_user_bad(void);
+#endif
+
+#define get_user(x, ptr) (				\
+	access_ok(VERIFY_READ, ptr, sizeof (*ptr)) ?	\
+		__get_user(x, ptr) :			\
+		-EFAULT)
+
+#define __copy_from_user(to, from, n) (memcpy(to, from, n), 0)
+#define __copy_to_user(to, from, n) (memcpy(to, from, n), 0)
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+
+#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
+
+#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
+
+static inline long copy_from_user(void *to,
+				  const void __user * from, unsigned long n)
+{
+	if (access_ok(VERIFY_READ, from, n))
+		__copy_from_user(to, from, n);
+	else
+		return n;
+	return 0;
+}
+
+static inline long copy_to_user(void *to,
+				const void __user * from, unsigned long n)
+{
+	if (access_ok(VERIFY_WRITE, to, n))
+		__copy_to_user(to, from, n);
+	else
+		return n;
+	return 0;
+}
+
+/*
+ * Copy a null terminated string from userspace.
+ */
+
+static inline long
+__do_strncpy_from_user(char *dst, const char __user *src, long count)
+{
+	char *tmp;
+	strncpy(dst, src, count);
+	for (tmp = dst; *tmp && count > 0; tmp++, count--)
+		;
+	return (tmp - dst);
+}
+
+static inline long
+strncpy_from_user(char *dst, const char __user *src, long count)
+{
+	if (!access_ok(VERIFY_READ, src, 1))
+		return -EFAULT;
+	return __do_strncpy_from_user(dst, src, count);
+}
+
+static inline long
+__strncpy_from_user(char *dst, const char __user *src, long count)
+{
+	return __do_strncpy_from_user(dst, src, count);
+}
+
+/*
+ * Return the size of a string (including the ending 0)
+ *
+ * Return 0 on exception, a value greater than N if too long
+ */
+static inline long strnlen_user(const char *src, long n)
+{
+	return strlen(src) + 1;
+}
+
+#define strlen_user(str) strnlen_user(str, 32767)
+
+/*
+ * Zero Userspace
+ */
+
+static inline unsigned long
+__clear_user(void *to, unsigned long n)
+{
+	memset(to, 0, n);
+	return 0;
+}
+
+#define clear_user(to, n) __clear_user(to, n)
+
+#endif /* __ASM_GENERIC_UACCESS_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 14/27] asm-generic: make bitops.h usable
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (7 preceding siblings ...)
  2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
@ 2008-11-07 20:43 ` Arnd Bergmann
  2008-11-08 10:37 ` [PATCH 15/27] asm-generic: Add missing generic tlb_flush definition Arnd Bergmann
                   ` (19 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-07 20:43 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

bitops.h apparently suffered from some level of bitrot, it
was missing the smp_mb__{before,after}_clear_bit functions,
and included other headers in an invalid order.

This changes the file so that new architectures can use
it out of the box.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/bitops.h |   24 ++++++++++++++++++------
 1 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h
index c9f369c..a54f442 100644
--- a/include/asm-generic/bitops.h
+++ b/include/asm-generic/bitops.h
@@ -1,19 +1,29 @@
-#ifndef _ASM_GENERIC_BITOPS_H_
-#define _ASM_GENERIC_BITOPS_H_
+#ifndef __ASM_GENERIC_BITOPS_H
+#define __ASM_GENERIC_BITOPS_H
 
 /*
  * For the benefit of those who are trying to port Linux to another
  * architecture, here are some C-language equivalents.  You should
  * recode these in the native assembly language, if at all possible.
- * 
+ *
  * C language equivalents written by Theodore Ts'o, 9/26/92
  */
 
-#include <asm-generic/bitops/atomic.h>
-#include <asm-generic/bitops/non-atomic.h>
+#include <linux/irqflags.h>
+#include <linux/compiler.h>
+
+/*
+ * clear_bit may not imply a memory barrier
+ */
+#ifndef smp_mb__before_clear_bit
+#define smp_mb__before_clear_bit()	smp_mb()
+#define smp_mb__after_clear_bit()	smp_mb()
+#endif
+
 #include <asm-generic/bitops/__ffs.h>
 #include <asm-generic/bitops/ffz.h>
 #include <asm-generic/bitops/fls.h>
+#include <asm-generic/bitops/__fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/find.h>
 
@@ -26,8 +36,10 @@
 #include <asm-generic/bitops/hweight.h>
 #include <asm-generic/bitops/lock.h>
 
+#include <asm-generic/bitops/atomic.h>
+#include <asm-generic/bitops/non-atomic.h>
 #include <asm-generic/bitops/ext2-non-atomic.h>
 #include <asm-generic/bitops/ext2-atomic.h>
 #include <asm-generic/bitops/minix.h>
 
-#endif /* _ASM_GENERIC_BITOPS_H */
+#endif /* __ASM_GENERIC_BITOPS_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 15/27] asm-generic: Add missing generic tlb_flush definition
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (8 preceding siblings ...)
  2008-11-07 20:43 ` [PATCH 14/27] asm-generic: make bitops.h usable Arnd Bergmann
@ 2008-11-08 10:37 ` Arnd Bergmann
  2009-03-31 13:30 ` [PATCH 17/27] add generic lib/checksum.c Arnd Bergmann
                   ` (18 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2008-11-08 10:37 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

All architectures with an MMU define tlb_flush as
flush_tlb_mm((tlb)->mm). This adds it as a default
implementation in asm-generic/tlb.h so that new nommu
architectures can simply use the header as is and
others can stop defining it themselves.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/tlb.h |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
index f490e43..3a65502 100644
--- a/include/asm-generic/tlb.h
+++ b/include/asm-generic/tlb.h
@@ -47,6 +47,10 @@ struct mmu_gather {
 /* Users of the generic TLB shootdown code must declare this storage space. */
 DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
 
+#ifndef tlb_flush
+#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
+#endif
+
 /* tlb_gather_mmu
  *	Return a pointer to an initialized struct mmu_gather.
  */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 17/27] add generic lib/checksum.c
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (9 preceding siblings ...)
  2008-11-08 10:37 ` [PATCH 15/27] asm-generic: Add missing generic tlb_flush definition Arnd Bergmann
@ 2009-03-31 13:30 ` Arnd Bergmann
  2009-04-30 22:35   ` Jan-Benedict Glaw
  2009-05-01  9:20   ` Russell King
  2009-04-01 12:35 ` [PATCH 19/27] microblaze: make syscall_table implementation generic Arnd Bergmann
                   ` (17 subsequent siblings)
  28 siblings, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-03-31 13:30 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Add a generic (unoptimized) implementation of checksum.c in pure C
for use by all architectures.

Based on microblaze code by Michal Simek <monstr@monstr.eu>

Cc: Michal Simek <monstr@monstr.eu>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/checksum.h |   79 +++++++++++++++++
 lib/Makefile                   |    2 +
 lib/checksum.c                 |  188 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 269 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/checksum.h
 create mode 100644 lib/checksum.c

diff --git a/include/asm-generic/checksum.h b/include/asm-generic/checksum.h
new file mode 100644
index 0000000..4647c76
--- /dev/null
+++ b/include/asm-generic/checksum.h
@@ -0,0 +1,79 @@
+#ifndef __ASM_GENERIC_CHECKSUM_H
+#define __ASM_GENERIC_CHECKSUM_H
+
+/*
+ * computes the checksum of a memory block at buff, length len,
+ * and adds in "sum" (32-bit)
+ *
+ * returns a 32-bit number suitable for feeding into itself
+ * or csum_tcpudp_magic
+ *
+ * this function must be called with even lengths, except
+ * for the last fragment, which may be odd
+ *
+ * it's best to have buff aligned on a 32-bit boundary
+ */
+extern __wsum csum_partial(const void *buff, int len, __wsum sum);
+
+/*
+ * the same as csum_partial, but copies from src while it
+ * checksums
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+extern __wsum csum_partial_copy(const void *src, void *dst, int len, __wsum sum);
+
+/*
+ * the same as csum_partial_copy, but copies from user space.
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
+					int len, __wsum sum, int *csum_err);
+
+#define csum_partial_copy_nocheck(src, dst, len, sum)	\
+	csum_partial_copy((src), (dst), (len), (sum))
+
+/*
+ * This is a version of ip_compute_csum() optimized for IP headers,
+ * which always checksum on 4 octet boundaries.
+ */
+extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
+
+/*
+ * Fold a partial checksum
+ */
+static inline __sum16 csum_fold(__wsum csum)
+{
+	u32 sum = (__force u32)csum;
+	sum = (sum & 0xffff) + (sum >> 16);
+	sum = (sum & 0xffff) + (sum >> 16);
+	return (__force __sum16)~sum;
+}
+
+#ifndef csum_tcpudp_nofold
+/*
+ * computes the checksum of the TCP/UDP pseudo-header
+ * returns a 16-bit checksum, already complemented
+ */
+extern __wsum
+csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
+		unsigned short proto, __wsum sum);
+#endif
+
+static inline __sum16
+csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
+		  unsigned short proto, __wsum sum)
+{
+	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
+}
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+extern __sum16 ip_compute_csum(const void *buff, int len);
+
+#endif /* __ASM_GENERIC_CHECKSUM_H */
diff --git a/lib/Makefile b/lib/Makefile
index 33a40e4..b6869e1 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -92,6 +92,8 @@ obj-$(CONFIG_NLATTR) += nlattr.o
 
 obj-$(CONFIG_DMA_API_DEBUG) += dma-debug.o
 
+obj-$(CONFIG_GENERIC_CSUM) += checksum.o
+
 hostprogs-y	:= gen_crc32table
 clean-files	:= crc32table.h
 
diff --git a/lib/checksum.c b/lib/checksum.c
new file mode 100644
index 0000000..4f80a4d
--- /dev/null
+++ b/lib/checksum.c
@@ -0,0 +1,188 @@
+/*
+ * arch/microblaze/lib/checksum.c
+ *
+ * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
+ *
+ * INET	An implementation of the TCP/IP protocol suite for the LINUX
+ *		operating system.  INET is implemented using the  BSD Socket
+ *		interface as the means of communication with the user level.
+ *
+ *		IP/TCP/UDP checksumming routines
+ *
+ * Authors:	Jorge Cwik, <jorge@laser.satlink.net>
+ *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
+ *		Tom May, <ftom@netcom.com>
+ *		Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>
+ *		Lots of code moved from tcp.c and ip.c; see those files
+ *		for more names.
+ *
+ * 03/02/96	Jes Sorensen, Andreas Schwab, Roman Hodek:
+ *		Fixed some nasty bugs, causing some horrible crashes.
+ *		A: At some points, the sum (%0) was used as
+ *		length-counter instead of the length counter
+ *		(%1). Thanks to Roman Hodek for pointing this out.
+ *		B: GCC seems to mess up if one uses too many
+ *		data-registers to hold input values and one tries to
+ *		specify d0 and d1 as scratch registers. Letting gcc choose these
+ *		registers itself solves the problem.
+ *
+ *		This program is free software; you can redistribute it and/or
+ *		modify it under the terms of the GNU General Public License
+ *		as published by the Free Software Foundation; either version
+ *		2 of the License, or (at your option) any later version.
+ */
+
+/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access
+ kills, so most of the assembly has to go. */
+
+#include <net/checksum.h>
+#include <asm-generic/checksum.h>
+#include <linux/module.h>
+#include <asm/byteorder.h>
+
+static inline unsigned short from32to16(unsigned long x)
+{
+	/* add up 16-bit and 16-bit for 16+c bit */
+	x = (x & 0xffff) + (x >> 16);
+	/* add up carry.. */
+	x = (x & 0xffff) + (x >> 16);
+	return x;
+}
+
+static unsigned int do_csum(const unsigned char *buff, int len)
+{
+	int odd, count;
+	unsigned long result = 0;
+
+	if (len <= 0)
+		goto out;
+	odd = 1 & (unsigned long) buff;
+	if (odd) {
+		result = *buff;
+		len--;
+		buff++;
+	}
+	count = len >> 1;		/* nr of 16-bit words.. */
+	if (count) {
+		if (2 & (unsigned long) buff) {
+			result += *(unsigned short *) buff;
+			count--;
+			len -= 2;
+			buff += 2;
+		}
+		count >>= 1;		/* nr of 32-bit words.. */
+		if (count) {
+			unsigned long carry = 0;
+			do {
+				unsigned long w = *(unsigned long *) buff;
+				count--;
+				buff += 4;
+				result += carry;
+				result += w;
+				carry = (w > result);
+			} while (count);
+			result += carry;
+			result = (result & 0xffff) + (result >> 16);
+		}
+		if (len & 2) {
+			result += *(unsigned short *) buff;
+			buff += 2;
+		}
+	}
+	if (len & 1)
+		result += (*buff << 8);
+	result = from32to16(result);
+	if (odd)
+		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
+out:
+	return result;
+}
+
+/*
+ *	This is a version of ip_compute_csum() optimized for IP headers,
+ *	which always checksum on 4 octet boundaries.
+ */
+__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
+{
+	return ~do_csum(iph, ihl*4);
+}
+
+/*
+ * computes the checksum of a memory block at buff, length len,
+ * and adds in "sum" (32-bit)
+ *
+ * returns a 32-bit number suitable for feeding into itself
+ * or csum_tcpudp_magic
+ *
+ * this function must be called with even lengths, except
+ * for the last fragment, which may be odd
+ *
+ * it's best to have buff aligned on a 32-bit boundary
+ */
+__wsum csum_partial(const void *buff, int len, __wsum sum)
+{
+	unsigned int result = do_csum(buff, len);
+
+	/* add in old sum, and carry.. */
+	result += sum;
+	if (sum > result)
+		result += 1;
+	return result;
+}
+EXPORT_SYMBOL(csum_partial);
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+__sum16 ip_compute_csum(const void *buff, int len)
+{
+	return ~do_csum(buff, len);
+}
+EXPORT_SYMBOL(ip_compute_csum);
+
+/*
+ * copy from fs while checksumming, otherwise like csum_partial
+ */
+__wsum
+csum_partial_copy_from_user(const void __user *src, void *dst, int len,
+						__wsum sum, int *csum_err)
+{
+	if (csum_err)
+		*csum_err = 0;
+	memcpy(dst, src, len);
+	return csum_partial(dst, len, sum);
+}
+EXPORT_SYMBOL(csum_partial_copy_from_user);
+
+/*
+ * copy from ds while checksumming, otherwise like csum_partial
+ */
+__wsum
+csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
+{
+	memcpy(dst, src, len);
+	return csum_partial(dst, len, sum);
+}
+EXPORT_SYMBOL(csum_partial_copy);
+
+#ifndef csum_tcpudp_nofold
+__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
+			unsigned short len,
+			unsigned short proto,
+			__wsum sum)
+{
+	unsigned long long s = (__force u32)sum;
+
+	s += (__force u32)saddr;
+	s += (__force u32)daddr;
+#ifdef __BIG_ENDIAN
+	s += proto + len;
+#else
+	s += (proto + len) << 8;
+#endif
+	s += (s >> 32);
+	return (__force __wsum)s;
+}
+EXPORT_SYMBOL(csum_tcpudp_nofold);
+#endif
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 19/27] microblaze: make syscall_table implementation generic
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (10 preceding siblings ...)
  2009-03-31 13:30 ` [PATCH 17/27] add generic lib/checksum.c Arnd Bergmann
@ 2009-04-01 12:35 ` Arnd Bergmann
  2009-04-14 13:12 ` [PATCH 20/27] microblaze: use the generic lib/checksum.c Remis Lima Baima
                   ` (16 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-01 12:35 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/Kconfig                            |    3 +++
 arch/microblaze/kernel/Makefile                    |    2 +-
 kernel/Makefile                                    |    1 +
 {arch/microblaze/kernel => kernel}/syscall_table.c |    2 +-
 4 files changed, 6 insertions(+), 2 deletions(-)
 rename {arch/microblaze/kernel => kernel}/syscall_table.c (82%)

diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 8cc312b..47c161a 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -49,6 +49,9 @@ config GENERIC_CLOCKEVENTS
 config GENERIC_HARDIRQS_NO__DO_IRQ
 	def_bool y
 
+config GENERIC_SYSCALL_TABLE
+	def_bool y
+
 config PCI
 	depends on !MMU
 	def_bool n
diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile
index 8dd4728..da94bec 100644
--- a/arch/microblaze/kernel/Makefile
+++ b/arch/microblaze/kernel/Makefile
@@ -7,7 +7,7 @@ extra-y := head.o vmlinux.lds
 obj-y += exceptions.o \
 	hw_exception_handler.o init_task.o intc.o irq.o of_device.o \
 	of_platform.o process.o prom.o prom_parse.o ptrace.o \
-	setup.o signal.o sys_microblaze.o timer.o traps.o syscall_table.o
+	setup.o signal.o sys_microblaze.o timer.o traps.o
 
 obj-y += cpu/
 
diff --git a/kernel/Makefile b/kernel/Makefile
index 4242366..647d8d9 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -95,6 +95,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += trace/
 obj-$(CONFIG_TRACING) += trace/
 obj-$(CONFIG_SMP) += sched_cpupri.o
 obj-$(CONFIG_SLOW_WORK) += slow-work.o
+obj-$(CONFIG_GENERIC_SYSCALL_TABLE) += syscall_table.o
 
 ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
 # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
diff --git a/arch/microblaze/kernel/syscall_table.c b/kernel/syscall_table.c
similarity index 82%
rename from arch/microblaze/kernel/syscall_table.c
rename to kernel/syscall_table.c
index cfc35fa..a2da111 100644
--- a/arch/microblaze/kernel/syscall_table.c
+++ b/kernel/syscall_table.c
@@ -7,6 +7,6 @@
 #undef __SYSCALL
 #define __SYSCALL(nr, call) [nr] (call),
 
-void *sys_call_table[__NR_syscalls] = {
+void *sys_call_table[] = {
 #include <asm/unistd.h>
 };
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 20/27] microblaze: use the generic lib/checksum.c
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (11 preceding siblings ...)
  2009-04-01 12:35 ` [PATCH 19/27] microblaze: make syscall_table implementation generic Arnd Bergmann
@ 2009-04-14 13:12 ` Remis Lima Baima
  2009-04-15 13:00 ` [PATCH 23/27] microblaze: convert all simple headers to use asm-generic Remis Lima Baima
                   ` (15 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-14 13:12 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Adapt the code to use the more generic lib/checksum.c implementation.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 arch/microblaze/Kconfig        |    3 +
 arch/microblaze/lib/Makefile   |    2 +-
 arch/microblaze/lib/checksum.c |  163 ----------------------------------------
 3 files changed, 4 insertions(+), 164 deletions(-)
 delete mode 100644 arch/microblaze/lib/checksum.c

diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 47c161a..0651179 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -52,6 +52,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ
 config GENERIC_SYSCALL_TABLE
 	def_bool y
 
+config GENERIC_CSUM
+	def_bool y
+
 config PCI
 	depends on !MMU
 	def_bool n
diff --git a/arch/microblaze/lib/Makefile b/arch/microblaze/lib/Makefile
index d27126b..8b02023 100644
--- a/arch/microblaze/lib/Makefile
+++ b/arch/microblaze/lib/Makefile
@@ -2,7 +2,7 @@
 # Makefile
 #
 
-lib-y :=  memset.o checksum.o
+lib-y :=  memset.o
 
 ifeq ($(CONFIG_OPT_LIB_ASM),y)
 lib-y += fastcopy.o
diff --git a/arch/microblaze/lib/checksum.c b/arch/microblaze/lib/checksum.c
deleted file mode 100644
index 8093400..0000000
--- a/arch/microblaze/lib/checksum.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *
- * INET		An implementation of the TCP/IP protocol suite for the LINUX
- *		operating system.  INET is implemented using the  BSD Socket
- *		interface as the means of communication with the user level.
- *
- *		IP/TCP/UDP checksumming routines
- *
- * Authors:	Jorge Cwik, <jorge@laser.satlink.net>
- *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
- *		Tom May, <ftom@netcom.com>
- *		Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>
- *		Lots of code moved from tcp.c and ip.c; see those files
- *		for more names.
- *
- * 03/02/96	Jes Sorensen, Andreas Schwab, Roman Hodek:
- *		Fixed some nasty bugs, causing some horrible crashes.
- *		A: At some points, the sum (%0) was used as
- *		length-counter instead of the length counter
- *		(%1). Thanks to Roman Hodek for pointing this out.
- *		B: GCC seems to mess up if one uses too many
- *		data-registers to hold input values and one tries to
- *		specify d0 and d1 as scratch registers. Letting gcc
- *		choose these registers itself solves the problem.
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- */
-
-/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access
- kills, so most of the assembly has to go. */
-
-#include <net/checksum.h>
-#include <asm/checksum.h>
-#include <linux/module.h>
-
-static inline unsigned short from32to16(unsigned long x)
-{
-	/* add up 16-bit and 16-bit for 16+c bit */
-	x = (x & 0xffff) + (x >> 16);
-	/* add up carry.. */
-	x = (x & 0xffff) + (x >> 16);
-	return x;
-}
-
-static unsigned int do_csum(const unsigned char *buff, int len)
-{
-	int odd, count;
-	unsigned long result = 0;
-
-	if (len <= 0)
-		goto out;
-	odd = 1 & (unsigned long) buff;
-	if (odd) {
-		result = *buff;
-		len--;
-		buff++;
-	}
-	count = len >> 1;		/* nr of 16-bit words.. */
-	if (count) {
-		if (2 & (unsigned long) buff) {
-			result += *(unsigned short *) buff;
-			count--;
-			len -= 2;
-			buff += 2;
-		}
-		count >>= 1;		/* nr of 32-bit words.. */
-		if (count) {
-			unsigned long carry = 0;
-			do {
-				unsigned long w = *(unsigned long *) buff;
-				count--;
-				buff += 4;
-				result += carry;
-				result += w;
-				carry = (w > result);
-			} while (count);
-			result += carry;
-			result = (result & 0xffff) + (result >> 16);
-		}
-		if (len & 2) {
-			result += *(unsigned short *) buff;
-			buff += 2;
-		}
-	}
-	if (len & 1)
-		result += (*buff << 8);
-	result = from32to16(result);
-	if (odd)
-		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
-out:
-	return result;
-}
-
-/*
- *	This is a version of ip_compute_csum() optimized for IP headers,
- *	which always checksum on 4 octet boundaries.
- */
-__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
-{
-	return (__force __sum16)~do_csum(iph, ihl*4);
-}
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-__wsum csum_partial(const void *buff, int len, __wsum sum)
-{
-	unsigned int result = do_csum(buff, len);
-
-	/* add in old sum, and carry.. */
-	result += sum;
-	if (sum > result)
-		result += 1;
-	return result;
-}
-EXPORT_SYMBOL(csum_partial);
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-__sum16 ip_compute_csum(const unsigned char *buff, int len)
-{
-	return ~do_csum(buff, len);
-}
-EXPORT_SYMBOL(ip_compute_csum);
-
-/*
- * copy from fs while checksumming, otherwise like csum_partial
- */
-__wsum
-csum_partial_copy_from_user(const char __user *src, char *dst, int len,
-						int sum, int *csum_err)
-{
-	if (csum_err)
-		*csum_err = 0;
-	memcpy(dst, src, len);
-	return csum_partial(dst, len, sum);
-}
-EXPORT_SYMBOL(csum_partial_copy_from_user);
-
-/*
- * copy from ds while checksumming, otherwise like csum_partial
- */
-__wsum
-csum_partial_copy(const char *src, char *dst, int len, int sum)
-{
-	memcpy(dst, src, len);
-	return csum_partial(dst, len, sum);
-}
-EXPORT_SYMBOL(csum_partial_copy);
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 23/27] microblaze: convert all simple headers to use asm-generic
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (12 preceding siblings ...)
  2009-04-14 13:12 ` [PATCH 20/27] microblaze: use the generic lib/checksum.c Remis Lima Baima
@ 2009-04-15 13:00 ` Remis Lima Baima
  2009-04-15 15:28 ` [PATCH 22/27] microblaze: don't include asm/mmu.h in hw_exception_handler Arnd Bergmann
                   ` (14 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-15 13:00 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

All the simple microblaze header files were adapted to use their
asm-generic implementations. These files are more simple and were quite
straightforward to change.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/include/asm/atomic.h      |  124 +---------------------------
 arch/microblaze/include/asm/bitops.h      |   28 +------
 arch/microblaze/include/asm/bug.h         |   14 ---
 arch/microblaze/include/asm/bugs.h        |   18 +----
 arch/microblaze/include/asm/checksum.h    |  132 ++++++++---------------------
 arch/microblaze/include/asm/hardirq.h     |   14 +---
 arch/microblaze/include/asm/irq.h         |    6 +-
 arch/microblaze/include/asm/kmap_types.h  |   30 +------
 arch/microblaze/include/asm/mmu.h         |   20 +----
 arch/microblaze/include/asm/mmu_context.h |   22 +-----
 arch/microblaze/include/asm/module.h      |   10 +--
 arch/microblaze/include/asm/pgalloc.h     |   15 +---
 arch/microblaze/include/asm/scatterlist.h |   29 +------
 arch/microblaze/include/asm/serial.h      |   15 +---
 arch/microblaze/include/asm/shmparam.h    |    7 +--
 arch/microblaze/include/asm/system.h      |    3 +
 arch/microblaze/include/asm/timex.h       |   19 +----
 17 files changed, 53 insertions(+), 453 deletions(-)
 rewrite arch/microblaze/include/asm/atomic.h (100%)
 rewrite arch/microblaze/include/asm/bitops.h (95%)
 rewrite arch/microblaze/include/asm/checksum.h (68%)
 rewrite arch/microblaze/include/asm/kmap_types.h (100%)
 rewrite arch/microblaze/include/asm/mmu.h (100%)
 rewrite arch/microblaze/include/asm/mmu_context.h (100%)
 rewrite arch/microblaze/include/asm/scatterlist.h (100%)
 rewrite arch/microblaze/include/asm/timex.h (100%)

diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h
dissimilarity index 100%
index 0de612a..f0cc1f8 100644
--- a/arch/microblaze/include/asm/atomic.h
+++ b/arch/microblaze/include/asm/atomic.h
@@ -1,123 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_ATOMIC_H
-#define _ASM_MICROBLAZE_ATOMIC_H
-
-#include <linux/types.h>
-#include <linux/compiler.h> /* likely */
-#include <asm/system.h> /* local_irq_XXX and friends */
-
-#define ATOMIC_INIT(i)		{ (i) }
-#define atomic_read(v)		((v)->counter)
-#define atomic_set(v, i)	(((v)->counter) = (i))
-
-#define atomic_inc(v)		(atomic_add_return(1, (v)))
-#define atomic_dec(v)		(atomic_sub_return(1, (v)))
-
-#define atomic_add(i, v)	(atomic_add_return(i, (v)))
-#define atomic_sub(i, v)	(atomic_sub_return(i, (v)))
-
-#define atomic_inc_return(v)	(atomic_add_return(1, (v)))
-#define atomic_dec_return(v)	(atomic_sub_return(1, (v)))
-
-#define atomic_inc_and_test(v)	(atomic_add_return(1, (v)) == 0)
-#define atomic_dec_and_test(v)	(atomic_sub_return(1, (v)) == 0)
-
-#define atomic_inc_not_zero(v)	(atomic_add_unless((v), 1, 0))
-
-#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)
-
-static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
-{
-	int ret;
-	unsigned long flags;
-
-	local_irq_save(flags);
-	ret = v->counter;
-	if (likely(ret == old))
-		v->counter = new;
-	local_irq_restore(flags);
-
-	return ret;
-}
-
-static inline int atomic_add_unless(atomic_t *v, int a, int u)
-{
-	int c, old;
-
-	c = atomic_read(v);
-	while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
-		c = old;
-	return c != u;
-}
-
-static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
-{
-	unsigned long flags;
-
-	local_irq_save(flags);
-	*addr &= ~mask;
-	local_irq_restore(flags);
-}
-
-/**
- * atomic_add_return - add and return
- * @i: integer value to add
- * @v: pointer of type atomic_t
- *
- * Atomically adds @i to @v and returns @i + @v
- */
-static inline int atomic_add_return(int i, atomic_t *v)
-{
-	unsigned long flags;
-	int val;
-
-	local_irq_save(flags);
-	val = v->counter;
-	v->counter = val += i;
-	local_irq_restore(flags);
-
-	return val;
-}
-
-static inline int atomic_sub_return(int i, atomic_t *v)
-{
-	return atomic_add_return(-i, v);
-}
-
-/*
- * Atomically test *v and decrement if it is greater than 0.
- * The function returns the old value of *v minus 1.
- */
-static inline int atomic_dec_if_positive(atomic_t *v)
-{
-	unsigned long flags;
-	int res;
-
-	local_irq_save(flags);
-	res = v->counter - 1;
-	if (res >= 0)
-		v->counter = res;
-	local_irq_restore(flags);
-
-	return res;
-}
-
-#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
-#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
-
-/* Atomic operations are already serializing */
-#define smp_mb__before_atomic_dec()	barrier()
-#define smp_mb__after_atomic_dec()	barrier()
-#define smp_mb__before_atomic_inc()	barrier()
-#define smp_mb__after_atomic_inc()	barrier()
-
-#include <asm-generic/atomic-long.h>
-
-#endif /* _ASM_MICROBLAZE_ATOMIC_H */
+#include <asm-generic/atomic.h>
diff --git a/arch/microblaze/include/asm/bitops.h b/arch/microblaze/include/asm/bitops.h
dissimilarity index 95%
index d6df1fd..a72468f 100644
--- a/arch/microblaze/include/asm/bitops.h
+++ b/arch/microblaze/include/asm/bitops.h
@@ -1,27 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_BITOPS_H
-#define _ASM_MICROBLAZE_BITOPS_H
-
-/*
- * Copyright 1992, Linus Torvalds.
- */
-
-#include <asm/byteorder.h> /* swab32 */
-#include <asm/system.h> /* save_flags */
-
-/*
- * clear_bit() doesn't provide any barrier for the compiler.
- */
-#define smp_mb__before_clear_bit()	barrier()
-#define smp_mb__after_clear_bit()	barrier()
-#include <asm-generic/bitops.h>
-#include <asm-generic/bitops/__fls.h>
-
-#endif /* _ASM_MICROBLAZE_BITOPS_H */
+#include <asm-generic/bitops.h>
diff --git a/arch/microblaze/include/asm/bug.h b/arch/microblaze/include/asm/bug.h
index 8eb2cdd..b12fd89 100644
--- a/arch/microblaze/include/asm/bug.h
+++ b/arch/microblaze/include/asm/bug.h
@@ -1,15 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_BUG_H
-#define _ASM_MICROBLAZE_BUG_H
-
-#include <linux/kernel.h>
 #include <asm-generic/bug.h>
-
-#endif /* _ASM_MICROBLAZE_BUG_H */
diff --git a/arch/microblaze/include/asm/bugs.h b/arch/microblaze/include/asm/bugs.h
index f2c6593..61791e1 100644
--- a/arch/microblaze/include/asm/bugs.h
+++ b/arch/microblaze/include/asm/bugs.h
@@ -1,17 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_BUGS_H
-#define _ASM_MICROBLAZE_BUGS_H
-
-static inline void check_bugs(void)
-{
-	/* nothing to do */
-}
-
-#endif /* _ASM_MICROBLAZE_BUGS_H */
+#include <asm-generic/bugs.h>
diff --git a/arch/microblaze/include/asm/checksum.h b/arch/microblaze/include/asm/checksum.h
dissimilarity index 68%
index 92b3076..f0e5225 100644
--- a/arch/microblaze/include/asm/checksum.h
+++ b/arch/microblaze/include/asm/checksum.h
@@ -1,98 +1,34 @@
-/*
- * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_CHECKSUM_H
-#define _ASM_MICROBLAZE_CHECKSUM_H
-
-#include <linux/in6.h>
-
-/*
- * computes the checksum of the TCP/UDP pseudo-header
- * returns a 16-bit checksum, already complemented
- */
-static inline __wsum
-csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
-		   unsigned short proto, __wsum sum)
-{
-	__asm__("add %0, %0, %1\n\t"
-		"addc %0, %0, %2\n\t"
-		"addc %0, %0, %3\n\t"
-		"addc %0, %0, r0\n\t"
-		: "+&d" (sum)
-		: "d" (saddr), "d" (daddr), "d" (len + proto));
-
-	return sum;
-}
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-extern __wsum csum_partial(const void *buff, int len, __wsum sum);
-
-/*
- * the same as csum_partial, but copies from src while it
- * checksums
- *
- * here even more important to align src and dst on a 32-bit (or even
- * better 64-bit) boundary
- */
-extern __wsum csum_partial_copy(const char *src, char *dst, int len, int sum);
-
-/*
- * the same as csum_partial_copy, but copies from user space.
- *
- * here even more important to align src and dst on a 32-bit (or even
- * better 64-bit) boundary
- */
-extern __wsum csum_partial_copy_from_user(const char *src, char *dst,
-					int len, int sum, int *csum_err);
-
-#define csum_partial_copy_nocheck(src, dst, len, sum)	\
-	csum_partial_copy((src), (dst), (len), (sum))
-
-/*
- *	This is a version of ip_compute_csum() optimized for IP headers,
- *	which always checksum on 4 octet boundaries.
- *
- */
-extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
-
-/*
- *	Fold a partial checksum
- */
-static inline __sum16 csum_fold(unsigned int sum)
-{
-	sum = (sum & 0xffff) + (sum >> 16);
-	sum = (sum & 0xffff) + (sum >> 16);
-	return ~sum;
-}
-
-static inline __sum16
-csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
-		  unsigned short proto, __wsum sum)
-{
-	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
-}
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-extern __sum16 ip_compute_csum(const unsigned char *buff, int len);
-
-#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
+/*
+ * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
+ * Copyright (C) 2006 Atmark Techno, Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#ifndef _ASM_MICROBLAZE_CHECKSUM_H
+#define _ASM_MICROBLAZE_CHECKSUM_H
+
+/*
+ * computes the checksum of the TCP/UDP pseudo-header
+ * returns a 16-bit checksum, already complemented
+ */
+#define csum_tcpudp_nofold 	csum_tcpudp_nofold
+static inline __wsum
+csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
+		   unsigned short proto, __wsum sum)
+{
+	__asm__("add %0, %0, %1\n\t"
+		"addc %0, %0, %2\n\t"
+		"addc %0, %0, %3\n\t"
+		"addc %0, %0, r0\n\t"
+		: "+&d" (sum)
+		: "d" (saddr), "d" (daddr), "d" (len + proto));
+
+	return sum;
+}
+
+#include <asm-generic/checksum.h>
+
+#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
diff --git a/arch/microblaze/include/asm/hardirq.h b/arch/microblaze/include/asm/hardirq.h
index 0f2d6b0..41e1e1a 100644
--- a/arch/microblaze/include/asm/hardirq.h
+++ b/arch/microblaze/include/asm/hardirq.h
@@ -9,21 +9,11 @@
 #ifndef _ASM_MICROBLAZE_HARDIRQ_H
 #define _ASM_MICROBLAZE_HARDIRQ_H
 
-#include <linux/cache.h>
-#include <linux/irq.h>
-#include <asm/irq.h>
-#include <asm/current.h>
-#include <linux/ptrace.h>
-
 /* should be defined in each interrupt controller driver */
 extern unsigned int get_irq(struct pt_regs *regs);
 
-typedef struct {
-	unsigned int __softirq_pending;
-} ____cacheline_aligned irq_cpustat_t;
-
+#define ack_bad_irq ack_bad_irq
 void ack_bad_irq(unsigned int irq);
-
-#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
+#include <asm-generic/hardirq.h>
 
 #endif /* _ASM_MICROBLAZE_HARDIRQ_H */
diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h
index db515de..90f0505 100644
--- a/arch/microblaze/include/asm/irq.h
+++ b/arch/microblaze/include/asm/irq.h
@@ -10,6 +10,7 @@
 #define _ASM_MICROBLAZE_IRQ_H
 
 #define NR_IRQS 32
+#include <asm-generic/irq.h>
 
 #include <linux/interrupt.h>
 
@@ -17,11 +18,6 @@ extern unsigned int nr_irq;
 
 #define NO_IRQ (-1)
 
-static inline int irq_canonicalize(int irq)
-{
-	return irq;
-}
-
 struct pt_regs;
 extern void do_IRQ(struct pt_regs *regs);
 
diff --git a/arch/microblaze/include/asm/kmap_types.h b/arch/microblaze/include/asm/kmap_types.h
dissimilarity index 100%
index 4d7e222..3575c64 100644
--- a/arch/microblaze/include/asm/kmap_types.h
+++ b/arch/microblaze/include/asm/kmap_types.h
@@ -1,29 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_KMAP_TYPES_H
-#define _ASM_MICROBLAZE_KMAP_TYPES_H
-
-enum km_type {
-	KM_BOUNCE_READ,
-	KM_SKB_SUNRPC_DATA,
-	KM_SKB_DATA_SOFTIRQ,
-	KM_USER0,
-	KM_USER1,
-	KM_BIO_SRC_IRQ,
-	KM_BIO_DST_IRQ,
-	KM_PTE0,
-	KM_PTE1,
-	KM_IRQ0,
-	KM_IRQ1,
-	KM_SOFTIRQ0,
-	KM_SOFTIRQ1,
-	KM_TYPE_NR,
-};
-
-#endif /* _ASM_MICROBLAZE_KMAP_TYPES_H */
+#include <asm-generic/kmap_types.h>
diff --git a/arch/microblaze/include/asm/mmu.h b/arch/microblaze/include/asm/mmu.h
dissimilarity index 100%
index 0e0431d..2caa6ed 100644
--- a/arch/microblaze/include/asm/mmu.h
+++ b/arch/microblaze/include/asm/mmu.h
@@ -1,19 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_MMU_H
-#define _ASM_MICROBLAZE_MMU_H
-
-#ifndef __ASSEMBLY__
-typedef struct {
-	struct vm_list_struct	*vmlist;
-	unsigned long		end_brk;
-} mm_context_t;
-#endif /* __ASSEMBLY__ */
-
-#endif /* _ASM_MICROBLAZE_MMU_H */
+#include <asm-generic/mmu.h>
diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h
dissimilarity index 100%
index 150ca01..7739fe1 100644
--- a/arch/microblaze/include/asm/mmu_context.h
+++ b/arch/microblaze/include/asm/mmu_context.h
@@ -1,21 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_MMU_CONTEXT_H
-#define _ASM_MICROBLAZE_MMU_CONTEXT_H
-
-# define init_new_context(tsk, mm)		({ 0; })
-
-# define enter_lazy_tlb(mm, tsk)		do {} while (0)
-# define change_mm_context(old, ctx, _pml4)	do {} while (0)
-# define destroy_context(mm)			do {} while (0)
-# define deactivate_mm(tsk, mm)			do {} while (0)
-# define switch_mm(prev, next, tsk)		do {} while (0)
-# define activate_mm(prev, next)		do {} while (0)
-
-#endif /* _ASM_MICROBLAZE_MMU_CONTEXT_H */
+#include <asm-generic/mmu_context.h>
diff --git a/arch/microblaze/include/asm/module.h b/arch/microblaze/include/asm/module.h
index 914565a..7be1347 100644
--- a/arch/microblaze/include/asm/module.h
+++ b/arch/microblaze/include/asm/module.h
@@ -9,6 +9,8 @@
 #ifndef _ASM_MICROBLAZE_MODULE_H
 #define _ASM_MICROBLAZE_MODULE_H
 
+#include <asm-generic/module.h>
+
 /* Microblaze Relocations */
 #define R_MICROBLAZE_NONE 0
 #define R_MICROBLAZE_32 1
@@ -24,14 +26,6 @@
 /* Keep this the last entry. */
 #define R_MICROBLAZE_NUM 11
 
-struct mod_arch_specific {
-	int foo;
-};
-
-#define Elf_Shdr	Elf32_Shdr
-#define Elf_Sym		Elf32_Sym
-#define Elf_Ehdr	Elf32_Ehdr
-
 typedef struct { volatile int counter; } module_t;
 
 #endif /* _ASM_MICROBLAZE_MODULE_H */
diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h
index 2a4b354..f261cb7 100644
--- a/arch/microblaze/include/asm/pgalloc.h
+++ b/arch/microblaze/include/asm/pgalloc.h
@@ -1,14 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_PGALLOC_H
-#define _ASM_MICROBLAZE_PGALLOC_H
-
-#define check_pgt_cache()	do {} while (0)
-
-#endif /* _ASM_MICROBLAZE_PGALLOC_H */
+#include <asm-generic/pgalloc.h>
diff --git a/arch/microblaze/include/asm/scatterlist.h b/arch/microblaze/include/asm/scatterlist.h
dissimilarity index 100%
index 08ff1d0..35d786f 100644
--- a/arch/microblaze/include/asm/scatterlist.h
+++ b/arch/microblaze/include/asm/scatterlist.h
@@ -1,28 +1 @@
-/*
- * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_SCATTERLIST_H
-#define _ASM_MICROBLAZE_SCATTERLIST_H
-
-struct scatterlist {
-#ifdef CONFIG_DEBUG_SG
-	unsigned long	sg_magic;
-#endif
-	unsigned long	page_link;
-	dma_addr_t	dma_address;
-	unsigned int	offset;
-	unsigned int	length;
-};
-
-#define sg_dma_address(sg)      ((sg)->dma_address)
-#define sg_dma_len(sg)          ((sg)->length)
-
-#define ISA_DMA_THRESHOLD (~0UL)
-
-#endif /* _ASM_MICROBLAZE_SCATTERLIST_H */
+#include <asm-generic/scatterlist.h>
diff --git a/arch/microblaze/include/asm/serial.h b/arch/microblaze/include/asm/serial.h
index 39bfc8c..a0cb0ca 100644
--- a/arch/microblaze/include/asm/serial.h
+++ b/arch/microblaze/include/asm/serial.h
@@ -1,14 +1 @@
-/*
- * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_SERIAL_H
-#define _ASM_MICROBLAZE_SERIAL_H
-
-# define BASE_BAUD (1843200 / 16)
-
-#endif /* _ASM_MICROBLAZE_SERIAL_H */
+#include <asm-generic/serial.h>
diff --git a/arch/microblaze/include/asm/shmparam.h b/arch/microblaze/include/asm/shmparam.h
index 9f5fc2b..93f30de 100644
--- a/arch/microblaze/include/asm/shmparam.h
+++ b/arch/microblaze/include/asm/shmparam.h
@@ -1,6 +1 @@
-#ifndef _ASM_MICROBLAZE_SHMPARAM_H
-#define _ASM_MICROBLAZE_SHMPARAM_H
-
-#define SHMLBA	PAGE_SIZE /* attach addr a multiple of this */
-
-#endif /* _ASM_MICROBLAZE_SHMPARAM_H */
+#include <asm-generic/shmparam.h>
diff --git a/arch/microblaze/include/asm/system.h b/arch/microblaze/include/asm/system.h
index c4e3088..b1ed615 100644
--- a/arch/microblaze/include/asm/system.h
+++ b/arch/microblaze/include/asm/system.h
@@ -13,6 +13,9 @@
 #include <asm/setup.h>
 #include <asm/irqflags.h>
 
+#include <asm-generic/cmpxchg.h>
+#include <asm-generic/cmpxchg-local.h>
+
 struct task_struct;
 struct thread_info;
 
diff --git a/arch/microblaze/include/asm/timex.h b/arch/microblaze/include/asm/timex.h
dissimilarity index 100%
index 678525d..8cdefa7 100644
--- a/arch/microblaze/include/asm/timex.h
+++ b/arch/microblaze/include/asm/timex.h
@@ -1,18 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_TIMEX_H
-#define _ASM_MICROBLAZE_TIMEX_H
-
-#define CLOCK_TICK_RATE 1000 /* Timer input freq. */
-
-typedef unsigned long cycles_t;
-
-#define get_cycles()	(0)
-
-#endif /* _ASM_TIMEX_H */
+#include <asm-generic/timex.h>
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 22/27] microblaze: don't include asm/mmu.h in hw_exception_handler
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (13 preceding siblings ...)
  2009-04-15 13:00 ` [PATCH 23/27] microblaze: convert all simple headers to use asm-generic Remis Lima Baima
@ 2009-04-15 15:28 ` Arnd Bergmann
  2009-04-20 11:53 ` [PATCH 25/27] microblaze: use generic uaccess.h Remis Lima Baima
                   ` (13 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-15 15:28 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The generic mmu.h is not safe for use in assembly, but
also doesn't contain anything that microblaze needs
there.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/kernel/hw_exception_handler.S |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaze/kernel/hw_exception_handler.S
index cf9486d..2c01e80 100644
--- a/arch/microblaze/kernel/hw_exception_handler.S
+++ b/arch/microblaze/kernel/hw_exception_handler.S
@@ -66,7 +66,6 @@
 #include <asm/current.h>
 #include <linux/linkage.h>
 
-#include <asm/mmu.h>
 #include <asm/pgtable.h>
 #include <asm/asm-offsets.h>
 
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 25/27] microblaze: use generic uaccess.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (14 preceding siblings ...)
  2009-04-15 15:28 ` [PATCH 22/27] microblaze: don't include asm/mmu.h in hw_exception_handler Arnd Bergmann
@ 2009-04-20 11:53 ` Remis Lima Baima
  2009-04-27 11:04 ` [PATCH 06/27] asm-generic: clean up asm-generic/io.h Remis Lima Baima
                   ` (12 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-20 11:53 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Adapt microblaze uaccess code to use the uaccess.h generic implementation.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/include/asm/uaccess.h |  164 ++++++---------------------------
 arch/microblaze/lib/uaccess.c         |   42 +--------
 2 files changed, 31 insertions(+), 175 deletions(-)
 rewrite arch/microblaze/include/asm/uaccess.h (86%)
 rewrite arch/microblaze/lib/uaccess.c (97%)

diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h
dissimilarity index 86%
index 5a3ffc3..cc0120d 100644
--- a/arch/microblaze/include/asm/uaccess.h
+++ b/arch/microblaze/include/asm/uaccess.h
@@ -1,134 +1,30 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_UACCESS_H
-#define _ASM_MICROBLAZE_UACCESS_H
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/sched.h> /* RLIMIT_FSIZE */
-#include <linux/mm.h>
-
-#include <asm/mmu.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/segment.h>
-#include <linux/string.h>
-
-#define VERIFY_READ	0
-#define VERIFY_WRITE	1
-
-extern int ___range_ok(unsigned long addr, unsigned long size);
-
-#define __range_ok(addr, size) \
-		___range_ok((unsigned long)(addr), (unsigned long)(size))
-
-#define access_ok(type, addr, size) (__range_ok((addr), (size)) == 0)
-#define __access_ok(add, size) (__range_ok((addr), (size)) == 0)
-
-extern inline int bad_user_access_length(void)
-{
-	return 0;
-}
-/* FIXME this is function for optimalization -> memcpy */
-#define __get_user(var, ptr)					\
-	({							\
-		int __gu_err = 0;				\
-		switch (sizeof(*(ptr))) {			\
-		case 1:						\
-		case 2:						\
-		case 4:						\
-			(var) = *(ptr);				\
-			break;					\
-		case 8:						\
-			memcpy((void *) &(var), (ptr), 8);	\
-			break;					\
-		default:					\
-			(var) = 0;				\
-			__gu_err = __get_user_bad();		\
-			break;					\
-		}						\
-		__gu_err;					\
-	})
-
-#define __get_user_bad()	(bad_user_access_length(), (-EFAULT))
-
-#define __put_user(var, ptr)					\
-	({							\
-		int __pu_err = 0;				\
-		switch (sizeof(*(ptr))) {			\
-		case 1:						\
-		case 2:						\
-		case 4:						\
-			*(ptr) = (var);				\
-			break;					\
-		case 8: {					\
-			typeof(*(ptr)) __pu_val = var;		\
-			memcpy(ptr, &__pu_val, sizeof(__pu_val));\
-			}					\
-			break;					\
-		default:					\
-			__pu_err = __put_user_bad();		\
-			break;					\
-		}							\
-		__pu_err;						\
-	})
-
-#define __put_user_bad()	(bad_user_access_length(), (-EFAULT))
-
-#define put_user(x, ptr)	__put_user(x, ptr)
-#define get_user(x, ptr)	__get_user(x, ptr)
-
-#define copy_to_user(to, from, n)		(memcpy(to, from, n), 0)
-#define copy_from_user(to, from, n)		(memcpy(to, from, n), 0)
-
-#define __copy_to_user(to, from, n)		(copy_to_user(to, from, n))
-#define __copy_from_user(to, from, n)		(copy_from_user(to, from, n))
-#define __copy_to_user_inatomic(to, from, n)	(__copy_to_user(to, from, n))
-#define __copy_from_user_inatomic(to, from, n)	(__copy_from_user(to, from, n))
-
-#define __clear_user(addr, n)	(memset((void *)addr, 0, n), 0)
-
-static inline unsigned long clear_user(void *addr, unsigned long size)
-{
-	if (access_ok(VERIFY_WRITE, addr, size))
-		size = __clear_user(addr, size);
-	return size;
-}
-
-/* Returns 0 if exception not found and fixup otherwise. */
-extern unsigned long search_exception_table(unsigned long);
-
-
-extern long strncpy_from_user(char *dst, const char __user *src, long count);
-extern long strnlen_user(const char __user *src, long count);
-extern long __strncpy_from_user(char *dst, const char __user *src, long count);
-
-/*
- * The exception table consists of pairs of addresses: the first is the
- * address of an instruction that is allowed to fault, and the second is
- * the address at which the program should continue. No registers are
- * modified, so it is entirely up to the continuation code to figure out
- * what to do.
- *
- * All the routines below use bits of fixup code that are out of line
- * with the main instruction path. This means when everything is well,
- * we don't even have to jump over them. Further, they do not intrude
- * on our cache or tlb entries.
- */
-struct exception_table_entry {
-	unsigned long insn, fixup;
-};
-
-#endif  /* __ASSEMBLY__ */
-#endif /* __KERNEL__ */
-
-#endif /* _ASM_MICROBLAZE_UACCESS_H */
+#ifndef _ASM_MICROBLAZE_UACCESS_H
+#define _ASM_MICROBLAZE_UACCESS_H
+/*
+ * Copyright (C) 2006 Atmark Techno, Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+
+#define __access_ok(addr, size) \
+	(___range_ok((unsigned long)(addr), (unsigned long)(size)) == 0)
+extern int ___range_ok(unsigned long addr, unsigned long size);
+
+#define __put_user_bad		bad_user_access_length
+#define __get_user_bad		bad_user_access_length
+extern inline int bad_user_access_length(void)
+{
+	return 0;
+}
+
+#include <asm-generic/uaccess.h>
+
+#endif /* __ASSEMBLY__ */
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_MICROBLAZE_UACCESS_H */
diff --git a/arch/microblaze/lib/uaccess.c b/arch/microblaze/lib/uaccess.c
dissimilarity index 97%
index 8eb9df5..0f2f742 100644
--- a/arch/microblaze/lib/uaccess.c
+++ b/arch/microblaze/lib/uaccess.c
@@ -1,41 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#include <linux/string.h>
-#include <asm/uaccess.h>
-
-#include <asm/bug.h>
-
-long strnlen_user(const char __user *src, long count)
-{
-	return strlen(src) + 1;
-}
-
-#define __do_strncpy_from_user(dst, src, count, res)			\
-	do {								\
-		char *tmp;						\
-		strncpy(dst, src, count);				\
-		for (tmp = dst; *tmp && count > 0; tmp++, count--)	\
-			;						\
-		res = (tmp - dst);					\
-	} while (0)
-
-long __strncpy_from_user(char *dst, const char __user *src, long count)
-{
-	long res;
-	__do_strncpy_from_user(dst, src, count, res);
-	return res;
-}
-
-long strncpy_from_user(char *dst, const char __user *src, long count)
-{
-	long res = -EFAULT;
-	if (access_ok(VERIFY_READ, src, 1))
-		__do_strncpy_from_user(dst, src, count, res);
-	return res;
-}
+#include <asm/uaccess.h>
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 06/27] asm-generic: clean up asm-generic/io.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (15 preceding siblings ...)
  2009-04-20 11:53 ` [PATCH 25/27] microblaze: use generic uaccess.h Remis Lima Baima
@ 2009-04-27 11:04 ` Remis Lima Baima
  2009-04-27 11:10 ` [PATCH 26/27] microblaze: make io.h use asm-generic/io.h Remis Lima Baima
                   ` (11 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-27 11:04 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Fix various aspects of the new asm-generic/io.h, in particular
warnings from sparse regarding __iomem annotations.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/asm-generic/io.h |   37 ++++++++++++++++---------------------
 1 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h
index 8377715..5ae45e5 100644
--- a/include/asm-generic/io.h
+++ b/include/asm-generic/io.h
@@ -13,6 +13,7 @@
 
 #include <asm/page.h> /* I/O is all done through memory accesses */
 #include <asm/cacheflush.h>
+#include <linux/types.h>
 
 #ifdef CONFIG_GENERIC_IOMAP
 #include <asm-generic/iomap.h>
@@ -29,17 +30,17 @@
  */
 static inline u8 __raw_readb(const volatile void __iomem *addr)
 {
-	return *(const volatile u8 *) addr;
+	return *(const volatile u8 __force *) addr;
 }
 
 static inline u16 __raw_readw(const volatile void __iomem *addr)
 {
-	return *(const volatile u16 *) addr;
+	return *(const volatile u16 __force *) addr;
 }
 
 static inline u32 __raw_readl(const volatile void __iomem *addr)
 {
-	return *(const volatile u32 *) addr;
+	return *(const volatile u32 __force *) addr;
 }
 
 #define readb __raw_readb
@@ -48,17 +49,17 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)
 
 static inline void __raw_writeb(u8 b, volatile void __iomem *addr)
 {
-	*(volatile u8 *) addr = b;
+	*(volatile u8 __force *) addr = b;
 }
 
 static inline void __raw_writew(u16 b, volatile void __iomem *addr)
 {
-	*(volatile u16 *) addr = b;
+	*(volatile u16 __force *) addr = b;
 }
 
 static inline void __raw_writel(u32 b, volatile void __iomem *addr)
 {
-	*(volatile u32 *) addr = b;
+	*(volatile u32 __force *) addr = b;
 }
 
 #define writeb __raw_writeb
@@ -68,13 +69,13 @@ static inline void __raw_writel(u32 b, volatile void __iomem *addr)
 #ifdef CONFIG_64BIT
 static inline u64 __raw_readq(const volatile void __iomem *addr)
 {
-	return *(const volatile u64 *) addr;
+	return *(const volatile u64 __force *) addr;
 }
 #define readq(addr) __le64_to_cpu(__raw_readq(addr))
 
 static inline void __raw_writeq(u64 b, volatile void __iomem *addr)
 {
-	*(volatile u64 *) addr = b;
+	*(volatile u64 __force *) addr = b;
 }
 #define writeq(b,addr) __raw_writeq(__cpu_to_le64(b),addr)
 #endif
@@ -101,17 +102,17 @@ static inline u32 inl(unsigned long addr)
 
 static inline void outb(u8 b, unsigned long addr)
 {
-	return writeb(b, (volatile void __iomem *) addr);
+	writeb(b, (volatile void __iomem *) addr);
 }
 
 static inline void outw(u16 b, unsigned long addr)
 {
-	return writew(b, (volatile void __iomem *) addr);
+	writew(b, (volatile void __iomem *) addr);
 }
 
 static inline void outl(u32 b, unsigned long addr)
 {
-	return writel(b, (volatile void __iomem *) addr);
+	writel(b, (volatile void __iomem *) addr);
 }
 
 #define inb_p(addr)	inb(addr)
@@ -231,7 +232,7 @@ static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p)
  */
 static inline unsigned long virt_to_phys(volatile void *address)
 {
-	return __pa(address);
+	return __pa((unsigned long)address);
 }
 
 static inline void *phys_to_virt(unsigned long address)
@@ -242,16 +243,12 @@ static inline void *phys_to_virt(unsigned long address)
 /*
  * Change "struct page" to physical address.
  */
-static inline void *__ioremap(unsigned long offset, unsigned long size,
-			      unsigned long flags)
+static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)
 {
 	return (void *) offset;
 }
 
-static inline void *ioremap(unsigned long offset, unsigned long size)
-{
-	return (void *) offset;
-}
+#define __ioremap(offset, size, flags)	ioremap(offset, size)
 
 #ifndef ioremap_nocache
 #define ioremap_nocache ioremap
@@ -279,7 +276,7 @@ extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
 extern void ioport_unmap(void __iomem *p);
 #endif /* CONFIG_GENERIC_IOMAP */
 
-#define xlate_dev_kmem_ptr(p)	((void *) (p))
+#define xlate_dev_kmem_ptr(p)	p
 #define xlate_dev_mem_ptr(p)	((void *) (p))
 
 #ifndef virt_to_bus
@@ -294,8 +291,6 @@ static inline void *bus_to_virt(unsigned long address)
 }
 #endif
 
-#define page_to_bus page_to_phys
-
 #define memset_io(a, b, c)	memset(__io_virt(a), (b), (c))
 #define memcpy_fromio(a, b, c)	memcpy((a), __io_virt(b), (c))
 #define memcpy_toio(a, b, c)	memcpy(__io_virt(a), (b), (c))
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 26/27] microblaze: make io.h use asm-generic/io.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (16 preceding siblings ...)
  2009-04-27 11:04 ` [PATCH 06/27] asm-generic: clean up asm-generic/io.h Remis Lima Baima
@ 2009-04-27 11:10 ` Remis Lima Baima
  2009-04-27 12:42 ` [PATCH 27/27] microblaze: use generic system.h Remis Lima Baima
                   ` (10 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-27 11:10 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 arch/microblaze/include/asm/io.h |  240 +++++---------------------------------
 1 files changed, 32 insertions(+), 208 deletions(-)
 rewrite arch/microblaze/include/asm/io.h (94%)

diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h
dissimilarity index 94%
index 8b5853e..1c2dffd 100644
--- a/arch/microblaze/include/asm/io.h
+++ b/arch/microblaze/include/asm/io.h
@@ -1,208 +1,32 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_IO_H
-#define _ASM_MICROBLAZE_IO_H
-
-#include <asm/byteorder.h>
-#include <asm/page.h>
-#include <linux/types.h>
-
-#define IO_SPACE_LIMIT (0xFFFFFFFF)
-
-static inline unsigned char __raw_readb(const volatile void __iomem *addr)
-{
-	return *(volatile unsigned char __force *)addr;
-}
-static inline unsigned short __raw_readw(const volatile void __iomem *addr)
-{
-	return *(volatile unsigned short __force *)addr;
-}
-static inline unsigned int __raw_readl(const volatile void __iomem *addr)
-{
-	return *(volatile unsigned int __force *)addr;
-}
-static inline unsigned long __raw_readq(const volatile void __iomem *addr)
-{
-	return *(volatile unsigned long __force *)addr;
-}
-static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
-{
-	*(volatile unsigned char __force *)addr = v;
-}
-static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
-{
-	*(volatile unsigned short __force *)addr = v;
-}
-static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
-{
-	*(volatile unsigned int __force *)addr = v;
-}
-static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
-{
-	*(volatile unsigned long __force *)addr = v;
-}
-
-/*
- * read (readb, readw, readl, readq) and write (writeb, writew,
- * writel, writeq) accessors are for PCI and thus littel endian.
- * Linux 2.4 for Microblaze had this wrong.
- */
-static inline unsigned char readb(const volatile void __iomem *addr)
-{
-	return *(volatile unsigned char __force *)addr;
-}
-static inline unsigned short readw(const volatile void __iomem *addr)
-{
-	return le16_to_cpu(*(volatile unsigned short __force *)addr);
-}
-static inline unsigned int readl(const volatile void __iomem *addr)
-{
-	return le32_to_cpu(*(volatile unsigned int __force *)addr);
-}
-static inline void writeb(unsigned char v, volatile void __iomem *addr)
-{
-	*(volatile unsigned char __force *)addr = v;
-}
-static inline void writew(unsigned short v, volatile void __iomem *addr)
-{
-	*(volatile unsigned short __force *)addr = cpu_to_le16(v);
-}
-static inline void writel(unsigned int v, volatile void __iomem *addr)
-{
-	*(volatile unsigned int __force *)addr = cpu_to_le32(v);
-}
-
-/* ioread and iowrite variants. thease are for now same as __raw_
- * variants of accessors. we might check for endianess in the feature
- */
-#define ioread8(addr)		__raw_readb((u8 *)(addr))
-#define ioread16(addr)		__raw_readw((u16 *)(addr))
-#define ioread32(addr)		__raw_readl((u32 *)(addr))
-#define iowrite8(v, addr)	__raw_writeb((u8)(v), (u8 *)(addr))
-#define iowrite16(v, addr)	__raw_writew((u16)(v), (u16 *)(addr))
-#define iowrite32(v, addr)	__raw_writel((u32)(v), (u32 *)(addr))
-
-/* These are the definitions for the x86 IO instructions
- * inb/inw/inl/outb/outw/outl, the "string" versions
- * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions
- * inb_p/inw_p/...
- * The macros don't do byte-swapping.
- */
-#define inb(port)		readb((u8 *)((port)))
-#define outb(val, port)		writeb((val), (u8 *)((unsigned long)(port)))
-#define inw(port)		readw((u16 *)((port)))
-#define outw(val, port)		writew((val), (u16 *)((unsigned long)(port)))
-#define inl(port)		readl((u32 *)((port)))
-#define outl(val, port)		writel((val), (u32 *)((unsigned long)(port)))
-
-#define inb_p(port)		inb((port))
-#define outb_p(val, port)	outb((val), (port))
-#define inw_p(port)		inw((port))
-#define outw_p(val, port)	outw((val), (port))
-#define inl_p(port)		inl((port))
-#define outl_p(val, port)	outl((val), (port))
-
-#define memset_io(a, b, c)	memset((void *)(a), (b), (c))
-#define memcpy_fromio(a, b, c)	memcpy((a), (void *)(b), (c))
-#define memcpy_toio(a, b, c)	memcpy((void *)(a), (b), (c))
-
-/**
- *	virt_to_phys - map virtual addresses to physical
- *	@address: address to remap
- *
- *	The returned physical address is the physical (CPU) mapping for
- *	the memory address given. It is only valid to use this function on
- *	addresses directly mapped or allocated via kmalloc.
- *
- *	This function does not give bus mappings for DMA transfers. In
- *	almost all conceivable cases a device driver should not be using
- *	this function
- */
-static inline unsigned long __iomem virt_to_phys(volatile void *address)
-{
-	return __pa((unsigned long)address);
-}
-
-#define virt_to_bus virt_to_phys
-
-/**
- *	phys_to_virt - map physical address to virtual
- *	@address: address to remap
- *
- *	The returned virtual address is a current CPU mapping for
- *	the memory address given. It is only valid to use this function on
- *	addresses that have a kernel mapping
- *
- *	This function does not handle bus mappings for DMA transfers. In
- *	almost all conceivable cases a device driver should not be using
- *	this function
- */
-static inline void *phys_to_virt(unsigned long address)
-{
-	return (void *)__va(address);
-}
-
-#define bus_to_virt(a) phys_to_virt(a)
-
-static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size,
-			unsigned long flags)
-{
-	return (void *)address;
-}
-
-#define ioremap(physaddr, size)	((void __iomem *)(unsigned long)(physaddr))
-#define iounmap(addr)		((void)0)
-#define ioremap_nocache(physaddr, size)	ioremap(physaddr, size)
-
-/*
- * Convert a physical pointer to a virtual kernel pointer for /dev/mem
- * access
- */
-#define xlate_dev_mem_ptr(p)	__va(p)
-
-/*
- * Convert a virtual cached pointer to an uncached pointer
- */
-#define xlate_dev_kmem_ptr(p)	p
-
-/*
- * Big Endian
- */
-#define out_be32(a, v) __raw_writel((v), (void __iomem __force *)(a))
-#define out_be16(a, v) __raw_writew((v), (a))
-
-#define in_be32(a) __raw_readl((const void __iomem __force *)(a))
-#define in_be16(a) __raw_readw(a)
-
-/*
- * Little endian
- */
-
-#define out_le32(a, v) __raw_writel(__cpu_to_le32(v), (a));
-#define out_le16(a, v) __raw_writew(__cpu_to_le16(v), (a))
-
-#define in_le32(a) __le32_to_cpu(__raw_readl(a))
-#define in_le16(a) __le16_to_cpu(__raw_readw(a))
-
-/* Byte ops */
-#define out_8(a, v) __raw_writeb((v), (a))
-#define in_8(a) __raw_readb(a)
-
-/* FIXME */
-static inline void __iomem *ioport_map(unsigned long port, unsigned int len)
-{
-	return (void __iomem *) (port);
-}
-
-static inline void ioport_unmap(void __iomem *addr)
-{
-	/* Nothing to do */
-}
-
-#endif /* _ASM_MICROBLAZE_IO_H */
+/*
+ * Copyright (C) 2006 Atmark Techno, Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#ifndef _ASM_MICROBLAZE_IO_H
+#define _ASM_MICROBLAZE_IO_H
+
+#include <asm-generic/io.h>
+
+#define virt_to_bus	virt_to_phys
+#define bus_to_virt	phys_to_virt
+
+/* Big Endian */
+#define out_be32(a, v)	__raw_writel((v), (void __iomem __force *)(a))
+#define out_be16(a, v)	__raw_writew((v), (a))
+#define in_be32(a)	__raw_readl((const void __iomem __force *)(a))
+#define in_be16(a)	__raw_readw(a)
+
+/* Little endian */
+#define out_le32(a, v)	__raw_writel(__cpu_to_le32(v), (a));
+#define out_le16(a, v)	__raw_writew(__cpu_to_le16(v), (a))
+#define in_le32(a)	__le32_to_cpu(__raw_readl(a))
+#define in_le16(a)	__le16_to_cpu(__raw_readw(a))
+
+/* Byte ops */
+#define out_8(a, v)	__raw_writeb((v), (a))
+#define in_8(a)		__raw_readb(a)
+
+#endif /* _ASM_MICROBLAZE_IO_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 27/27] microblaze: use generic system.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (17 preceding siblings ...)
  2009-04-27 11:10 ` [PATCH 26/27] microblaze: make io.h use asm-generic/io.h Remis Lima Baima
@ 2009-04-27 12:42 ` Remis Lima Baima
  2009-04-27 15:18 ` [PATCH 21/27] microblaze: use generic swab.h Arnd Bergmann
                   ` (9 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Remis Lima Baima @ 2009-04-27 12:42 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Parts of the microblaze system.h can be removed by
falling back to the asm-generic version.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/include/asm/cmpxchg-local.h |    1 +
 arch/microblaze/include/asm/irqflags.h      |    2 +-
 arch/microblaze/include/asm/system.h        |  124 +++++++--------------------
 3 files changed, 32 insertions(+), 95 deletions(-)
 create mode 100644 arch/microblaze/include/asm/cmpxchg-local.h
 rewrite arch/microblaze/include/asm/system.h (67%)

diff --git a/arch/microblaze/include/asm/cmpxchg-local.h b/arch/microblaze/include/asm/cmpxchg-local.h
new file mode 100644
index 0000000..d3358a3
--- /dev/null
+++ b/arch/microblaze/include/asm/cmpxchg-local.h
@@ -0,0 +1 @@
+#include <asm-generic/cmpxchg-local.h>
diff --git a/arch/microblaze/include/asm/irqflags.h b/arch/microblaze/include/asm/irqflags.h
index dea6564..a6dbdee 100644
--- a/arch/microblaze/include/asm/irqflags.h
+++ b/arch/microblaze/include/asm/irqflags.h
@@ -9,7 +9,7 @@
 #ifndef _ASM_MICROBLAZE_IRQFLAGS_H
 #define _ASM_MICROBLAZE_IRQFLAGS_H
 
-#include <linux/irqflags.h>
+#include <asm/registers.h>
 
 # if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
 
diff --git a/arch/microblaze/include/asm/system.h b/arch/microblaze/include/asm/system.h
dissimilarity index 67%
index b1ed615..a26ef8e 100644
--- a/arch/microblaze/include/asm/system.h
+++ b/arch/microblaze/include/asm/system.h
@@ -1,94 +1,30 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_SYSTEM_H
-#define _ASM_MICROBLAZE_SYSTEM_H
-
-#include <asm/registers.h>
-#include <asm/setup.h>
-#include <asm/irqflags.h>
-
-#include <asm-generic/cmpxchg.h>
-#include <asm-generic/cmpxchg-local.h>
-
-struct task_struct;
-struct thread_info;
-
-extern struct task_struct *_switch_to(struct thread_info *prev,
-					struct thread_info *next);
-
-#define switch_to(prev, next, last)					\
-	do {								\
-		(last) = _switch_to(task_thread_info(prev),		\
-					task_thread_info(next));	\
-	} while (0)
-
-#define smp_read_barrier_depends()	do {} while (0)
-#define read_barrier_depends()		do {} while (0)
-
-#define nop()			asm volatile ("nop")
-#define mb()			barrier()
-#define rmb()			mb()
-#define wmb()			mb()
-#define set_mb(var, value)	do { var = value; mb(); } while (0)
-#define set_wmb(var, value)	do { var = value; wmb(); } while (0)
-
-#define smp_mb()		mb()
-#define smp_rmb()		rmb()
-#define smp_wmb()		wmb()
-
-void show_trace(struct task_struct *task, unsigned long *stack);
-void __bad_xchg(volatile void *ptr, int size);
-
-static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
-								int size)
-{
-	unsigned long ret;
-	unsigned long flags;
-
-	switch (size) {
-	case 1:
-		local_irq_save(flags);
-		ret = *(volatile unsigned char *)ptr;
-		*(volatile unsigned char *)ptr = x;
-		local_irq_restore(flags);
-		break;
-
-	case 4:
-		local_irq_save(flags);
-		ret = *(volatile unsigned long *)ptr;
-		*(volatile unsigned long *)ptr = x;
-		local_irq_restore(flags);
-		break;
-	default:
-		__bad_xchg(ptr, size), ret = 0;
-		break;
-	}
-
-	return ret;
-}
-
-void disable_hlt(void);
-void enable_hlt(void);
-void default_idle(void);
-
-#define xchg(ptr, x) \
-	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
-
-void free_init_pages(char *what, unsigned long begin, unsigned long end);
-void free_initmem(void);
-extern char *klimit;
-extern void ret_from_fork(void);
-
-#ifdef CONFIG_DEBUG_FS
-extern struct dentry *of_debugfs_root;
-#endif
-
-#define arch_align_stack(x) (x)
-
-#endif /* _ASM_MICROBLAZE_SYSTEM_H */
+/*
+ * Copyright (C) 2006 Atmark Techno, Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#ifndef _ASM_MICROBLAZE_SYSTEM_H
+#define _ASM_MICROBLAZE_SYSTEM_H
+
+#define __switch_to	_switch_to
+
+#include <asm/irqflags.h>
+#include <asm-generic/system.h>
+
+#ifdef CONFIG_DEBUG_FS
+extern struct dentry *of_debugfs_root;
+#endif
+
+void show_trace(struct task_struct *task, unsigned long *stack);
+void disable_hlt(void);
+void enable_hlt(void);
+void default_idle(void);
+void free_init_pages(char *what, unsigned long begin, unsigned long end);
+void free_initmem(void);
+
+extern char *klimit;
+extern void ret_from_fork(void);
+
+#endif /* _ASM_MICROBLAZE_SYSTEM_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 21/27] microblaze: use generic swab.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (18 preceding siblings ...)
  2009-04-27 12:42 ` [PATCH 27/27] microblaze: use generic system.h Remis Lima Baima
@ 2009-04-27 15:18 ` Arnd Bergmann
  2009-04-27 15:34 ` [PATCH 16/27] asm-generic: introduce generic syscalls.h Arnd Bergmann
                   ` (8 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-27 15:18 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/include/asm/swab.h |    9 +--------
 1 files changed, 1 insertions(+), 8 deletions(-)

diff --git a/arch/microblaze/include/asm/swab.h b/arch/microblaze/include/asm/swab.h
index b375d7b..7847e56 100644
--- a/arch/microblaze/include/asm/swab.h
+++ b/arch/microblaze/include/asm/swab.h
@@ -1,8 +1 @@
-#ifndef _ASM_MICROBLAZE_SWAB_H
-#define _ASM_MICROBLAZE_SWAB_H
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
-#define __SWAB_64_THRU_32__
-#endif
-
-#endif /* _ASM_MICROBLAZE_SWAB_H */
+#include <asm-generic/swab.h>
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 16/27] asm-generic: introduce generic syscalls.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (19 preceding siblings ...)
  2009-04-27 15:18 ` [PATCH 21/27] microblaze: use generic swab.h Arnd Bergmann
@ 2009-04-27 15:34 ` Arnd Bergmann
  2009-04-27 15:38 ` [PATCH 24/27] microblaze: use generic dma-mapping.h Arnd Bergmann
                   ` (7 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-27 15:34 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Add a generic syscalls.h with all common system
calls that can not be declared in linux/syscalls.h
because some architectures have unusual signatures.

All prototypes in here can be overriden by the
architecture but default to the most common variant.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/asm-generic/syscalls.h |   60 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/syscalls.h

diff --git a/include/asm-generic/syscalls.h b/include/asm-generic/syscalls.h
new file mode 100644
index 0000000..23c6f6e
--- /dev/null
+++ b/include/asm-generic/syscalls.h
@@ -0,0 +1,60 @@
+#ifndef __ASM_GENERIC_SYSCALLS_H
+#define __ASM_GENERIC_SYSCALLS_H
+
+#include <linux/compiler.h>
+#include <linux/linkage.h>
+
+/*
+ * Calling conventions for these system calls can differ, so
+ * it's possible to override them.
+ */
+#ifndef sys_clone
+asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp,
+			void __user *parent_tid, void __user *child_tid,
+			struct pt_regs *regs);
+#endif
+
+#ifndef sys_fork
+asmlinkage long sys_fork(struct pt_regs *regs);
+#endif
+
+#ifndef sys_fork
+asmlinkage long sys_vfork(struct pt_regs *regs);
+#endif
+
+#ifndef sys_execve
+asmlinkage long sys_execve(char __user *filename, char __user * __user *argv,
+			char __user * __user *envp, struct pt_regs *regs);
+#endif
+
+#ifndef sys_mmap2
+asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
+			unsigned long prot, unsigned long flags,
+			unsigned long fd, unsigned long pgoff);
+#endif
+
+#ifndef sys_mmap
+asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
+			unsigned long prot, unsigned long flags,
+			unsigned long fd, off_t pgoff);
+#endif
+
+#ifndef sys_sigaltstack
+asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *,
+			struct pt_regs *);
+#endif
+
+#ifndef sys_rt_sigreturn
+asmlinkage long sys_rt_sigreturn(struct pt_regs *regs);
+#endif
+
+#ifndef sys_rt_sigsuspend
+asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize);
+#endif
+
+#ifndef sys_rt_sigaction
+asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user *act,
+			 struct sigaction __user *oact, size_t sigsetsize);
+#endif
+
+#endif /* __ASM_GENERIC_SYSCALLS_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 24/27] microblaze: use generic dma-mapping.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (20 preceding siblings ...)
  2009-04-27 15:34 ` [PATCH 16/27] asm-generic: introduce generic syscalls.h Arnd Bergmann
@ 2009-04-27 15:38 ` Arnd Bergmann
  2009-04-28 14:15 ` [PATCH 08/27] asm-generic: add generic versions of common headers Arnd Bergmann
                   ` (6 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-27 15:38 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Microblaze does not support the Linux DMA mapping API
at this point, so disable CONFIG_NO_DMA. This lets
us use the generic dma-mapping-broken.h implementation
instead of providing a different copy.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/Kconfig                   |    2 +-
 arch/microblaze/include/asm/dma-mapping.h |  130 +----------------------------
 2 files changed, 2 insertions(+), 130 deletions(-)
 rewrite arch/microblaze/include/asm/dma-mapping.h (100%)

diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 0651179..2508352 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -61,7 +61,7 @@ config PCI
 
 config NO_DMA
 	depends on !MMU
-	def_bool n
+	def_bool y
 
 source "init/Kconfig"
 
diff --git a/arch/microblaze/include/asm/dma-mapping.h b/arch/microblaze/include/asm/dma-mapping.h
dissimilarity index 100%
index 1733625..d00e400 100644
--- a/arch/microblaze/include/asm/dma-mapping.h
+++ b/arch/microblaze/include/asm/dma-mapping.h
@@ -1,129 +1 @@
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_DMA_MAPPING_H
-#define _ASM_MICROBLAZE_DMA_MAPPING_H
-
-#include <asm/cacheflush.h>
-#include <linux/io.h>
-#include <linux/bug.h>
-
-struct scatterlist;
-
-#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
-#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
-
-/* FIXME */
-static inline int
-dma_supported(struct device *dev, u64 mask)
-{
-	return 1;
-}
-
-static inline dma_addr_t
-dma_map_page(struct device *dev, struct page *page,
-	unsigned long offset, size_t size,
-	enum dma_data_direction direction)
-{
-	BUG();
-	return 0;
-}
-
-static inline void
-dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-	enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline int
-dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-	enum dma_data_direction direction)
-{
-	BUG();
-	return 0;
-}
-
-static inline void
-dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-	enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-			enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-		size_t size, enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-		enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-		enum dma_data_direction direction)
-{
-	BUG();
-}
-
-static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
-{
-	return 0;
-}
-
-static inline void *dma_alloc_coherent(struct device *dev, size_t size,
-				dma_addr_t *dma_handle, int flag)
-{
-	return NULL; /* consistent_alloc(flag, size, dma_handle); */
-}
-
-static inline void dma_free_coherent(struct device *dev, size_t size,
-			void *vaddr, dma_addr_t dma_handle)
-{
-	BUG();
-}
-
-static inline dma_addr_t
-dma_map_single(struct device *dev, void *ptr, size_t size,
-	enum dma_data_direction direction)
-{
-	BUG_ON(direction == DMA_NONE);
-
-	return virt_to_bus(ptr);
-}
-
-static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
-				    size_t size,
-				    enum dma_data_direction direction)
-{
-	switch (direction) {
-	case DMA_FROM_DEVICE:
-		flush_dcache_range((unsigned)dma_addr,
-			(unsigned)dma_addr + size);
-			/* Fall through */
-	case DMA_TO_DEVICE:
-		break;
-	default:
-		BUG();
-	}
-}
-
-#endif /* _ASM_MICROBLAZE_DMA_MAPPING_H */
+#include <asm-generic/dma-mapping-broken.h>
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (21 preceding siblings ...)
  2009-04-27 15:38 ` [PATCH 24/27] microblaze: use generic dma-mapping.h Arnd Bergmann
@ 2009-04-28 14:15 ` Arnd Bergmann
  2009-04-30 16:41   ` David Miller
  2009-04-29 13:33 ` [PATCH 13/27] asm-generic: make uaccess.h usable by mmu archs Arnd Bergmann
                   ` (5 subsequent siblings)
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-28 14:15 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

These are all kernel internal interfaces that get copied
around a lot. In most cases, architectures can provide
their own optimized versions, but these generic versions
can work as well.

I have tried to use the most common contents of each
header to allow existing architectures to migrate easily.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
---
 include/asm-generic/bugs.h        |   10 +++
 include/asm-generic/current.h     |    9 ++
 include/asm-generic/delay.h       |    9 ++
 include/asm-generic/fb.h          |   12 +++
 include/asm-generic/hardirq.h     |   34 ++++++++
 include/asm-generic/irq.h         |   18 ++++
 include/asm-generic/irqflags.h    |   72 ++++++++++++++++
 include/asm-generic/kmap_types.h  |   29 +++++++
 include/asm-generic/linkage.h     |    8 ++
 include/asm-generic/module.h      |   22 +++++
 include/asm-generic/mutex.h       |    9 ++
 include/asm-generic/scatterlist.h |   43 ++++++++++
 include/asm-generic/spinlock.h    |   11 +++
 include/asm-generic/string.h      |   10 +++
 include/asm-generic/system.h      |  161 +++++++++++++++++++++++++++++++++++++
 include/asm-generic/user.h        |    8 ++
 16 files changed, 465 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/bugs.h
 create mode 100644 include/asm-generic/current.h
 create mode 100644 include/asm-generic/delay.h
 create mode 100644 include/asm-generic/fb.h
 create mode 100644 include/asm-generic/hardirq.h
 create mode 100644 include/asm-generic/irq.h
 create mode 100644 include/asm-generic/irqflags.h
 create mode 100644 include/asm-generic/kmap_types.h
 create mode 100644 include/asm-generic/linkage.h
 create mode 100644 include/asm-generic/module.h
 create mode 100644 include/asm-generic/mutex.h
 create mode 100644 include/asm-generic/scatterlist.h
 create mode 100644 include/asm-generic/spinlock.h
 create mode 100644 include/asm-generic/string.h
 create mode 100644 include/asm-generic/system.h
 create mode 100644 include/asm-generic/user.h

diff --git a/include/asm-generic/bugs.h b/include/asm-generic/bugs.h
new file mode 100644
index 0000000..6c4f62e
--- /dev/null
+++ b/include/asm-generic/bugs.h
@@ -0,0 +1,10 @@
+#ifndef __ASM_GENERIC_BUGS_H
+#define __ASM_GENERIC_BUGS_H
+/*
+ * This file is included by 'init/main.c' to check for
+ * architecture-dependent bugs.
+ */
+
+static inline void check_bugs(void) { }
+
+#endif	/* __ASM_GENERIC_BUGS_H */
diff --git a/include/asm-generic/current.h b/include/asm-generic/current.h
new file mode 100644
index 0000000..5e86f6a
--- /dev/null
+++ b/include/asm-generic/current.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_GENERIC_CURRENT_H
+#define __ASM_GENERIC_CURRENT_H
+
+#include <linux/thread_info.h>
+
+#define get_current() (current_thread_info()->task)
+#define current get_current()
+
+#endif /* __ASM_GENERIC_CURRENT_H */
diff --git a/include/asm-generic/delay.h b/include/asm-generic/delay.h
new file mode 100644
index 0000000..4586fec
--- /dev/null
+++ b/include/asm-generic/delay.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_GENERIC_DELAY_H
+#define __ASM_GENERIC_DELAY_H
+
+extern void __udelay(unsigned long usecs);
+extern void __delay(unsigned long loops);
+
+#define udelay(n) __udelay(n)
+
+#endif /* __ASM_GENERIC_DELAY_H */
diff --git a/include/asm-generic/fb.h b/include/asm-generic/fb.h
new file mode 100644
index 0000000..fe8ca7f
--- /dev/null
+++ b/include/asm-generic/fb.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_GENERIC_FB_H_
+#define __ASM_GENERIC_FB_H_
+#include <linux/fb.h>
+
+#define fb_pgprotect(...) do {} while (0)
+
+static inline int fb_is_primary_device(struct fb_info *info)
+{
+	return 0;
+}
+
+#endif /* __ASM_GENERIC_FB_H_ */
diff --git a/include/asm-generic/hardirq.h b/include/asm-generic/hardirq.h
new file mode 100644
index 0000000..3d5d2c9
--- /dev/null
+++ b/include/asm-generic/hardirq.h
@@ -0,0 +1,34 @@
+#ifndef __ASM_GENERIC_HARDIRQ_H
+#define __ASM_GENERIC_HARDIRQ_H
+
+#include <linux/cache.h>
+#include <linux/threads.h>
+#include <linux/irq.h>
+
+typedef struct {
+	unsigned long __softirq_pending;
+} ____cacheline_aligned irq_cpustat_t;
+
+#include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */
+
+#ifndef HARDIRQ_BITS
+#define HARDIRQ_BITS	8
+#endif
+
+/*
+ * The hardirq mask has to be large enough to have
+ * space for potentially all IRQ sources in the system
+ * nesting on a single CPU:
+ */
+#if (1 << HARDIRQ_BITS) < NR_IRQS
+# error HARDIRQ_BITS is too low!
+#endif
+
+#ifndef ack_bad_irq
+static inline void ack_bad_irq(unsigned int irq)
+{
+	printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq);
+}
+#endif
+
+#endif /* __ASM_GENERIC_HARDIRQ_H */
diff --git a/include/asm-generic/irq.h b/include/asm-generic/irq.h
new file mode 100644
index 0000000..b90ec0b
--- /dev/null
+++ b/include/asm-generic/irq.h
@@ -0,0 +1,18 @@
+#ifndef __ASM_GENERIC_IRQ_H
+#define __ASM_GENERIC_IRQ_H
+
+/*
+ * NR_IRQS is the upper bound of how many interrupts can be handled
+ * in the platform. It is used to size the static irq_map array,
+ * so don't make it too big.
+ */
+#ifndef NR_IRQS
+#define NR_IRQS 64
+#endif
+
+static inline int irq_canonicalize(int irq)
+{
+	return irq;
+}
+
+#endif /* __ASM_GENERIC_IRQ_H */
diff --git a/include/asm-generic/irqflags.h b/include/asm-generic/irqflags.h
new file mode 100644
index 0000000..9aebf61
--- /dev/null
+++ b/include/asm-generic/irqflags.h
@@ -0,0 +1,72 @@
+#ifndef __ASM_GENERIC_IRQFLAGS_H
+#define __ASM_GENERIC_IRQFLAGS_H
+
+/*
+ * All architectures should implement at least the first two functions,
+ * usually inline assembly will be the best way.
+ */
+#ifndef RAW_IRQ_DISABLED
+#define RAW_IRQ_DISABLED 0
+#define RAW_IRQ_ENABLED 1
+#endif
+
+/* read interrupt enabled status */
+#ifndef __raw_local_save_flags
+unsigned long __raw_local_save_flags(void);
+#endif
+
+/* set interrupt enabled status */
+#ifndef raw_local_irq_restore
+void raw_local_irq_restore(unsigned long flags);
+#endif
+
+/* get status and disable interrupts */
+#ifndef __raw_local_irq_save
+static inline unsigned long __raw_local_irq_save(void)
+{
+	unsigned long flags;
+	flags = __raw_local_save_flags();
+	raw_local_irq_restore(RAW_IRQ_DISABLED);
+	return flags;
+}
+#endif
+
+/* test flags */
+#ifndef raw_irqs_disabled_flags
+static inline int raw_irqs_disabled_flags(unsigned long flags)
+{
+	return flags == RAW_IRQ_DISABLED;
+}
+#endif
+
+/* unconditionally enable interrupts */
+#ifndef raw_local_irq_enable
+static inline void raw_local_irq_enable(void)
+{
+	raw_local_irq_restore(RAW_IRQ_ENABLED);
+}
+#endif
+
+/* unconditionally disable interrupts */
+#ifndef raw_local_irq_disable
+static inline void raw_local_irq_disable(void)
+{
+	raw_local_irq_restore(RAW_IRQ_DISABLED);
+}
+#endif
+
+/* test hardware interrupt enable bit */
+#ifndef raw_irqs_disabled
+static inline int raw_irqs_disabled(void)
+{
+	return raw_irqs_disabled_flags(__raw_local_save_flags());
+}
+#endif
+
+#define raw_local_save_flags(flags) \
+	do { (flags) = __raw_local_save_flags(); } while (0)
+
+#define raw_local_irq_save(flags) \
+	do { (flags) = __raw_local_irq_save(); } while (0)
+
+#endif /* __ASM_GENERIC_IRQFLAGS_H */
diff --git a/include/asm-generic/kmap_types.h b/include/asm-generic/kmap_types.h
new file mode 100644
index 0000000..36996bc
--- /dev/null
+++ b/include/asm-generic/kmap_types.h
@@ -0,0 +1,29 @@
+#ifndef __ASM_GENERIC_KMAP_TYPES_H
+#define __ASM_GENERIC_KMAP_TYPES_H
+
+#ifdef CONFIG_DEBUG_HIGHMEM
+# define D(n) __KM_FENCE_##n ,
+#else
+# define D(n)
+#endif
+
+enum km_type {
+D(0)	KM_BOUNCE_READ,
+D(1)	KM_SKB_SUNRPC_DATA,
+D(2)	KM_SKB_DATA_SOFTIRQ,
+D(3)	KM_USER0,
+D(4)	KM_USER1,
+D(5)	KM_BIO_SRC_IRQ,
+D(6)	KM_BIO_DST_IRQ,
+D(7)	KM_PTE0,
+D(8)	KM_PTE1,
+D(9)	KM_IRQ0,
+D(10)	KM_IRQ1,
+D(11)	KM_SOFTIRQ0,
+D(12)	KM_SOFTIRQ1,
+D(13)	KM_TYPE_NR
+};
+
+#undef D
+
+#endif /* __ASM_GENERIC_KMAP_TYPES_H */
diff --git a/include/asm-generic/linkage.h b/include/asm-generic/linkage.h
new file mode 100644
index 0000000..fef7a01
--- /dev/null
+++ b/include/asm-generic/linkage.h
@@ -0,0 +1,8 @@
+#ifndef __ASM_GENERIC_LINKAGE_H
+#define __ASM_GENERIC_LINKAGE_H
+/*
+ * linux/linkage.h provides reasonable defaults.
+ * an architecture can override them by providing its own version.
+ */
+
+#endif /* __ASM_GENERIC_LINKAGE_H */
diff --git a/include/asm-generic/module.h b/include/asm-generic/module.h
new file mode 100644
index 0000000..ed5b44d
--- /dev/null
+++ b/include/asm-generic/module.h
@@ -0,0 +1,22 @@
+#ifndef __ASM_GENERIC_MODULE_H
+#define __ASM_GENERIC_MODULE_H
+
+/*
+ * Many architectures just need a simple module
+ * loader without arch specific data.
+ */
+struct mod_arch_specific
+{
+};
+
+#ifdef CONFIG_64BIT
+#define Elf_Shdr Elf64_Shdr
+#define Elf_Sym Elf64_Sym
+#define Elf_Ehdr Elf64_Ehdr
+#else
+#define Elf_Shdr Elf32_Shdr
+#define Elf_Sym Elf32_Sym
+#define Elf_Ehdr Elf32_Ehdr
+#endif
+
+#endif /* __ASM_GENERIC_MODULE_H */
diff --git a/include/asm-generic/mutex.h b/include/asm-generic/mutex.h
new file mode 100644
index 0000000..fe91ab5
--- /dev/null
+++ b/include/asm-generic/mutex.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_GENERIC_MUTEX_H
+#define __ASM_GENERIC_MUTEX_H
+/*
+ * Pull in the generic implementation for the mutex fastpath,
+ * which is a reasonable default on many architectures.
+ */
+
+#include <asm-generic/mutex-dec.h>
+#endif /* __ASM_GENERIC_MUTEX_H */
diff --git a/include/asm-generic/scatterlist.h b/include/asm-generic/scatterlist.h
new file mode 100644
index 0000000..8b94544
--- /dev/null
+++ b/include/asm-generic/scatterlist.h
@@ -0,0 +1,43 @@
+#ifndef __ASM_GENERIC_SCATTERLIST_H
+#define __ASM_GENERIC_SCATTERLIST_H
+
+#include <linux/types.h>
+
+struct scatterlist {
+#ifdef CONFIG_DEBUG_SG
+	unsigned long	sg_magic;
+#endif
+	unsigned long	page_link;
+	unsigned int	offset;
+	unsigned int	length;
+	dma_addr_t	dma_address;
+	unsigned int	dma_length;
+};
+
+/*
+ * These macros should be used after a dma_map_sg call has been done
+ * to get bus addresses of each of the SG entries and their lengths.
+ * You should only work with the number of sg entries pci_map_sg
+ * returns, or alternatively stop on the first sg_dma_len(sg) which
+ * is 0.
+ */
+#define sg_dma_address(sg)	((sg)->dma_address)
+#ifndef sg_dma_len
+/*
+ * Normally, you have an iommu on 64 bit machines, but not on 32 bit
+ * machines. Architectures that are differnt should override this.
+ */
+#if __BITS_PER_LONG == 64
+#define sg_dma_len(sg)		((sg)->dma_length)
+#else
+#define sg_dma_len(sg)		((sg)->length)
+#endif /* 64 bit */
+#endif /* sg_dma_len */
+
+#ifndef ISA_DMA_THRESHOLD
+#define ISA_DMA_THRESHOLD	(~0UL)
+#endif
+
+#define ARCH_HAS_SG_CHAIN
+
+#endif /* __ASM_GENERIC_SCATTERLIST_H */
diff --git a/include/asm-generic/spinlock.h b/include/asm-generic/spinlock.h
new file mode 100644
index 0000000..1547a03
--- /dev/null
+++ b/include/asm-generic/spinlock.h
@@ -0,0 +1,11 @@
+#ifndef __ASM_GENERIC_SPINLOCK_H
+#define __ASM_GENERIC_SPINLOCK_H
+/*
+ * You need to implement asm/spinlock.h for SMP support. The generic
+ * version does not handle SMP.
+ */
+#ifdef CONFIG_SMP
+#error need an architecture specific asm/spinlock.h
+#endif
+
+#endif /* __ASM_GENERIC_SPINLOCK_H */
diff --git a/include/asm-generic/string.h b/include/asm-generic/string.h
new file mode 100644
index 0000000..de5e020
--- /dev/null
+++ b/include/asm-generic/string.h
@@ -0,0 +1,10 @@
+#ifndef __ASM_GENERIC_STRING_H
+#define __ASM_GENERIC_STRING_H
+/*
+ * The kernel provides all required functions in lib/string.c
+ *
+ * Architectures probably want to provide at least their own optimized
+ * memcpy and memset functions though.
+ */
+
+#endif /* __ASM_GENERIC_STRING_H */
diff --git a/include/asm-generic/system.h b/include/asm-generic/system.h
new file mode 100644
index 0000000..efa403b
--- /dev/null
+++ b/include/asm-generic/system.h
@@ -0,0 +1,161 @@
+/* Generic system definitions, based on MN10300 definitions.
+ *
+ * It should be possible to use these on really simple architectures,
+ * but it serves more as a starting point for new ports.
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+#ifndef __ASM_GENERIC_SYSTEM_H
+#define __ASM_GENERIC_SYSTEM_H
+
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+
+#include <linux/types.h>
+#include <linux/irqflags.h>
+
+#include <asm/cmpxchg-local.h>
+
+struct task_struct;
+
+/* context switching is now performed out-of-line in switch_to.S */
+extern struct task_struct *__switch_to(struct task_struct *,
+		struct task_struct *);
+#define switch_to(prev, next, last)					\
+	do {								\
+		((last) = __switch_to((prev), (next)));			\
+	} while (0)
+
+#define arch_align_stack(x) (x)
+
+#define nop() asm volatile ("nop")
+
+#endif /* !__ASSEMBLY__ */
+
+/*
+ * Force strict CPU ordering.
+ * And yes, this is required on UP too when we're talking
+ * to devices.
+ *
+ * This implementation only contains a compiler barrier.
+ */
+
+#define mb()	asm volatile ("": : :"memory")
+#define rmb()	mb()
+#define wmb()	asm volatile ("": : :"memory")
+
+#ifdef CONFIG_SMP
+#define smp_mb()	mb()
+#define smp_rmb()	rmb()
+#define smp_wmb()	wmb()
+#else
+#define smp_mb()	barrier()
+#define smp_rmb()	barrier()
+#define smp_wmb()	barrier()
+#endif
+
+#define set_mb(var, value)  do { var = value;  mb(); } while (0)
+#define set_wmb(var, value) do { var = value; wmb(); } while (0)
+
+#define read_barrier_depends()		do {} while (0)
+#define smp_read_barrier_depends()	do {} while (0)
+
+/*
+ * we make sure local_irq_enable() doesn't cause priority inversion
+ */
+#ifndef __ASSEMBLY__
+
+/* This function doesn't exist, so you'll get a linker error
+ *    if something tries to do an invalid xchg().  */
+extern void __xchg_called_with_bad_pointer(void);
+
+static inline
+unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+{
+	unsigned long ret, flags;
+
+	switch (size) {
+	case 1:
+#ifdef __xchg_u8
+		return __xchg_u8(x, ptr);
+#else
+		local_irq_save(flags);
+		ret = *(volatile u8 *)ptr;
+		*(volatile u8 *)ptr = x;
+		local_irq_restore(flags);
+		return ret;
+#endif /* __xchg_u8 */
+
+	case 2:
+#ifdef __xchg_u16
+		return __xchg_u16(x, ptr);
+#else
+		local_irq_save(flags);
+		ret = *(volatile u16 *)ptr;
+		*(volatile u16 *)ptr = x;
+		local_irq_restore(flags);
+		return ret;
+#endif /* __xchg_u16 */
+
+	case 4:
+#ifdef __xchg_u32
+		return __xchg_u32(x, ptr);
+#else
+		local_irq_save(flags);
+		ret = *(volatile u32 *)ptr;
+		*(volatile u32 *)ptr = x;
+		local_irq_restore(flags);
+		return ret;
+#endif /* __xchg_u32 */
+
+#ifdef CONFIG_64BIT
+	case 8:
+#ifdef __xchg_u64
+		return __xchg_u64(x, ptr);
+#else
+		local_irq_save(flags);
+		ret = *(volatile u64 *)ptr;
+		*(volatile u64 *)ptr = x;
+		local_irq_restore(flags);
+		return ret;
+#endif /* __xchg_u64 */
+#endif /* CONFIG_64BIT */
+
+	default:
+		__xchg_called_with_bad_pointer();
+		return x;
+	}
+}
+
+#define xchg(ptr, x) \
+	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
+
+static inline unsigned long __cmpxchg(volatile unsigned long *m,
+				      unsigned long old, unsigned long new)
+{
+	unsigned long retval;
+	unsigned long flags;
+
+	local_irq_save(flags);
+	retval = *m;
+	if (retval == old)
+		*m = new;
+	local_irq_restore(flags);
+	return retval;
+}
+
+#define cmpxchg(ptr, o, n)					\
+	((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \
+					(unsigned long)(o),	\
+					(unsigned long)(n)))
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_GENERIC_SYSTEM_H */
diff --git a/include/asm-generic/user.h b/include/asm-generic/user.h
new file mode 100644
index 0000000..8b9c3c9
--- /dev/null
+++ b/include/asm-generic/user.h
@@ -0,0 +1,8 @@
+#ifndef __ASM_GENERIC_USER_H
+#define __ASM_GENERIC_USER_H
+/*
+ * This file may define a 'struct user' structure. However, it it only
+ * used for a.out file, which are not supported on new architectures.
+ */
+
+#endif	/* __ASM_GENERIC_USER_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 13/27] asm-generic: make uaccess.h usable by mmu archs
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (22 preceding siblings ...)
  2009-04-28 14:15 ` [PATCH 08/27] asm-generic: add generic versions of common headers Arnd Bergmann
@ 2009-04-29 13:33 ` Arnd Bergmann
  2009-04-29 14:25 ` [PATCH 18/27] microblaze: use generic syscalls.h Arnd Bergmann
                   ` (4 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-29 13:33 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Make it possible to override some functions from uaccess.h
so that architectures with an mmu can provide assembly
versions of the functions with their own fixup logic.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/asm-generic/uaccess.h |  102 +++++++++++++++++++++++++---------------
 1 files changed, 64 insertions(+), 38 deletions(-)

diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
index ebeacd9..e05f6a9 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -31,14 +31,14 @@ static inline void set_fs(mm_segment_t fs)
 #define VERIFY_READ	0
 #define VERIFY_WRITE	1
 
-#define access_ok(type, addr, size) _access_ok((unsigned long)(addr),(size))
+#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
 
 /*
  * The architecture should really override this if possible, at least
  * doing a check on the get_fs()
  */
-#ifndef _access_ok
-static inline int _access_ok(unsigned long addr, unsigned long size)
+#ifndef __access_ok
+static inline int __access_ok(unsigned long addr, unsigned long size)
 {
 	return 1;
 }
@@ -93,7 +93,7 @@ extern int __put_user_bad(void);
 #endif
 
 #define put_user(x, ptr) (				\
-	access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?	\
+	__access_ok(ptr, sizeof (*ptr)) ?		\
 		__put_user(x, ptr) :			\
 		-EFAULT)
 
@@ -120,45 +120,62 @@ extern int __get_user_bad(void);
 #endif
 
 #define get_user(x, ptr) (				\
-	access_ok(VERIFY_READ, ptr, sizeof (*ptr)) ?	\
+	__access_ok(ptr, sizeof (*ptr)) ?		\
 		__get_user(x, ptr) :			\
 		-EFAULT)
 
-#define __copy_from_user(to, from, n) (memcpy(to, from, n), 0)
-#define __copy_to_user(to, from, n) (memcpy(to, from, n), 0)
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
+#ifndef __copy_from_user
+static inline __must_check long __copy_from_user(void *to,
+		const void __user *from, unsigned long n)
+{
+	memcpy(to, (const void __force *)from, n);
+	return 0;
+}
+#endif
 
-#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
+#ifndef __copy_to_user
+static inline __must_check long __copy_to_user(void __user *to,
+		const void *from, unsigned long n)
+{
+	memcpy((void __force *)to, from, n);
+	return 0;
+}
+#endif
+
+#ifndef __copy_from_user_inatomic
+#define __copy_from_user_inatomic __copy_from_user
+#endif
 
-#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
+#ifndef __copy_to_user_inatomic
+#define __copy_to_user_inatomic __copy_to_user
+#endif
 
 static inline long copy_from_user(void *to,
-				  const void __user * from, unsigned long n)
+		const void __user * from, unsigned long n)
 {
-	if (access_ok(VERIFY_READ, from, n))
-		__copy_from_user(to, from, n);
+	might_sleep();
+	if (__access_ok(from, n))
+		return __copy_from_user(to, from, n);
 	else
 		return n;
-	return 0;
 }
 
-static inline long copy_to_user(void *to,
-				const void __user * from, unsigned long n)
+static inline long copy_to_user(void __user *to,
+		const void *from, unsigned long n)
 {
-	if (access_ok(VERIFY_WRITE, to, n))
-		__copy_to_user(to, from, n);
+	might_sleep();
+	if (__access_ok(to, n))
+		return __copy_to_user(to, from, n);
 	else
 		return n;
-	return 0;
 }
 
 /*
  * Copy a null terminated string from userspace.
  */
-
+#ifndef __strncpy_from_user
 static inline long
-__do_strncpy_from_user(char *dst, const char __user *src, long count)
+__strncpy_from_user(char *dst, const char __user *src, long count)
 {
 	char *tmp;
 	strncpy(dst, src, count);
@@ -166,19 +183,14 @@ __do_strncpy_from_user(char *dst, const char __user *src, long count)
 		;
 	return (tmp - dst);
 }
+#endif
 
 static inline long
 strncpy_from_user(char *dst, const char __user *src, long count)
 {
-	if (!access_ok(VERIFY_READ, src, 1))
+	if (!__access_ok(src, 1))
 		return -EFAULT;
-	return __do_strncpy_from_user(dst, src, count);
-}
-
-static inline long
-__strncpy_from_user(char *dst, const char __user *src, long count)
-{
-	return __do_strncpy_from_user(dst, src, count);
+	return __strncpy_from_user(dst, src, count);
 }
 
 /*
@@ -186,24 +198,38 @@ __strncpy_from_user(char *dst, const char __user *src, long count)
  *
  * Return 0 on exception, a value greater than N if too long
  */
-static inline long strnlen_user(const char *src, long n)
+#ifndef strnlen_user
+static inline long strnlen_user(const char __user *src, long n)
 {
-	return strlen(src) + 1;
+	return strlen((void * __force)src) + 1;
 }
+#endif
 
-#define strlen_user(str) strnlen_user(str, 32767)
+static inline long strlen_user(const char __user *src)
+{
+	return strnlen_user(src, 32767);
+}
 
 /*
  * Zero Userspace
  */
-
-static inline unsigned long
-__clear_user(void *to, unsigned long n)
+#ifndef __clear_user
+static inline __must_check unsigned long
+__clear_user(void __user *to, unsigned long n)
 {
-	memset(to, 0, n);
+	memset((void __force *)to, 0, n);
 	return 0;
 }
+#endif
 
-#define clear_user(to, n) __clear_user(to, n)
+static inline __must_check unsigned long
+clear_user(void __user *to, unsigned long n)
+{
+	might_sleep();
+	if (!__access_ok(to, n))
+		return n;
+
+	return __clear_user(to, n);
+}
 
 #endif /* __ASM_GENERIC_UACCESS_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 18/27] microblaze: use generic syscalls.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (23 preceding siblings ...)
  2009-04-29 13:33 ` [PATCH 13/27] asm-generic: make uaccess.h usable by mmu archs Arnd Bergmann
@ 2009-04-29 14:25 ` Arnd Bergmann
  2009-04-29 14:51 ` [PATCH 02/27] asm-generic: add generic atomic.h Arnd Bergmann
                   ` (3 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-29 14:25 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The prototypes in syscalls.h all make sense for
microblaze, but for some of them, the actual implementation
in sys_microblaze.c needs to be adapted.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/microblaze/include/asm/syscalls.h  |   48 +++++-------------------------
 arch/microblaze/kernel/sys_microblaze.c |   12 ++++----
 2 files changed, 14 insertions(+), 46 deletions(-)
 rewrite arch/microblaze/include/asm/syscalls.h (94%)

diff --git a/arch/microblaze/include/asm/syscalls.h b/arch/microblaze/include/asm/syscalls.h
dissimilarity index 94%
index fc5a412..720761c 100644
--- a/arch/microblaze/include/asm/syscalls.h
+++ b/arch/microblaze/include/asm/syscalls.h
@@ -1,40 +1,8 @@
-#ifndef __ASM_MICROBLAZE_SYSCALLS_H
-#define __ASM_MICROBLAZE_SYSCALLS_H
-#ifdef __KERNEL__
-
-#include <linux/compiler.h>
-#include <linux/linkage.h>
-#include <linux/types.h>
-#include <linux/signal.h>
-
-/* FIXME will be removed */
-asmlinkage int sys_ipc(uint call, int first, int second,
-				int third, void *ptr, long fifth);
-
-struct pt_regs;
-asmlinkage int sys_vfork(struct pt_regs *regs);
-asmlinkage int sys_clone(int flags, unsigned long stack, struct pt_regs *regs);
-asmlinkage int sys_execve(char __user *filenamei, char __user *__user *argv,
-			char __user *__user *envp, struct pt_regs *regs);
-
-asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,
-			unsigned long prot, unsigned long flags,
-			unsigned long fd, unsigned long pgoff);
-
-asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
-			unsigned long prot, unsigned long flags,
-			unsigned long fd, off_t offset);
-
-/* from signal.c */
-asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize,
-		struct pt_regs *regs);
-
-asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-		struct pt_regs *regs);
-
-asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user * act, struct sigaction __user * oact, size_t sigsetsize);
-
-asmlinkage long sys_rt_sigreturn(struct pt_regs *regs);
-
-#endif /* __KERNEL__ */
-#endif /* __ASM_MICROBLAZE_SYSCALLS_H */
+#ifndef __ASM_MICROBLAZE_SYSCALLS_H
+
+asmlinkage long sys_clone(int flags, unsigned long stack, struct pt_regs *regs);
+#define sys_clone sys_clone
+
+#include <asm-generic/syscalls.h>
+
+#endif /* __ASM_MICROBLAZE_SYSCALLS_H */
diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c
index ba0568c..57ce1b2 100644
--- a/arch/microblaze/kernel/sys_microblaze.c
+++ b/arch/microblaze/kernel/sys_microblaze.c
@@ -39,7 +39,7 @@
  *
  * This is really horribly ugly. This will be remove with new toolchain.
  */
-asmlinkage int
+asmlinkage long
 sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
 {
 	int version, ret;
@@ -134,20 +134,20 @@ sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
 	return -EINVAL;
 }
 
-asmlinkage int sys_vfork(struct pt_regs *regs)
+asmlinkage long sys_vfork(struct pt_regs *regs)
 {
 	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->r1,
 						regs, 0, NULL, NULL);
 }
 
-asmlinkage int sys_clone(int flags, unsigned long stack, struct pt_regs *regs)
+asmlinkage long sys_clone(int flags, unsigned long stack, struct pt_regs *regs)
 {
 	if (!stack)
 		stack = regs->r1;
 	return do_fork(flags, stack, regs, 0, NULL, NULL);
 }
 
-asmlinkage int sys_execve(char __user *filenamei, char __user *__user *argv,
+asmlinkage long sys_execve(char __user *filenamei, char __user *__user *argv,
 			char __user *__user *envp, struct pt_regs *regs)
 {
 	int error;
@@ -163,7 +163,7 @@ out:
 	return error;
 }
 
-asmlinkage unsigned long
+asmlinkage long
 sys_mmap2(unsigned long addr, size_t len,
 	unsigned long prot, unsigned long flags,
 	unsigned long fd, unsigned long pgoff)
@@ -189,7 +189,7 @@ out:
 	return ret;
 }
 
-asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
+asmlinkage long sys_mmap(unsigned long addr, size_t len,
 			unsigned long prot, unsigned long flags,
 			unsigned long fd, off_t offset)
 {
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 02/27] asm-generic: add generic atomic.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (24 preceding siblings ...)
  2009-04-29 14:25 ` [PATCH 18/27] microblaze: use generic syscalls.h Arnd Bergmann
@ 2009-04-29 14:51 ` Arnd Bergmann
  2009-04-29 14:55 ` [PATCH 11/27] asm-generic: add generic page.h Arnd Bergmann
                   ` (2 subsequent siblings)
  28 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-29 14:51 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

The atomic.h implementation from mn10300 is generic enough
that we can use it as a template for all future architectures.
Those architectures that do not have native atomic operations
or SMP can use this file directly.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/asm-generic/atomic.h |  165 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/atomic.h

diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h
new file mode 100644
index 0000000..f4bc212
--- /dev/null
+++ b/include/asm-generic/atomic.h
@@ -0,0 +1,165 @@
+/*
+ * Generic C implementation of atomic counter operations
+ * Originally implemented for MN10300.
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+#ifndef __ASM_GENERIC_ATOMIC_H
+#define __ASM_GENERIC_ATOMIC_H
+
+#ifdef CONFIG_SMP
+#error not SMP safe
+#endif
+
+/*
+ * Atomic operations that C can't guarantee us.  Useful for
+ * resource counting etc..
+ */
+
+#define ATOMIC_INIT(i)	{ (i) }
+
+#ifdef __KERNEL__
+
+/**
+ * atomic_read - read atomic variable
+ * @v: pointer of type atomic_t
+ *
+ * Atomically reads the value of @v.  Note that the guaranteed
+ * useful range of an atomic_t is only 24 bits.
+ */
+#define atomic_read(v)	((v)->counter)
+
+/**
+ * atomic_set - set atomic variable
+ * @v: pointer of type atomic_t
+ * @i: required value
+ *
+ * Atomically sets the value of @v to @i.  Note that the guaranteed
+ * useful range of an atomic_t is only 24 bits.
+ */
+#define atomic_set(v, i) (((v)->counter) = (i))
+
+#include <asm/system.h>
+
+/**
+ * atomic_add_return - add integer to atomic variable
+ * @i: integer value to add
+ * @v: pointer of type atomic_t
+ *
+ * Atomically adds @i to @v and returns the result
+ * Note that the guaranteed useful range of an atomic_t is only 24 bits.
+ */
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+	unsigned long flags;
+	int temp;
+
+	local_irq_save(flags);
+	temp = v->counter;
+	temp += i;
+	v->counter = temp;
+	local_irq_restore(flags);
+
+	return temp;
+}
+
+/**
+ * atomic_sub_return - subtract integer from atomic variable
+ * @i: integer value to subtract
+ * @v: pointer of type atomic_t
+ *
+ * Atomically subtracts @i from @v and returns the result
+ * Note that the guaranteed useful range of an atomic_t is only 24 bits.
+ */
+static inline int atomic_sub_return(int i, atomic_t *v)
+{
+	unsigned long flags;
+	int temp;
+
+	local_irq_save(flags);
+	temp = v->counter;
+	temp -= i;
+	v->counter = temp;
+	local_irq_restore(flags);
+
+	return temp;
+}
+
+static inline int atomic_add_negative(int i, atomic_t *v)
+{
+	return atomic_add_return(i, v) < 0;
+}
+
+static inline void atomic_add(int i, atomic_t *v)
+{
+	atomic_add_return(i, v);
+}
+
+static inline void atomic_sub(int i, atomic_t *v)
+{
+	atomic_sub_return(i, v);
+}
+
+static inline void atomic_inc(atomic_t *v)
+{
+	atomic_add_return(1, v);
+}
+
+static inline void atomic_dec(atomic_t *v)
+{
+	atomic_sub_return(1, v);
+}
+
+#define atomic_dec_return(v)		atomic_sub_return(1, (v))
+#define atomic_inc_return(v)		atomic_add_return(1, (v))
+
+#define atomic_sub_and_test(i, v)	(atomic_sub_return((i), (v)) == 0)
+#define atomic_dec_and_test(v)		(atomic_sub_return(1, (v)) == 0)
+#define atomic_inc_and_test(v)		(atomic_add_return(1, (v)) == 0)
+
+#define atomic_add_unless(v, a, u)				\
+({								\
+	int c, old;						\
+	c = atomic_read(v);					\
+	while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+		c = old;					\
+	c != (u);						\
+})
+
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+{
+	unsigned long flags;
+
+	mask = ~mask;
+	local_irq_save(flags);
+	*addr &= mask;
+	local_irq_restore(flags);
+}
+
+#define atomic_xchg(ptr, v)		(xchg(&(ptr)->counter, (v)))
+#define atomic_cmpxchg(v, old, new)	(cmpxchg(&((v)->counter), (old), (new)))
+
+#define cmpxchg_local(ptr, o, n)				  	       \
+	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\
+			(unsigned long)(n), sizeof(*(ptr))))
+
+#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
+
+/* Atomic operations are already serializing on MN10300??? */
+#define smp_mb__before_atomic_dec()	barrier()
+#define smp_mb__after_atomic_dec()	barrier()
+#define smp_mb__before_atomic_inc()	barrier()
+#define smp_mb__after_atomic_inc()	barrier()
+
+#include <asm-generic/atomic-long.h>
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_GENERIC_ATOMIC_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 11/27] asm-generic: add generic page.h
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (25 preceding siblings ...)
  2009-04-29 14:51 ` [PATCH 02/27] asm-generic: add generic atomic.h Arnd Bergmann
@ 2009-04-29 14:55 ` Arnd Bergmann
  2009-05-04  7:11   ` Geert Uytterhoeven
  2009-04-30 16:39 ` [PATCH 0/2] use generic headers in x86 Arnd Bergmann
  2009-05-03 11:17 ` [PATCH 00/27] more non-ABI asm-generic headers Geert Uytterhoeven
  28 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-29 14:55 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Architectures that have no mmu should not have to
describe their page tables. This adds a new page.h
file based on the existing nommu architectures
that adds a lot of dummy definitions to let you
correctly compile a nommu kernel.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/asm-generic/page.h |   99 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/page.h

diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
new file mode 100644
index 0000000..75fec18
--- /dev/null
+++ b/include/asm-generic/page.h
@@ -0,0 +1,99 @@
+#ifndef __ASM_GENERIC_PAGE_H
+#define __ASM_GENERIC_PAGE_H
+/*
+ * Generic page.h implementation, for NOMMU architectures.
+ * This provides the dummy definitions for the memory management.
+ */
+
+#ifdef CONFIG_MMU
+#error need to prove a real asm/page.h
+#endif
+
+
+/* PAGE_SHIFT determines the page size */
+
+#define PAGE_SHIFT	12
+#ifdef __ASSEMBLY__
+#define PAGE_SIZE	(1 << PAGE_SHIFT)
+#else
+#define PAGE_SIZE	(1UL << PAGE_SHIFT)
+#endif
+#define PAGE_MASK	(~(PAGE_SIZE-1))
+
+#include <asm/setup.h>
+
+#ifndef __ASSEMBLY__
+
+#define get_user_page(vaddr)		__get_free_page(GFP_KERNEL)
+#define free_user_page(page, addr)	free_page(addr)
+
+#define clear_page(page)	memset((page), 0, PAGE_SIZE)
+#define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE)
+
+#define clear_user_page(page, vaddr, pg)	clear_page(page)
+#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
+
+/*
+ * These are used to make use of C type-checking..
+ */
+typedef struct {
+	unsigned long pte;
+} pte_t;
+typedef struct {
+	unsigned long pmd[16];
+} pmd_t;
+typedef struct {
+	unsigned long pgd;
+} pgd_t;
+typedef struct {
+	unsigned long pgprot;
+} pgprot_t;
+typedef struct page *pgtable_t;
+
+#define pte_val(x)	((x).pte)
+#define pmd_val(x)	((&x)->pmd[0])
+#define pgd_val(x)	((x).pgd)
+#define pgprot_val(x)	((x).pgprot)
+
+#define __pte(x)	((pte_t) { (x) } )
+#define __pmd(x)	((pmd_t) { (x) } )
+#define __pgd(x)	((pgd_t) { (x) } )
+#define __pgprot(x)	((pgprot_t) { (x) } )
+
+extern unsigned long memory_start;
+extern unsigned long memory_end;
+
+#endif /* !__ASSEMBLY__ */
+
+#ifdef CONFIG_KERNEL_RAM_BASE_ADDRESS
+#define PAGE_OFFSET		(CONFIG_KERNEL_RAM_BASE_ADDRESS)
+#else
+#define PAGE_OFFSET		(0)
+#endif
+
+#ifndef __ASSEMBLY__
+
+#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
+#define __pa(x) ((unsigned long) (x) - PAGE_OFFSET)
+
+#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
+#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)
+
+#define virt_to_page(addr)	(mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
+#define page_to_virt(page)	((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
+
+#ifndef page_to_phys
+#define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
+#endif
+
+#define pfn_valid(pfn)		((pfn) < max_mapnr)
+
+#define	virt_addr_valid(kaddr)	(((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
+				((void *)(kaddr) < (void *)memory_end))
+
+#endif /* __ASSEMBLY__ */
+
+#include <asm-generic/memory_model.h>
+#include <asm-generic/getorder.h>
+
+#endif /* __ASM_GENERIC_PAGE_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH 00/27] more non-ABI asm-generic headers
@ 2009-04-30 15:34 Arnd Bergmann
  2008-11-06 12:08 ` [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h Arnd Bergmann
                   ` (28 more replies)
  0 siblings, 29 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 15:34 UTC (permalink / raw)
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Here are the remaining asm-generic headers I prepared, along
with patches converting microblaze to use them, as an example.

The patches apply on top of my ABI related patches I posted
earlier this week. If people agree with the concept and I
have addressed all major concerns, I would like to get them
into linux-next and hopefully merged in 2.6.31.

To avoid trouble with quilt mail, I'm now trying
git-format-patch to generate them, hopefully this
works a little better. Can anyone tell me why I can't
add a 'To' header rather than just 'Cc' in
git-format-patch?

	Arnd <><

---

Arnd Bergmann (21):
  asm-generic: rename atomic.h to atomic-long.h
  asm-generic: add generic atomic.h
  asm-generic: make pci.h usable directly
  asm-generic: add legacy I/O header files
  asm-generic: add generic io.h
  asm-generic: add minimal cache description
  asm-generic: add generic versions of common headers
  asm-generic: add generic NOMMU versions of some headers
  asm-generic: rename page.h to getorder.h
  asm-generic: add generic page.h
  asm-generic: add a NOMMU uaccess.h
  asm-generic: make uaccess.h usable by mmu archs
  asm-generic: make bitops.h usable
  asm-generic: Add missing generic tlb_flush definition
  asm-generic: introduce generic syscalls.h
  add generic lib/checksum.c
  microblaze: use generic syscalls.h
  microblaze: make syscall_table implementation generic
  microblaze: use generic swab.h
  microblaze: don't include asm/mmu.h in hw_exception_handler
  microblaze: use generic dma-mapping.h

Remis Lima Baima (6):
  asm-generic: clean up asm-generic/io.h
  microblaze: use the generic lib/checksum.c
  microblaze: convert all simple headers to use asm-generic
  microblaze: use generic uaccess.h
  microblaze: make io.h use asm-generic/io.h
  microblaze: use generic system.h

 arch/alpha/include/asm/atomic.h                    |    2 +-
 arch/alpha/include/asm/page.h                      |    2 +-
 arch/arm/include/asm/atomic.h                      |    2 +-
 arch/arm/include/asm/page.h                        |    2 +-
 arch/avr32/include/asm/atomic.h                    |    2 +-
 arch/blackfin/include/asm/atomic.h                 |    2 +-
 arch/blackfin/include/asm/page.h                   |    2 +-
 arch/cris/include/asm/atomic.h                     |    2 +-
 arch/cris/include/asm/page.h                       |    2 +-
 arch/frv/include/asm/atomic.h                      |    2 +-
 arch/frv/include/asm/page.h                        |    2 +-
 arch/frv/include/asm/pci.h                         |   13 +-
 arch/h8300/include/asm/atomic.h                    |    2 +-
 arch/h8300/include/asm/page.h                      |    2 +-
 arch/ia64/include/asm/atomic.h                     |    2 +-
 arch/m32r/include/asm/atomic.h                     |    2 +-
 arch/m32r/include/asm/page.h                       |    2 +-
 arch/m32r/include/asm/pci.h                        |    2 -
 arch/m68k/include/asm/atomic_mm.h                  |    2 +-
 arch/m68k/include/asm/atomic_no.h                  |    2 +-
 arch/m68k/include/asm/page_mm.h                    |    2 +-
 arch/m68k/include/asm/page_no.h                    |    2 +-
 arch/microblaze/Kconfig                            |    8 +-
 arch/microblaze/include/asm/atomic.h               |  124 +------
 arch/microblaze/include/asm/bitops.h               |   28 +--
 arch/microblaze/include/asm/bug.h                  |   14 -
 arch/microblaze/include/asm/bugs.h                 |   18 +-
 arch/microblaze/include/asm/checksum.h             |  132 ++-----
 arch/microblaze/include/asm/cmpxchg-local.h        |    1 +
 arch/microblaze/include/asm/dma-mapping.h          |  130 +------
 arch/microblaze/include/asm/hardirq.h              |   14 +-
 arch/microblaze/include/asm/io.h                   |  240 ++----------
 arch/microblaze/include/asm/irq.h                  |    6 +-
 arch/microblaze/include/asm/irqflags.h             |    2 +-
 arch/microblaze/include/asm/kmap_types.h           |   30 +--
 arch/microblaze/include/asm/mmu.h                  |   20 +-
 arch/microblaze/include/asm/mmu_context.h          |   22 +-
 arch/microblaze/include/asm/module.h               |   10 +-
 arch/microblaze/include/asm/page.h                 |    2 +-
 arch/microblaze/include/asm/pgalloc.h              |   15 +-
 arch/microblaze/include/asm/scatterlist.h          |   29 +--
 arch/microblaze/include/asm/serial.h               |   15 +-
 arch/microblaze/include/asm/shmparam.h             |    7 +-
 arch/microblaze/include/asm/swab.h                 |    9 +-
 arch/microblaze/include/asm/syscalls.h             |   48 +--
 arch/microblaze/include/asm/system.h               |  121 ++-----
 arch/microblaze/include/asm/timex.h                |   19 +-
 arch/microblaze/include/asm/uaccess.h              |  164 ++------
 arch/microblaze/kernel/Makefile                    |    2 +-
 arch/microblaze/kernel/hw_exception_handler.S      |    1 -
 arch/microblaze/kernel/sys_microblaze.c            |   12 +-
 arch/microblaze/lib/Makefile                       |    2 +-
 arch/microblaze/lib/uaccess.c                      |   42 +--
 arch/mips/include/asm/atomic.h                     |    2 +-
 arch/mips/include/asm/page.h                       |    2 +-
 arch/mn10300/include/asm/atomic.h                  |    2 +-
 arch/parisc/include/asm/atomic.h                   |    2 +-
 arch/parisc/include/asm/page.h                     |    2 +-
 arch/parisc/include/asm/uaccess.h                  |    2 +-
 arch/powerpc/include/asm/atomic.h                  |    2 +-
 arch/powerpc/include/asm/page_32.h                 |    2 +-
 arch/powerpc/include/asm/page_64.h                 |    2 +-
 arch/s390/include/asm/atomic.h                     |    2 +-
 arch/s390/include/asm/page.h                       |    2 +-
 arch/sh/include/asm/atomic.h                       |    2 +-
 arch/sh/include/asm/page.h                         |    2 +-
 arch/sparc/include/asm/atomic_32.h                 |    2 +-
 arch/sparc/include/asm/atomic_64.h                 |    2 +-
 arch/sparc/include/asm/page_32.h                   |    2 +-
 arch/sparc/include/asm/page_64.h                   |    2 +-
 arch/sparc/include/asm/uaccess_64.h                |    2 +-
 arch/um/include/asm/page.h                         |    2 +-
 arch/x86/include/asm/atomic_32.h                   |    2 +-
 arch/x86/include/asm/atomic_64.h                   |    2 +-
 arch/x86/include/asm/page.h                        |    2 +-
 arch/xtensa/include/asm/atomic.h                   |    2 +-
 arch/xtensa/include/asm/page.h                     |    2 +-
 include/asm-generic/{atomic.h => atomic-long.h}    |    6 +-
 include/asm-generic/atomic.h                       |  423 ++++++++------------
 include/asm-generic/bitops.h                       |   24 +-
 include/asm-generic/bitops/atomic.h                |    1 +
 include/asm-generic/bugs.h                         |   10 +
 include/asm-generic/cache.h                        |   12 +
 include/asm-generic/cacheflush.h                   |   30 ++
 .../include/asm => include/asm-generic}/checksum.h |   65 +--
 include/asm-generic/current.h                      |    9 +
 include/asm-generic/delay.h                        |    9 +
 include/asm-generic/dma.h                          |   15 +
 include/asm-generic/fb.h                           |   12 +
 include/asm-generic/{page.h => getorder.h}         |    8 +-
 include/asm-generic/hardirq.h                      |   34 ++
 include/asm-generic/hw_irq.h                       |    9 +
 include/asm-generic/io.h                           |  300 ++++++++++++++
 include/asm-generic/irq.h                          |   18 +
 include/asm-generic/irqflags.h                     |   72 ++++
 include/asm-generic/kmap_types.h                   |   29 ++
 include/asm-generic/linkage.h                      |    8 +
 include/asm-generic/mmu.h                          |   14 +
 include/asm-generic/mmu_context.h                  |   45 ++
 include/asm-generic/module.h                       |   22 +
 include/asm-generic/mutex.h                        |    9 +
 include/asm-generic/page.h                         |  123 +++++--
 include/asm-generic/pci.h                          |    8 +
 include/asm-generic/pgalloc.h                      |   12 +
 include/asm-generic/scatterlist.h                  |   43 ++
 include/asm-generic/segment.h                      |    9 +
 include/asm-generic/serial.h                       |   13 +
 include/asm-generic/spinlock.h                     |   11 +
 include/asm-generic/string.h                       |   10 +
 include/asm-generic/syscalls.h                     |   60 +++
 include/asm-generic/system.h                       |  161 ++++++++
 include/asm-generic/timex.h                        |   29 ++
 include/asm-generic/tlb.h                          |    4 +
 include/asm-generic/tlbflush.h                     |   18 +
 .../asm-generic/{uaccess.h => uaccess-unaligned.h} |    6 +-
 include/asm-generic/uaccess.h                      |  261 +++++++++++--
 include/asm-generic/user.h                         |    8 +
 kernel/Makefile                                    |    1 +
 {arch/microblaze/kernel => kernel}/syscall_table.c |    2 +-
 lib/Makefile                                       |    2 +
 {arch/microblaze/lib => lib}/checksum.c            |   43 ++-
 121 files changed, 1850 insertions(+), 1548 deletions(-)
 rewrite arch/microblaze/include/asm/atomic.h (98%)
 rewrite arch/microblaze/include/asm/bitops.h (95%)
 rewrite arch/microblaze/include/asm/checksum.h (68%)
 create mode 100644 arch/microblaze/include/asm/cmpxchg-local.h
 rewrite arch/microblaze/include/asm/dma-mapping.h (100%)
 rewrite arch/microblaze/include/asm/io.h (94%)
 rewrite arch/microblaze/include/asm/kmap_types.h (100%)
 rewrite arch/microblaze/include/asm/mmu.h (100%)
 rewrite arch/microblaze/include/asm/mmu_context.h (100%)
 rewrite arch/microblaze/include/asm/scatterlist.h (100%)
 rewrite arch/microblaze/include/asm/syscalls.h (94%)
 rewrite arch/microblaze/include/asm/system.h (66%)
 rewrite arch/microblaze/include/asm/timex.h (100%)
 rewrite arch/microblaze/include/asm/uaccess.h (86%)
 rewrite arch/microblaze/lib/uaccess.c (97%)
 rename include/asm-generic/{atomic.h => atomic-long.h} (97%)
 rewrite include/asm-generic/atomic.h (98%)
 create mode 100644 include/asm-generic/bugs.h
 create mode 100644 include/asm-generic/cache.h
 create mode 100644 include/asm-generic/cacheflush.h
 rename {arch/microblaze/include/asm => include/asm-generic}/checksum.h (57%)
 create mode 100644 include/asm-generic/current.h
 create mode 100644 include/asm-generic/delay.h
 create mode 100644 include/asm-generic/dma.h
 create mode 100644 include/asm-generic/fb.h
 rename include/asm-generic/{page.h => getorder.h} (59%)
 create mode 100644 include/asm-generic/hardirq.h
 create mode 100644 include/asm-generic/hw_irq.h
 create mode 100644 include/asm-generic/io.h
 create mode 100644 include/asm-generic/irq.h
 create mode 100644 include/asm-generic/irqflags.h
 create mode 100644 include/asm-generic/kmap_types.h
 create mode 100644 include/asm-generic/linkage.h
 create mode 100644 include/asm-generic/mmu.h
 create mode 100644 include/asm-generic/mmu_context.h
 create mode 100644 include/asm-generic/module.h
 create mode 100644 include/asm-generic/mutex.h
 rewrite include/asm-generic/page.h (93%)
 create mode 100644 include/asm-generic/pgalloc.h
 create mode 100644 include/asm-generic/scatterlist.h
 create mode 100644 include/asm-generic/segment.h
 create mode 100644 include/asm-generic/serial.h
 create mode 100644 include/asm-generic/spinlock.h
 create mode 100644 include/asm-generic/string.h
 create mode 100644 include/asm-generic/syscalls.h
 create mode 100644 include/asm-generic/system.h
 create mode 100644 include/asm-generic/timex.h
 create mode 100644 include/asm-generic/tlbflush.h
 rename include/asm-generic/{uaccess.h => uaccess-unaligned.h} (82%)
 rewrite include/asm-generic/uaccess.h (96%)
 create mode 100644 include/asm-generic/user.h
 rename {arch/microblaze/kernel => kernel}/syscall_table.c (82%)
 rename {arch/microblaze/lib => lib}/checksum.c (79%)

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h
  2008-11-06 12:08 ` [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h Arnd Bergmann
@ 2009-04-30 16:06   ` Ingo Molnar
  0 siblings, 0 replies; 83+ messages in thread
From: Ingo Molnar @ 2009-04-30 16:06 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: no, To-header, on, "input <", linux-arch, Michal Simek,
	Remis Lima Baima, linux-kernel


* Arnd Bergmann <arnd@arndb.de> wrote:

> The existing asm-generic/atomic.h only defines the
> atomic_long type. This renames it to atomic-long.h
> so we have a place to add a truly generic atomic.h
> that can be used on all non-SMP systems.
> 
> Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/alpha/include/asm/atomic.h                 |    2 +-
>  arch/arm/include/asm/atomic.h                   |    2 +-
>  arch/avr32/include/asm/atomic.h                 |    2 +-
>  arch/blackfin/include/asm/atomic.h              |    2 +-
>  arch/cris/include/asm/atomic.h                  |    2 +-
>  arch/frv/include/asm/atomic.h                   |    2 +-
>  arch/h8300/include/asm/atomic.h                 |    2 +-
>  arch/ia64/include/asm/atomic.h                  |    2 +-
>  arch/m32r/include/asm/atomic.h                  |    2 +-
>  arch/m68k/include/asm/atomic_mm.h               |    2 +-
>  arch/m68k/include/asm/atomic_no.h               |    2 +-
>  arch/microblaze/include/asm/atomic.h            |    2 +-
>  arch/mips/include/asm/atomic.h                  |    2 +-
>  arch/mn10300/include/asm/atomic.h               |    2 +-
>  arch/parisc/include/asm/atomic.h                |    2 +-
>  arch/powerpc/include/asm/atomic.h               |    2 +-
>  arch/s390/include/asm/atomic.h                  |    2 +-
>  arch/sh/include/asm/atomic.h                    |    2 +-
>  arch/sparc/include/asm/atomic_32.h              |    2 +-
>  arch/sparc/include/asm/atomic_64.h              |    2 +-
>  arch/x86/include/asm/atomic_32.h                |    2 +-
>  arch/x86/include/asm/atomic_64.h                |    2 +-

Acked-by: Ingo Molnar <mingo@elte.hu>

	Ingo

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [PATCH 0/2] use generic headers in x86
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (26 preceding siblings ...)
  2009-04-29 14:55 ` [PATCH 11/27] asm-generic: add generic page.h Arnd Bergmann
@ 2009-04-30 16:39 ` Arnd Bergmann
  2009-04-30 16:40   ` [PATCH 1/2] x86: two small fixes in termios.h Arnd Bergmann
  2009-04-30 16:42   ` [PATCH 2/2] x86: adapt simple headers to use generic headers Arnd Bergmann
  2009-05-03 11:17 ` [PATCH 00/27] more non-ABI asm-generic headers Geert Uytterhoeven
  28 siblings, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 16:39 UTC (permalink / raw)
  To: x86; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

Once the generic headers are merged, we can apply these
other patches from Remis to use them in x86.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [PATCH 1/2] x86: two small fixes in termios.h
  2009-04-30 16:39 ` [PATCH 0/2] use generic headers in x86 Arnd Bergmann
@ 2009-04-30 16:40   ` Arnd Bergmann
  2009-04-30 16:42   ` [PATCH 2/2] x86: adapt simple headers to use generic headers Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 16:40 UTC (permalink / raw)
  To: x86; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

From: Remis Lima Baima <remis.developer@googlemail.com>

The operation with the variable 'c_line' was missing in the function
'user_termio_to_kernel_termios'. Also the casting '*(unsigned short *)'
in the macro 'SET_LOW_TERMIOS_BITS' was a bit 'unhealthy'. So the macro
was removed and the function was changed to be like in other archs
(e.g. h8300, m68k, sparc) that have a more elegant solution.

In the function 'kernel_termios_to_user_termio' the return values of
the functions calls 'put_user' and 'copy_to_user' were not being
checked.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/x86/include/asm/termios.h |   56 +++++++++++++++++++++++++++-------------
 1 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/termios.h b/arch/x86/include/asm/termios.h
index f729563..cbfc2d5 100644
--- a/arch/x86/include/asm/termios.h
+++ b/arch/x86/include/asm/termios.h
@@ -54,20 +54,37 @@ struct termio {
 /*
  * Translate a "termio" structure into a "termios". Ugh.
  */
-#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
-	unsigned short __tmp; \
-	get_user(__tmp,&(termio)->x); \
-	*(unsigned short *) &(termios)->x = __tmp; \
-}
-
 static inline int user_termio_to_kernel_termios(struct ktermios *termios,
 						struct termio __user *termio)
-{
-	SET_LOW_TERMIOS_BITS(termios, termio, c_iflag);
-	SET_LOW_TERMIOS_BITS(termios, termio, c_oflag);
-	SET_LOW_TERMIOS_BITS(termios, termio, c_cflag);
-	SET_LOW_TERMIOS_BITS(termios, termio, c_lflag);
-	return copy_from_user(termios->c_cc, termio->c_cc, NCC);
+{
+	unsigned short tmp;
+
+	if (get_user(tmp, &termio->c_iflag) < 0)
+		goto fault;
+	termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
+
+	if (get_user(tmp, &termio->c_oflag) < 0)
+		goto fault;
+	termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
+
+	if (get_user(tmp, &termio->c_cflag) < 0)
+		goto fault;
+	termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
+
+	if (get_user(tmp, &termio->c_lflag) < 0)
+		goto fault;
+	termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
+
+	if (get_user(termios->c_line, &termio->c_line) < 0)
+		goto fault;
+
+	if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
+		goto fault;
+
+	return 0;
+
+ fault:
+	return -EFAULT;
 }
 
 /*
@@ -76,12 +93,15 @@ static inline int user_termio_to_kernel_termios(struct ktermios *termios,
 static inline int kernel_termios_to_user_termio(struct termio __user *termio,
 					    struct ktermios *termios)
 {
-	put_user((termios)->c_iflag, &(termio)->c_iflag);
-	put_user((termios)->c_oflag, &(termio)->c_oflag);
-	put_user((termios)->c_cflag, &(termio)->c_cflag);
-	put_user((termios)->c_lflag, &(termio)->c_lflag);
-	put_user((termios)->c_line,  &(termio)->c_line);
-	return copy_to_user((termio)->c_cc, (termios)->c_cc, NCC);
+	if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
+	    put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
+	    put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
+	    put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
+	    put_user(termios->c_line,  &termio->c_line) < 0 ||
+	    copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
+		return -EFAULT;
+
+	return 0;
 }
 
 static inline int user_termios_to_kernel_termios(struct ktermios *k,
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-28 14:15 ` [PATCH 08/27] asm-generic: add generic versions of common headers Arnd Bergmann
@ 2009-04-30 16:41   ` David Miller
  2009-04-30 16:49     ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: David Miller @ 2009-04-30 16:41 UTC (permalink / raw)
  To: arnd; +Cc: linux-arch, monstr, remis.developer, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>
Date: Tue, 28 Apr 2009 16:15:26 +0200

Many sites are bouncing because the date on your emails is
as much as two days in the past.

Please correct this, thank you.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [PATCH 2/2] x86: adapt simple headers to use generic headers
  2009-04-30 16:39 ` [PATCH 0/2] use generic headers in x86 Arnd Bergmann
  2009-04-30 16:40   ` [PATCH 1/2] x86: two small fixes in termios.h Arnd Bergmann
@ 2009-04-30 16:42   ` Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 16:42 UTC (permalink / raw)
  To: x86; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

From: Remis Lima Baima <remis.developer@googlemail.com>

A number of x86 specific headers can be significantly
simplified by using the new asm-generic headers.

Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/x86/include/asm/ioctls.h      |   95 +-----------------
 arch/x86/include/asm/ipcbuf.h      |   34 +-----
 arch/x86/include/asm/kmap_types.h  |   31 +-----
 arch/x86/include/asm/mman.h        |   28 ++----
 arch/x86/include/asm/module.h      |   13 +--
 arch/x86/include/asm/msgbuf.h      |   40 +-------
 arch/x86/include/asm/param.h       |   28 +----
 arch/x86/include/asm/scatterlist.h |   41 ++------
 arch/x86/include/asm/shmbuf.h      |   52 +---------
 arch/x86/include/asm/socket.h      |   66 +-----------
 arch/x86/include/asm/sockios.h     |   14 +---
 arch/x86/include/asm/termbits.h    |  199 +-----------------------------------
 arch/x86/include/asm/termios.h     |  134 +------------------------
 arch/x86/include/asm/types.h       |   12 +--
 arch/x86/include/asm/ucontext.h    |    8 +--
 15 files changed, 46 insertions(+), 749 deletions(-)
 rewrite arch/x86/include/asm/ioctls.h (100%)
 rewrite arch/x86/include/asm/ipcbuf.h (86%)
 rewrite arch/x86/include/asm/kmap_types.h (99%)
 rewrite arch/x86/include/asm/mman.h (82%)
 rewrite arch/x86/include/asm/msgbuf.h (100%)
 rewrite arch/x86/include/asm/param.h (81%)
 rewrite arch/x86/include/asm/scatterlist.h (82%)
 rewrite arch/x86/include/asm/shmbuf.h (100%)
 rewrite arch/x86/include/asm/socket.h (93%)
 rewrite arch/x86/include/asm/termbits.h (100%)
 rewrite arch/x86/include/asm/termios.h (100%)

diff --git a/arch/x86/include/asm/ioctls.h b/arch/x86/include/asm/ioctls.h
dissimilarity index 100%
index 0d5b23b..ec34c76 100644
--- a/arch/x86/include/asm/ioctls.h
+++ b/arch/x86/include/asm/ioctls.h
@@ -1,94 +1 @@
-#ifndef _ASM_X86_IOCTLS_H
-#define _ASM_X86_IOCTLS_H
-
-#include <asm/ioctl.h>
-
-/* 0x54 is just a magic number to make these relatively unique ('T') */
-
-#define TCGETS		0x5401
-#define TCSETS		0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
-#define TCSETSW		0x5403
-#define TCSETSF		0x5404
-#define TCGETA		0x5405
-#define TCSETA		0x5406
-#define TCSETAW		0x5407
-#define TCSETAF		0x5408
-#define TCSBRK		0x5409
-#define TCXONC		0x540A
-#define TCFLSH		0x540B
-#define TIOCEXCL	0x540C
-#define TIOCNXCL	0x540D
-#define TIOCSCTTY	0x540E
-#define TIOCGPGRP	0x540F
-#define TIOCSPGRP	0x5410
-#define TIOCOUTQ	0x5411
-#define TIOCSTI		0x5412
-#define TIOCGWINSZ	0x5413
-#define TIOCSWINSZ	0x5414
-#define TIOCMGET	0x5415
-#define TIOCMBIS	0x5416
-#define TIOCMBIC	0x5417
-#define TIOCMSET	0x5418
-#define TIOCGSOFTCAR	0x5419
-#define TIOCSSOFTCAR	0x541A
-#define FIONREAD	0x541B
-#define TIOCINQ		FIONREAD
-#define TIOCLINUX	0x541C
-#define TIOCCONS	0x541D
-#define TIOCGSERIAL	0x541E
-#define TIOCSSERIAL	0x541F
-#define TIOCPKT		0x5420
-#define FIONBIO		0x5421
-#define TIOCNOTTY	0x5422
-#define TIOCSETD	0x5423
-#define TIOCGETD	0x5424
-#define TCSBRKP		0x5425	/* Needed for POSIX tcsendbreak() */
-/* #define TIOCTTYGSTRUCT 0x5426 - Former debugging-only ioctl */
-#define TIOCSBRK	0x5427  /* BSD compatibility */
-#define TIOCCBRK	0x5428  /* BSD compatibility */
-#define TIOCGSID	0x5429  /* Return the session ID of FD */
-#define TCGETS2		_IOR('T', 0x2A, struct termios2)
-#define TCSETS2		_IOW('T', 0x2B, struct termios2)
-#define TCSETSW2	_IOW('T', 0x2C, struct termios2)
-#define TCSETSF2	_IOW('T', 0x2D, struct termios2)
-#define TIOCGRS485	0x542E
-#define TIOCSRS485	0x542F
-#define TIOCGPTN	_IOR('T', 0x30, unsigned int)
-				/* Get Pty Number (of pty-mux device) */
-#define TIOCSPTLCK	_IOW('T', 0x31, int)  /* Lock/unlock Pty */
-#define TCGETX		0x5432 /* SYS5 TCGETX compatibility */
-#define TCSETX		0x5433
-#define TCSETXF		0x5434
-#define TCSETXW		0x5435
-
-#define FIONCLEX	0x5450
-#define FIOCLEX		0x5451
-#define FIOASYNC	0x5452
-#define TIOCSERCONFIG	0x5453
-#define TIOCSERGWILD	0x5454
-#define TIOCSERSWILD	0x5455
-#define TIOCGLCKTRMIOS	0x5456
-#define TIOCSLCKTRMIOS	0x5457
-#define TIOCSERGSTRUCT	0x5458 /* For debugging only */
-#define TIOCSERGETLSR   0x5459 /* Get line status register */
-#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
-#define TIOCSERSETMULTI 0x545B /* Set multiport config */
-
-#define TIOCMIWAIT	0x545C	/* wait for a change on serial input line(s) */
-#define TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
-#define TIOCGHAYESESP   0x545E  /* Get Hayes ESP configuration */
-#define TIOCSHAYESESP   0x545F  /* Set Hayes ESP configuration */
-#define FIOQSIZE	0x5460
-
-/* Used for packet mode */
-#define TIOCPKT_DATA		 0
-#define TIOCPKT_FLUSHREAD	 1
-#define TIOCPKT_FLUSHWRITE	 2
-#define TIOCPKT_STOP		 4
-#define TIOCPKT_START		 8
-#define TIOCPKT_NOSTOP		16
-#define TIOCPKT_DOSTOP		32
-
-#define TIOCSER_TEMT    0x01	/* Transmitter physically empty */
-
-#endif /* _ASM_X86_IOCTLS_H */
+#include <asm-generic/ioctls.h>
diff --git a/arch/x86/include/asm/ipcbuf.h b/arch/x86/include/asm/ipcbuf.h
dissimilarity index 86%
index ee678fd..7151f00 100644
--- a/arch/x86/include/asm/ipcbuf.h
+++ b/arch/x86/include/asm/ipcbuf.h
@@ -1,28 +1,6 @@
-#ifndef _ASM_X86_IPCBUF_H
-#define _ASM_X86_IPCBUF_H
-
-/*
- * The ipc64_perm structure for x86 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit mode_t and seq
- * - 2 miscellaneous 32-bit values
- */
-
-struct ipc64_perm {
-	__kernel_key_t		key;
-	__kernel_uid32_t	uid;
-	__kernel_gid32_t	gid;
-	__kernel_uid32_t	cuid;
-	__kernel_gid32_t	cgid;
-	__kernel_mode_t		mode;
-	unsigned short		__pad1;
-	unsigned short		seq;
-	unsigned short		__pad2;
-	unsigned long		__unused1;
-	unsigned long		__unused2;
-};
-
-#endif /* _ASM_X86_IPCBUF_H */
+#ifndef _ASM_X86_IPCBUF_H
+#define _ASM_X86_IPCBUF_H
+
+#include <asm-generic/ipcbuf.h>
+
+#endif /* _ASM_X86_IPCBUF_H */
diff --git a/arch/x86/include/asm/kmap_types.h b/arch/x86/include/asm/kmap_types.h
dissimilarity index 99%
index 5759c16..a275fa8 100644
--- a/arch/x86/include/asm/kmap_types.h
+++ b/arch/x86/include/asm/kmap_types.h
@@ -1,29 +1,2 @@
-#ifndef _ASM_X86_KMAP_TYPES_H
-#define _ASM_X86_KMAP_TYPES_H
-
-#if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM)
-# define D(n) __KM_FENCE_##n ,
-#else
-# define D(n)
-#endif
-
-enum km_type {
-D(0)	KM_BOUNCE_READ,
-D(1)	KM_SKB_SUNRPC_DATA,
-D(2)	KM_SKB_DATA_SOFTIRQ,
-D(3)	KM_USER0,
-D(4)	KM_USER1,
-D(5)	KM_BIO_SRC_IRQ,
-D(6)	KM_BIO_DST_IRQ,
-D(7)	KM_PTE0,
-D(8)	KM_PTE1,
-D(9)	KM_IRQ0,
-D(10)	KM_IRQ1,
-D(11)	KM_SOFTIRQ0,
-D(12)	KM_SOFTIRQ1,
-D(13)	KM_TYPE_NR
-};
-
-#undef D
-
-#endif /* _ASM_X86_KMAP_TYPES_H */
+#include <asm-generic/kmap_types.h>
+
diff --git a/arch/x86/include/asm/mman.h b/arch/x86/include/asm/mman.h
dissimilarity index 82%
index 751af25..593e51d 100644
--- a/arch/x86/include/asm/mman.h
+++ b/arch/x86/include/asm/mman.h
@@ -1,20 +1,8 @@
-#ifndef _ASM_X86_MMAN_H
-#define _ASM_X86_MMAN_H
-
-#include <asm-generic/mman-common.h>
-
-#define MAP_32BIT	0x40		/* only give out 32bit addresses */
-
-#define MAP_GROWSDOWN	0x0100		/* stack-like segment */
-#define MAP_DENYWRITE	0x0800		/* ETXTBSY */
-#define MAP_EXECUTABLE	0x1000		/* mark it as an executable */
-#define MAP_LOCKED	0x2000		/* pages are locked */
-#define MAP_NORESERVE	0x4000		/* don't check for reservations */
-#define MAP_POPULATE	0x8000		/* populate (prefault) pagetables */
-#define MAP_NONBLOCK	0x10000		/* do not block on IO */
-#define MAP_STACK	0x20000		/* give out an address that is best suited for process/thread stacks */
-
-#define MCL_CURRENT	1		/* lock all current mappings */
-#define MCL_FUTURE	2		/* lock all future mappings */
-
-#endif /* _ASM_X86_MMAN_H */
+#ifndef _ASM_X86_MMAN_H
+#define _ASM_X86_MMAN_H
+
+#define MAP_32BIT	0x40		/* only give out 32bit addresses */
+
+#include <asm-generic/mman.h>
+
+#endif /* _ASM_X86_MMAN_H */
diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h
index 47d6274..555bc12 100644
--- a/arch/x86/include/asm/module.h
+++ b/arch/x86/include/asm/module.h
@@ -1,18 +1,7 @@
 #ifndef _ASM_X86_MODULE_H
 #define _ASM_X86_MODULE_H
 
-/* x86_32/64 are simple */
-struct mod_arch_specific {};
-
-#ifdef CONFIG_X86_32
-# define Elf_Shdr Elf32_Shdr
-# define Elf_Sym Elf32_Sym
-# define Elf_Ehdr Elf32_Ehdr
-#else
-# define Elf_Shdr Elf64_Shdr
-# define Elf_Sym Elf64_Sym
-# define Elf_Ehdr Elf64_Ehdr
-#endif
+#include <asm-generic/module.h>
 
 #ifdef CONFIG_X86_64
 /* X86_64 does not define MODULE_PROC_FAMILY */
diff --git a/arch/x86/include/asm/msgbuf.h b/arch/x86/include/asm/msgbuf.h
dissimilarity index 100%
index 7e4e948..809134c 100644
--- a/arch/x86/include/asm/msgbuf.h
+++ b/arch/x86/include/asm/msgbuf.h
@@ -1,39 +1 @@
-#ifndef _ASM_X86_MSGBUF_H
-#define _ASM_X86_MSGBUF_H
-
-/*
- * The msqid64_ds structure for i386 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space on i386 is left for:
- * - 64-bit time_t to solve y2038 problem
- * - 2 miscellaneous 32-bit values
- *
- * Pad space on x8664 is left for:
- * - 2 miscellaneous 64-bit values
- */
-struct msqid64_ds {
-	struct ipc64_perm msg_perm;
-	__kernel_time_t msg_stime;	/* last msgsnd time */
-#ifdef __i386__
-	unsigned long	__unused1;
-#endif
-	__kernel_time_t msg_rtime;	/* last msgrcv time */
-#ifdef __i386__
-	unsigned long	__unused2;
-#endif
-	__kernel_time_t msg_ctime;	/* last change time */
-#ifdef __i386__
-	unsigned long	__unused3;
-#endif
-	unsigned long  msg_cbytes;	/* current number of bytes on queue */
-	unsigned long  msg_qnum;	/* number of messages in queue */
-	unsigned long  msg_qbytes;	/* max number of bytes on queue */
-	__kernel_pid_t msg_lspid;	/* pid of last msgsnd */
-	__kernel_pid_t msg_lrpid;	/* last receive pid */
-	unsigned long  __unused4;
-	unsigned long  __unused5;
-};
-
-#endif /* _ASM_X86_MSGBUF_H */
+#include <asm-generic/msgbuf.h>
diff --git a/arch/x86/include/asm/param.h b/arch/x86/include/asm/param.h
dissimilarity index 81%
index 6f0d042..1664386 100644
--- a/arch/x86/include/asm/param.h
+++ b/arch/x86/include/asm/param.h
@@ -1,22 +1,6 @@
-#ifndef _ASM_X86_PARAM_H
-#define _ASM_X86_PARAM_H
-
-#ifdef __KERNEL__
-# define HZ		CONFIG_HZ	/* Internal kernel timer frequency */
-# define USER_HZ	100		/* some user interfaces are */
-# define CLOCKS_PER_SEC	(USER_HZ)       /* in "ticks" like times() */
-#endif
-
-#ifndef HZ
-#define HZ 100
-#endif
-
-#define EXEC_PAGESIZE	4096
-
-#ifndef NOGROUP
-#define NOGROUP		(-1)
-#endif
-
-#define MAXHOSTNAMELEN	64	/* max length of hostname */
-
-#endif /* _ASM_X86_PARAM_H */
+#ifndef _ASM_X86_PARAM_H
+#define _ASM_X86_PARAM_H
+
+#include <asm-generic/param.h>
+
+#endif /* _ASM_X86_PARAM_H */
diff --git a/arch/x86/include/asm/scatterlist.h b/arch/x86/include/asm/scatterlist.h
dissimilarity index 82%
index 263d397..75af592 100644
--- a/arch/x86/include/asm/scatterlist.h
+++ b/arch/x86/include/asm/scatterlist.h
@@ -1,33 +1,8 @@
-#ifndef _ASM_X86_SCATTERLIST_H
-#define _ASM_X86_SCATTERLIST_H
-
-#include <asm/types.h>
-
-struct scatterlist {
-#ifdef CONFIG_DEBUG_SG
-	unsigned long	sg_magic;
-#endif
-	unsigned long	page_link;
-	unsigned int	offset;
-	unsigned int	length;
-	dma_addr_t	dma_address;
-	unsigned int	dma_length;
-};
-
-#define ARCH_HAS_SG_CHAIN
-#define ISA_DMA_THRESHOLD (0x00ffffff)
-
-/*
- * These macros should be used after a pci_map_sg call has been done
- * to get bus addresses of each of the SG entries and their lengths.
- * You should only work with the number of sg entries pci_map_sg
- * returns.
- */
-#define sg_dma_address(sg)	((sg)->dma_address)
-#ifdef CONFIG_X86_32
-# define sg_dma_len(sg)		((sg)->length)
-#else
-# define sg_dma_len(sg)		((sg)->dma_length)
-#endif
-
-#endif /* _ASM_X86_SCATTERLIST_H */
+#ifndef _ASM_X86_SCATTERLIST_H
+#define _ASM_X86_SCATTERLIST_H
+
+#define ISA_DMA_THRESHOLD (0x00ffffff)
+
+#include <asm-generic/scatterlist.h>
+
+#endif /* _ASM_X86_SCATTERLIST_H */
diff --git a/arch/x86/include/asm/shmbuf.h b/arch/x86/include/asm/shmbuf.h
dissimilarity index 100%
index b51413b..83c05fc 100644
--- a/arch/x86/include/asm/shmbuf.h
+++ b/arch/x86/include/asm/shmbuf.h
@@ -1,51 +1 @@
-#ifndef _ASM_X86_SHMBUF_H
-#define _ASM_X86_SHMBUF_H
-
-/*
- * The shmid64_ds structure for x86 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space on 32 bit is left for:
- * - 64-bit time_t to solve y2038 problem
- * - 2 miscellaneous 32-bit values
- *
- * Pad space on 64 bit is left for:
- * - 2 miscellaneous 64-bit values
- */
-
-struct shmid64_ds {
-	struct ipc64_perm	shm_perm;	/* operation perms */
-	size_t			shm_segsz;	/* size of segment (bytes) */
-	__kernel_time_t		shm_atime;	/* last attach time */
-#ifdef __i386__
-	unsigned long		__unused1;
-#endif
-	__kernel_time_t		shm_dtime;	/* last detach time */
-#ifdef __i386__
-	unsigned long		__unused2;
-#endif
-	__kernel_time_t		shm_ctime;	/* last change time */
-#ifdef __i386__
-	unsigned long		__unused3;
-#endif
-	__kernel_pid_t		shm_cpid;	/* pid of creator */
-	__kernel_pid_t		shm_lpid;	/* pid of last operator */
-	unsigned long		shm_nattch;	/* no. of current attaches */
-	unsigned long		__unused4;
-	unsigned long		__unused5;
-};
-
-struct shminfo64 {
-	unsigned long	shmmax;
-	unsigned long	shmmin;
-	unsigned long	shmmni;
-	unsigned long	shmseg;
-	unsigned long	shmall;
-	unsigned long	__unused1;
-	unsigned long	__unused2;
-	unsigned long	__unused3;
-	unsigned long	__unused4;
-};
-
-#endif /* _ASM_X86_SHMBUF_H */
+#include <asm-generic/shmbuf.h>
diff --git a/arch/x86/include/asm/socket.h b/arch/x86/include/asm/socket.h
dissimilarity index 93%
index ca8bf2c..8bdbf5d 100644
--- a/arch/x86/include/asm/socket.h
+++ b/arch/x86/include/asm/socket.h
@@ -1,60 +1,6 @@
-#ifndef _ASM_X86_SOCKET_H
-#define _ASM_X86_SOCKET_H
-
-#include <asm/sockios.h>
-
-/* For setsockopt(2) */
-#define SOL_SOCKET	1
-
-#define SO_DEBUG	1
-#define SO_REUSEADDR	2
-#define SO_TYPE		3
-#define SO_ERROR	4
-#define SO_DONTROUTE	5
-#define SO_BROADCAST	6
-#define SO_SNDBUF	7
-#define SO_RCVBUF	8
-#define SO_SNDBUFFORCE	32
-#define SO_RCVBUFFORCE	33
-#define SO_KEEPALIVE	9
-#define SO_OOBINLINE	10
-#define SO_NO_CHECK	11
-#define SO_PRIORITY	12
-#define SO_LINGER	13
-#define SO_BSDCOMPAT	14
-/* To add :#define SO_REUSEPORT 15 */
-#define SO_PASSCRED	16
-#define SO_PEERCRED	17
-#define SO_RCVLOWAT	18
-#define SO_SNDLOWAT	19
-#define SO_RCVTIMEO	20
-#define SO_SNDTIMEO	21
-
-/* Security levels - as per NRL IPv6 - don't actually do anything */
-#define SO_SECURITY_AUTHENTICATION		22
-#define SO_SECURITY_ENCRYPTION_TRANSPORT	23
-#define SO_SECURITY_ENCRYPTION_NETWORK		24
-
-#define SO_BINDTODEVICE	25
-
-/* Socket filtering */
-#define SO_ATTACH_FILTER        26
-#define SO_DETACH_FILTER        27
-
-#define SO_PEERNAME		28
-#define SO_TIMESTAMP		29
-#define SCM_TIMESTAMP		SO_TIMESTAMP
-
-#define SO_ACCEPTCONN		30
-
-#define SO_PEERSEC		31
-#define SO_PASSSEC		34
-#define SO_TIMESTAMPNS		35
-#define SCM_TIMESTAMPNS		SO_TIMESTAMPNS
-
-#define SO_MARK			36
-
-#define SO_TIMESTAMPING		37
-#define SCM_TIMESTAMPING	SO_TIMESTAMPING
-
-#endif /* _ASM_X86_SOCKET_H */
+#ifndef _ASM_X86_SOCKET_H
+#define _ASM_X86_SOCKET_H
+
+#include <asm-generic/socket.h>
+
+#endif /* _ASM_X86_SOCKET_H */
diff --git a/arch/x86/include/asm/sockios.h b/arch/x86/include/asm/sockios.h
index 49cc72b..def6d47 100644
--- a/arch/x86/include/asm/sockios.h
+++ b/arch/x86/include/asm/sockios.h
@@ -1,13 +1 @@
-#ifndef _ASM_X86_SOCKIOS_H
-#define _ASM_X86_SOCKIOS_H
-
-/* Socket-level I/O control calls. */
-#define FIOSETOWN	0x8901
-#define SIOCSPGRP	0x8902
-#define FIOGETOWN	0x8903
-#define SIOCGPGRP	0x8904
-#define SIOCATMARK	0x8905
-#define SIOCGSTAMP	0x8906		/* Get stamp (timeval) */
-#define SIOCGSTAMPNS	0x8907		/* Get stamp (timespec) */
-
-#endif /* _ASM_X86_SOCKIOS_H */
+#include <asm-generic/sockios.h>
diff --git a/arch/x86/include/asm/termbits.h b/arch/x86/include/asm/termbits.h
dissimilarity index 100%
index af1b70e..3935b10 100644
--- a/arch/x86/include/asm/termbits.h
+++ b/arch/x86/include/asm/termbits.h
@@ -1,198 +1 @@
-#ifndef _ASM_X86_TERMBITS_H
-#define _ASM_X86_TERMBITS_H
-
-#include <linux/posix_types.h>
-
-typedef unsigned char	cc_t;
-typedef unsigned int	speed_t;
-typedef unsigned int	tcflag_t;
-
-#define NCCS 19
-struct termios {
-	tcflag_t c_iflag;		/* input mode flags */
-	tcflag_t c_oflag;		/* output mode flags */
-	tcflag_t c_cflag;		/* control mode flags */
-	tcflag_t c_lflag;		/* local mode flags */
-	cc_t c_line;			/* line discipline */
-	cc_t c_cc[NCCS];		/* control characters */
-};
-
-struct termios2 {
-	tcflag_t c_iflag;		/* input mode flags */
-	tcflag_t c_oflag;		/* output mode flags */
-	tcflag_t c_cflag;		/* control mode flags */
-	tcflag_t c_lflag;		/* local mode flags */
-	cc_t c_line;			/* line discipline */
-	cc_t c_cc[NCCS];		/* control characters */
-	speed_t c_ispeed;		/* input speed */
-	speed_t c_ospeed;		/* output speed */
-};
-
-struct ktermios {
-	tcflag_t c_iflag;		/* input mode flags */
-	tcflag_t c_oflag;		/* output mode flags */
-	tcflag_t c_cflag;		/* control mode flags */
-	tcflag_t c_lflag;		/* local mode flags */
-	cc_t c_line;			/* line discipline */
-	cc_t c_cc[NCCS];		/* control characters */
-	speed_t c_ispeed;		/* input speed */
-	speed_t c_ospeed;		/* output speed */
-};
-
-/* c_cc characters */
-#define VINTR 0
-#define VQUIT 1
-#define VERASE 2
-#define VKILL 3
-#define VEOF 4
-#define VTIME 5
-#define VMIN 6
-#define VSWTC 7
-#define VSTART 8
-#define VSTOP 9
-#define VSUSP 10
-#define VEOL 11
-#define VREPRINT 12
-#define VDISCARD 13
-#define VWERASE 14
-#define VLNEXT 15
-#define VEOL2 16
-
-/* c_iflag bits */
-#define IGNBRK	0000001
-#define BRKINT	0000002
-#define IGNPAR	0000004
-#define PARMRK	0000010
-#define INPCK	0000020
-#define ISTRIP	0000040
-#define INLCR	0000100
-#define IGNCR	0000200
-#define ICRNL	0000400
-#define IUCLC	0001000
-#define IXON	0002000
-#define IXANY	0004000
-#define IXOFF	0010000
-#define IMAXBEL	0020000
-#define IUTF8	0040000
-
-/* c_oflag bits */
-#define OPOST	0000001
-#define OLCUC	0000002
-#define ONLCR	0000004
-#define OCRNL	0000010
-#define ONOCR	0000020
-#define ONLRET	0000040
-#define OFILL	0000100
-#define OFDEL	0000200
-#define NLDLY	0000400
-#define   NL0	0000000
-#define   NL1	0000400
-#define CRDLY	0003000
-#define   CR0	0000000
-#define   CR1	0001000
-#define   CR2	0002000
-#define   CR3	0003000
-#define TABDLY	0014000
-#define   TAB0	0000000
-#define   TAB1	0004000
-#define   TAB2	0010000
-#define   TAB3	0014000
-#define   XTABS	0014000
-#define BSDLY	0020000
-#define   BS0	0000000
-#define   BS1	0020000
-#define VTDLY	0040000
-#define   VT0	0000000
-#define   VT1	0040000
-#define FFDLY	0100000
-#define   FF0	0000000
-#define   FF1	0100000
-
-/* c_cflag bit meaning */
-#define CBAUD	0010017
-#define  B0	0000000		/* hang up */
-#define  B50	0000001
-#define  B75	0000002
-#define  B110	0000003
-#define  B134	0000004
-#define  B150	0000005
-#define  B200	0000006
-#define  B300	0000007
-#define  B600	0000010
-#define  B1200	0000011
-#define  B1800	0000012
-#define  B2400	0000013
-#define  B4800	0000014
-#define  B9600	0000015
-#define  B19200	0000016
-#define  B38400	0000017
-#define EXTA B19200
-#define EXTB B38400
-#define CSIZE	0000060
-#define   CS5	0000000
-#define   CS6	0000020
-#define   CS7	0000040
-#define   CS8	0000060
-#define CSTOPB	0000100
-#define CREAD	0000200
-#define PARENB	0000400
-#define PARODD	0001000
-#define HUPCL	0002000
-#define CLOCAL	0004000
-#define CBAUDEX 0010000
-#define	   BOTHER 0010000		/* non standard rate */
-#define    B57600 0010001
-#define   B115200 0010002
-#define   B230400 0010003
-#define   B460800 0010004
-#define   B500000 0010005
-#define   B576000 0010006
-#define   B921600 0010007
-#define  B1000000 0010010
-#define  B1152000 0010011
-#define  B1500000 0010012
-#define  B2000000 0010013
-#define  B2500000 0010014
-#define  B3000000 0010015
-#define  B3500000 0010016
-#define  B4000000 0010017
-#define CIBAUD	  002003600000	/* input baud rate */
-#define CMSPAR	  010000000000	/* mark or space (stick) parity */
-#define CRTSCTS	  020000000000	/* flow control */
-
-#define IBSHIFT	  16		/* Shift from CBAUD to CIBAUD */
-
-/* c_lflag bits */
-#define ISIG	0000001
-#define ICANON	0000002
-#define XCASE	0000004
-#define ECHO	0000010
-#define ECHOE	0000020
-#define ECHOK	0000040
-#define ECHONL	0000100
-#define NOFLSH	0000200
-#define TOSTOP	0000400
-#define ECHOCTL	0001000
-#define ECHOPRT	0002000
-#define ECHOKE	0004000
-#define FLUSHO	0010000
-#define PENDIN	0040000
-#define IEXTEN	0100000
-
-/* tcflow() and TCXONC use these */
-#define	TCOOFF		0
-#define	TCOON		1
-#define	TCIOFF		2
-#define	TCION		3
-
-/* tcflush() and TCFLSH use these */
-#define	TCIFLUSH	0
-#define	TCOFLUSH	1
-#define	TCIOFLUSH	2
-
-/* tcsetattr uses these */
-#define	TCSANOW		0
-#define	TCSADRAIN	1
-#define	TCSAFLUSH	2
-
-#endif /* _ASM_X86_TERMBITS_H */
+#include <asm-generic/termbits.h>
diff --git a/arch/x86/include/asm/termios.h b/arch/x86/include/asm/termios.h
dissimilarity index 100%
index 47420df..280d78a 100644
--- a/arch/x86/include/asm/termios.h
+++ b/arch/x86/include/asm/termios.h
@@ -1,133 +1 @@
-#ifndef _ASM_X86_TERMIOS_H
-#define _ASM_X86_TERMIOS_H
-
-#include <asm/termbits.h>
-#include <asm/ioctls.h>
-
-struct winsize {
-	unsigned short ws_row;
-	unsigned short ws_col;
-	unsigned short ws_xpixel;
-	unsigned short ws_ypixel;
-};
-
-#define NCC 8
-struct termio {
-	unsigned short c_iflag;		/* input mode flags */
-	unsigned short c_oflag;		/* output mode flags */
-	unsigned short c_cflag;		/* control mode flags */
-	unsigned short c_lflag;		/* local mode flags */
-	unsigned char c_line;		/* line discipline */
-	unsigned char c_cc[NCC];	/* control characters */
-};
-
-/* modem lines */
-#define TIOCM_LE	0x001
-#define TIOCM_DTR	0x002
-#define TIOCM_RTS	0x004
-#define TIOCM_ST	0x008
-#define TIOCM_SR	0x010
-#define TIOCM_CTS	0x020
-#define TIOCM_CAR	0x040
-#define TIOCM_RNG	0x080
-#define TIOCM_DSR	0x100
-#define TIOCM_CD	TIOCM_CAR
-#define TIOCM_RI	TIOCM_RNG
-#define TIOCM_OUT1	0x2000
-#define TIOCM_OUT2	0x4000
-#define TIOCM_LOOP	0x8000
-
-/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
-
-#ifdef __KERNEL__
-
-#include <asm/uaccess.h>
-
-/*	intr=^C		quit=^\		erase=del	kill=^U
-	eof=^D		vtime=\0	vmin=\1		sxtc=\0
-	start=^Q	stop=^S		susp=^Z		eol=\0
-	reprint=^R	discard=^U	werase=^W	lnext=^V
-	eol2=\0
-*/
-#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
-
-/*
- * Translate a "termio" structure into a "termios". Ugh.
- */
-static inline int user_termio_to_kernel_termios(struct ktermios *termios,
-						struct termio __user *termio)
-{
-	unsigned short tmp;
-
-	if (get_user(tmp, &termio->c_iflag) < 0)
-		goto fault;
-	termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
-
-	if (get_user(tmp, &termio->c_oflag) < 0)
-		goto fault;
-	termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
-
-	if (get_user(tmp, &termio->c_cflag) < 0)
-		goto fault;
-	termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
-
-	if (get_user(tmp, &termio->c_lflag) < 0)
-		goto fault;
-	termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
-
-	if (get_user(termios->c_line, &termio->c_line) < 0)
-		goto fault;
-
-	if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
-		goto fault;
-
-	return 0;
-
- fault:
-	return -EFAULT;
-}
-
-/*
- * Translate a "termios" structure into a "termio". Ugh.
- */
-static inline int kernel_termios_to_user_termio(struct termio __user *termio,
-					    struct ktermios *termios)
-{
-	if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
-	    put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
-	    put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
-	    put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
-	    put_user(termios->c_line,  &termio->c_line) < 0 ||
-	    copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
-		return -EFAULT;
-
-	return 0;
-}
-
-static inline int user_termios_to_kernel_termios(struct ktermios *k,
-						 struct termios2 __user *u)
-{
-	return copy_from_user(k, u, sizeof(struct termios2));
-}
-
-static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
-						 struct ktermios *k)
-{
-	return copy_to_user(u, k, sizeof(struct termios2));
-}
-
-static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
-						   struct termios __user *u)
-{
-	return copy_from_user(k, u, sizeof(struct termios));
-}
-
-static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
-						   struct ktermios *k)
-{
-	return copy_to_user(u, k, sizeof(struct termios));
-}
-
-#endif	/* __KERNEL__ */
-
-#endif /* _ASM_X86_TERMIOS_H */
+#include <asm-generic/termios.h>
diff --git a/arch/x86/include/asm/types.h b/arch/x86/include/asm/types.h
index 09b9774..df1da20 100644
--- a/arch/x86/include/asm/types.h
+++ b/arch/x86/include/asm/types.h
@@ -1,19 +1,11 @@
 #ifndef _ASM_X86_TYPES_H
 #define _ASM_X86_TYPES_H
 
-#include <asm-generic/int-ll64.h>
+#define dma_addr_t	dma_addr_t
 
-#ifndef __ASSEMBLY__
-
-typedef unsigned short umode_t;
+#include <asm-generic/types.h>
 
-#endif /* __ASSEMBLY__ */
-
-/*
- * These aren't exported outside the kernel to avoid name space clashes
- */
 #ifdef __KERNEL__
-
 #ifndef __ASSEMBLY__
 
 typedef u64 dma64_addr_t;
diff --git a/arch/x86/include/asm/ucontext.h b/arch/x86/include/asm/ucontext.h
index 87324cf..b7c29c8 100644
--- a/arch/x86/include/asm/ucontext.h
+++ b/arch/x86/include/asm/ucontext.h
@@ -7,12 +7,6 @@
 				 * sigcontext struct (uc_mcontext).
 				 */
 
-struct ucontext {
-	unsigned long	  uc_flags;
-	struct ucontext  *uc_link;
-	stack_t		  uc_stack;
-	struct sigcontext uc_mcontext;
-	sigset_t	  uc_sigmask;	/* mask last for extensibility */
-};
+#include <asm-generic/ucontext.h>
 
 #endif /* _ASM_X86_UCONTEXT_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 16:41   ` David Miller
@ 2009-04-30 16:49     ` Arnd Bergmann
  2009-04-30 16:51       ` David Miller
  2009-04-30 18:01       ` Sam Ravnborg
  0 siblings, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 16:49 UTC (permalink / raw)
  To: David Miller; +Cc: linux-arch, monstr, remis.developer, linux-kernel

On Thursday 30 April 2009, David Miller wrote:
> Many sites are bouncing because the date on your emails is
> as much as two days in the past.

Any suggestions on which tool I should use? I've been burned by
both 'quilt mail' and 'git-format-patch' this week and don't want
to make any more experiments. I looked at git-send-email, but
I'm sure I'd screw up even more with that because it directly
sends out the patches rather than giving me an mbox file to look
at.
	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 16:49     ` Arnd Bergmann
@ 2009-04-30 16:51       ` David Miller
  2009-04-30 17:07         ` Arnd Bergmann
  2009-04-30 18:01       ` Sam Ravnborg
  1 sibling, 1 reply; 83+ messages in thread
From: David Miller @ 2009-04-30 16:51 UTC (permalink / raw)
  To: arnd; +Cc: linux-arch, monstr, remis.developer, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>
Date: Thu, 30 Apr 2009 18:49:44 +0200

> On Thursday 30 April 2009, David Miller wrote:
>> Many sites are bouncing because the date on your emails is
>> as much as two days in the past.
> 
> Any suggestions on which tool I should use? I've been burned by
> both 'quilt mail' and 'git-format-patch' this week and don't want
> to make any more experiments. I looked at git-send-email, but
> I'm sure I'd screw up even more with that because it directly
> sends out the patches rather than giving me an mbox file to look
> at.

I use "git format-patch" and send the postings by hand.

I don't trust automated tools to actually send the thing out, because
as postmaster I've seen them screw up in so many monumental ways.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 16:51       ` David Miller
@ 2009-04-30 17:07         ` Arnd Bergmann
  2009-04-30 17:12           ` David Miller
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 17:07 UTC (permalink / raw)
  To: David Miller; +Cc: linux-arch, monstr, remis.developer, linux-kernel

On Thursday 30 April 2009, David Miller wrote:
> I use "git format-patch" and send the postings by hand.

That's what I tried as well, but at least with --stdout, git-format-patch
preserves the date and author (From) fields of the changesets, which should
go in the body instead, while exporting the separate patches followed
by 'quilt mail --mbox' drops these fields, in addition to occasionally
screwing up the whole mbox format in the process.

I was hoping to find a simple tool to generate the mbox file in the right
format for importing into the mail client, rather then importing every
single file separately.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 17:07         ` Arnd Bergmann
@ 2009-04-30 17:12           ` David Miller
  2009-04-30 17:34             ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: David Miller @ 2009-04-30 17:12 UTC (permalink / raw)
  To: arnd; +Cc: linux-arch, monstr, remis.developer, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>
Date: Thu, 30 Apr 2009 19:07:45 +0200

> On Thursday 30 April 2009, David Miller wrote:
>> I use "git format-patch" and send the postings by hand.
> 
> That's what I tried as well,

You didn't read what I said.

I extract the commit messages and patches using "git format-patch"
merely as a formality, then I hand craft every aspect of the emails.

I never put "Date:" fields into the message body, that's rediculiously
stupid.  And it confuses patchwork as well.  Just say NO.

If necessary I put the From: field in there to specify the author, or
leave it out when it's me (which is %99.9999 of the time).

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 17:12           ` David Miller
@ 2009-04-30 17:34             ` Arnd Bergmann
  2009-04-30 17:39               ` David Miller
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-04-30 17:34 UTC (permalink / raw)
  To: David Miller; +Cc: linux-arch, monstr, remis.developer, linux-kernel

On Thursday 30 April 2009, David Miller wrote:
> You didn't read what I said.
> 
> I extract the commit messages and patches using "git format-patch"
> merely as a formality, then I hand craft every aspect of the emails.

Right, this is what I do for smaller sets of patches, but I was
hoping for something slightly simpler when sending out my 27 (plus
the previous 18) patches.

> I never put "Date:" fields into the message body, that's rediculiously
> stupid.  And it confuses patchwork as well.  Just say NO.

Right, fair enough. I figured it wouldn't hurt to have the date in the
body because git-am can deal with it, but of course the problem was
the wrong date in the header.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 17:34             ` Arnd Bergmann
@ 2009-04-30 17:39               ` David Miller
  0 siblings, 0 replies; 83+ messages in thread
From: David Miller @ 2009-04-30 17:39 UTC (permalink / raw)
  To: arnd; +Cc: linux-arch, monstr, remis.developer, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>
Date: Thu, 30 Apr 2009 19:34:58 +0200

> On Thursday 30 April 2009, David Miller wrote:
>> You didn't read what I said.
>> 
>> I extract the commit messages and patches using "git format-patch"
>> merely as a formality, then I hand craft every aspect of the emails.
> 
> Right, this is what I do for smaller sets of patches, but I was
> hoping for something slightly simpler when sending out my 27 (plus
> the previous 18) patches.

You shouldn't be bombing the list with so many patches at once,
another good reason to do it by hand :-)

Either consolidate or send in multiple phases after the initial
patches of infrastructure and examples are OK'd by everyone.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 08/27] asm-generic: add generic versions of common headers
  2009-04-30 16:49     ` Arnd Bergmann
  2009-04-30 16:51       ` David Miller
@ 2009-04-30 18:01       ` Sam Ravnborg
  1 sibling, 0 replies; 83+ messages in thread
From: Sam Ravnborg @ 2009-04-30 18:01 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: David Miller, linux-arch, monstr, remis.developer, linux-kernel

On Thu, Apr 30, 2009 at 06:49:44PM +0200, Arnd Bergmann wrote:
> On Thursday 30 April 2009, David Miller wrote:
> > Many sites are bouncing because the date on your emails is
> > as much as two days in the past.
> 
> Any suggestions on which tool I should use? I've been burned by
> both 'quilt mail' and 'git-format-patch' this week and don't want
> to make any more experiments. I looked at git-send-email, but
> I'm sure I'd screw up even more with that because it directly
> sends out the patches rather than giving me an mbox file to look
> at.

I have been very pleased with git send-email.

I always send out the initial mail by hand "[PATCH 0/nn] xxx".
When it has arrived I create a small shell script
so I can handcraft the options.
Typical shell script looks like this:

git send-email --quiet --no-chain-reply-to \
--in-reply-to "<20090429073510.GA26386@uranus.ravnborg.org>" \
--to "Ingo Molnar <mingo@elte.hu>" \
--to "LKML <linux-kernel@vger.kernel.org>" \
00*

This works well when I have longer series of mail.
And you can split it up so you do it in smaller
groups of say 10 mails.

For a single patch or two I always do it manually.

	Sam

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-03-31 13:30 ` [PATCH 17/27] add generic lib/checksum.c Arnd Bergmann
@ 2009-04-30 22:35   ` Jan-Benedict Glaw
  2009-04-30 22:35     ` Jan-Benedict Glaw
  2009-05-01  9:14     ` Arnd Bergmann
  2009-05-01  9:20   ` Russell King
  1 sibling, 2 replies; 83+ messages in thread
From: Jan-Benedict Glaw @ 2009-04-30 22:35 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1592 bytes --]

On Tue, 2009-03-31 15:30:31 +0200, Arnd Bergmann <arnd@arndb.de> wrote:
> Add a generic (unoptimized) implementation of checksum.c in pure C
> for use by all architectures.
> 
> Based on microblaze code by Michal Simek <monstr@monstr.eu>
> 
> Cc: Michal Simek <monstr@monstr.eu>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
> ---
>  include/asm-generic/checksum.h |   79 +++++++++++++++++
>  lib/Makefile                   |    2 +
>  lib/checksum.c                 |  188 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 269 insertions(+), 0 deletions(-)
>  create mode 100644 include/asm-generic/checksum.h
>  create mode 100644 lib/checksum.c
> 
> diff --git a/lib/checksum.c b/lib/checksum.c
                                ^^^^^^^^^^^^^^
> new file mode 100644
> index 0000000..4f80a4d
> --- /dev/null
> +++ b/lib/checksum.c
> @@ -0,0 +1,188 @@
> +/*
> + * arch/microblaze/lib/checksum.c
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> + *
> + * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>

I haven't looked at the code in detail, but it would be nice to see it
show up soon. Just faced the IP checksumming code while resurrecting
the VAX port.

MfG, JBG

-- 
      Jan-Benedict Glaw      jbglaw@lug-owl.de              +49-172-7608481
Signature of:         "really soon now":      an unspecified period of time, likly to
the second  :                                 be greater than any reasonable definition
                                              of "soon".

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-04-30 22:35   ` Jan-Benedict Glaw
@ 2009-04-30 22:35     ` Jan-Benedict Glaw
  2009-05-01  9:14     ` Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Jan-Benedict Glaw @ 2009-04-30 22:35 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1592 bytes --]

On Tue, 2009-03-31 15:30:31 +0200, Arnd Bergmann <arnd@arndb.de> wrote:
> Add a generic (unoptimized) implementation of checksum.c in pure C
> for use by all architectures.
> 
> Based on microblaze code by Michal Simek <monstr@monstr.eu>
> 
> Cc: Michal Simek <monstr@monstr.eu>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
> ---
>  include/asm-generic/checksum.h |   79 +++++++++++++++++
>  lib/Makefile                   |    2 +
>  lib/checksum.c                 |  188 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 269 insertions(+), 0 deletions(-)
>  create mode 100644 include/asm-generic/checksum.h
>  create mode 100644 lib/checksum.c
> 
> diff --git a/lib/checksum.c b/lib/checksum.c
                                ^^^^^^^^^^^^^^
> new file mode 100644
> index 0000000..4f80a4d
> --- /dev/null
> +++ b/lib/checksum.c
> @@ -0,0 +1,188 @@
> +/*
> + * arch/microblaze/lib/checksum.c
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> + *
> + * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>

I haven't looked at the code in detail, but it would be nice to see it
show up soon. Just faced the IP checksumming code while resurrecting
the VAX port.

MfG, JBG

-- 
      Jan-Benedict Glaw      jbglaw@lug-owl.de              +49-172-7608481
Signature of:         "really soon now":      an unspecified period of time, likly to
the second  :                                 be greater than any reasonable definition
                                              of "soon".

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-04-30 22:35   ` Jan-Benedict Glaw
  2009-04-30 22:35     ` Jan-Benedict Glaw
@ 2009-05-01  9:14     ` Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01  9:14 UTC (permalink / raw)
  To: Jan-Benedict Glaw
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Jan-Benedict Glaw wrote:
> I haven't looked at the code in detail, but it would be nice to see it
> show up soon. Just faced the IP checksumming code while resurrecting
> the VAX port.

I hope my other header changes are helping you as well, that
was the main point. The checksum code was one of the hardest
to consolidate because every architecture tries to optimize
this in a different way. After merging all the different
approaches and throwing away all the assembly code from
each of them, I made the code practically identical to
Michals version.

Please tell me if you need more hooks in the checksum
code for VAX optimizations. You might want to try overriding
the csum_fold function.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-03-31 13:30 ` [PATCH 17/27] add generic lib/checksum.c Arnd Bergmann
  2009-04-30 22:35   ` Jan-Benedict Glaw
@ 2009-05-01  9:20   ` Russell King
  2009-05-01  9:23     ` Michal Simek
  2009-05-01  9:35     ` Arnd Bergmann
  1 sibling, 2 replies; 83+ messages in thread
From: Russell King @ 2009-05-01  9:20 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Tue, Mar 31, 2009 at 03:30:31PM +0200, Arnd Bergmann wrote:
> +/*
> + * copy from fs while checksumming, otherwise like csum_partial
> + */
> +__wsum
> +csum_partial_copy_from_user(const void __user *src, void *dst, int len,
> +						__wsum sum, int *csum_err)
> +{
> +	if (csum_err)
> +		*csum_err = 0;
> +	memcpy(dst, src, len);

Since when has 'memcpy' been valid from user addresses?

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-05-01  9:20   ` Russell King
@ 2009-05-01  9:23     ` Michal Simek
  2009-05-01  9:35     ` Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01  9:23 UTC (permalink / raw)
  To: Arnd Bergmann, linux-arch, Michal Simek, Remis Lima Baima,
	linux-kernel

Russell King wrote:
> On Tue, Mar 31, 2009 at 03:30:31PM +0200, Arnd Bergmann wrote:
>> +/*
>> + * copy from fs while checksumming, otherwise like csum_partial
>> + */
>> +__wsum
>> +csum_partial_copy_from_user(const void __user *src, void *dst, int len,
>> +						__wsum sum, int *csum_err)
>> +{
>> +	if (csum_err)
>> +		*csum_err = 0;
>> +	memcpy(dst, src, len);
> 
> Since when has 'memcpy' been valid from user addresses?
> 
yes, that's wrong

copy_from_user(dst, src, len);

should be there

Michal

-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-05-01  9:20   ` Russell King
  2009-05-01  9:23     ` Michal Simek
@ 2009-05-01  9:35     ` Arnd Bergmann
  2009-05-01  9:37       ` Michal Simek
  1 sibling, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01  9:35 UTC (permalink / raw)
  To: Russell King; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Russell King wrote:
> Since when has 'memcpy' been valid from user addresses?

It's an artifact from the microblaze code, I found it after
submitting the patches when running sparse over it (yes, I
know I should do these things in a different order).

The s390 version seems to get this right, so I'll use this:

static inline __wsum
csum_partial_copy_from_user(const void __user *src, void *dst,
                                          int len, __wsum sum,
                                          int *err_ptr)
{
	int missing;

	missing = copy_from_user(dst, src, len);
	if (missing) {
		memset(dst + len - missing, 0, missing);
		*err_ptr = -EFAULT;
	}

	return csum_partial(dst, len, sum);
}

On microblaze, the old code was only correct for NOMMU.

Thanks,

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 17/27] add generic lib/checksum.c
  2009-05-01  9:35     ` Arnd Bergmann
@ 2009-05-01  9:37       ` Michal Simek
  0 siblings, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01  9:37 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: Russell King, linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> On Friday 01 May 2009, Russell King wrote:
>> Since when has 'memcpy' been valid from user addresses?
> 
> It's an artifact from the microblaze code, I found it after
> submitting the patches when running sparse over it (yes, I
> know I should do these things in a different order).
> 
> The s390 version seems to get this right, so I'll use this:
> 
> static inline __wsum
> csum_partial_copy_from_user(const void __user *src, void *dst,
>                                           int len, __wsum sum,
>                                           int *err_ptr)
> {
> 	int missing;
> 
> 	missing = copy_from_user(dst, src, len);
> 	if (missing) {
> 		memset(dst + len - missing, 0, missing);
> 		*err_ptr = -EFAULT;
> 	}
> 
> 	return csum_partial(dst, len, sum);
> }
> 
> On microblaze, the old code was only correct for NOMMU.

Not it wasn't there were address space problem too.

Michal

> 
> Thanks,
> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
@ 2009-05-01 10:07   ` Michal Simek
  2009-05-01 10:22   ` Russell King
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01 10:07 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> This uaccess.h can be used by all NOMMU architectures,
> but it does not provide exception handlers that would
> be needed for an architecture with an MMU.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
> ---
>  arch/parisc/include/asm/uaccess.h                  |    2 +-
>  arch/sparc/include/asm/uaccess_64.h                |    2 +-
>  .../asm-generic/{uaccess.h => uaccess-unaligned.h} |    6 +-
>  include/asm-generic/uaccess.h                      |  235 +++++++++++++++++---
>  4 files changed, 214 insertions(+), 31 deletions(-)
>  rename include/asm-generic/{uaccess.h => uaccess-unaligned.h} (82%)
>  rewrite include/asm-generic/uaccess.h (96%)
> 
> diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h
> index cd4c0b2..7cf799d 100644
> --- a/arch/parisc/include/asm/uaccess.h
> +++ b/arch/parisc/include/asm/uaccess.h
> @@ -7,7 +7,7 @@
>  #include <asm/page.h>
>  #include <asm/system.h>
>  #include <asm/cache.h>
> -#include <asm-generic/uaccess.h>
> +#include <asm-generic/uaccess-unaligned.h>
>  
>  #define VERIFY_READ 0
>  #define VERIFY_WRITE 1
> diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
> index c64e767..a38c032 100644
> --- a/arch/sparc/include/asm/uaccess_64.h
> +++ b/arch/sparc/include/asm/uaccess_64.h
> @@ -12,7 +12,7 @@
>  #include <asm/asi.h>
>  #include <asm/system.h>
>  #include <asm/spitfire.h>
> -#include <asm-generic/uaccess.h>
> +#include <asm-generic/uaccess-unaligned.h>
>  #endif
>  
>  #ifndef __ASSEMBLY__
> diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess-unaligned.h
> similarity index 82%
> rename from include/asm-generic/uaccess.h
> rename to include/asm-generic/uaccess-unaligned.h
> index 549cb3a..67deb89 100644
> --- a/include/asm-generic/uaccess.h
> +++ b/include/asm-generic/uaccess-unaligned.h
> @@ -1,5 +1,5 @@
> -#ifndef _ASM_GENERIC_UACCESS_H_
> -#define _ASM_GENERIC_UACCESS_H_
> +#ifndef __ASM_GENERIC_UACCESS_UNALIGNED_H
> +#define __ASM_GENERIC_UACCESS_UNALIGNED_H
>  
>  /*
>   * This macro should be used instead of __get_user() when accessing
> @@ -23,4 +23,4 @@
>  	__copy_to_user((ptr), &__x, sizeof(*(ptr))) ? -EFAULT : 0;	\
>  })
>  
> -#endif /* _ASM_GENERIC_UACCESS_H */
> +#endif /* __ASM_GENERIC_UACCESS_UNALIGNED_H */
> diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
> dissimilarity index 96%
> index 549cb3a..ebeacd9 100644
> --- a/include/asm-generic/uaccess.h
> +++ b/include/asm-generic/uaccess.h
> @@ -1,26 +1,209 @@
> -#ifndef _ASM_GENERIC_UACCESS_H_
> -#define _ASM_GENERIC_UACCESS_H_
> -
> -/*
> - * This macro should be used instead of __get_user() when accessing
> - * values at locations that are not known to be aligned.
> - */
> -#define __get_user_unaligned(x, ptr)					\
> -({									\
> -	__typeof__ (*(ptr)) __x;					\
> -	__copy_from_user(&__x, (ptr), sizeof(*(ptr))) ? -EFAULT : 0;	\
> -	(x) = __x;							\
> -})
> -
> -
> -/*
> - * This macro should be used instead of __put_user() when accessing
> - * values at locations that are not known to be aligned.
> - */
> -#define __put_user_unaligned(x, ptr)					\
> -({									\
> -	__typeof__ (*(ptr)) __x = (x);					\
> -	__copy_to_user((ptr), &__x, sizeof(*(ptr))) ? -EFAULT : 0;	\
> -})
> -
> -#endif /* _ASM_GENERIC_UACCESS_H */
> +#ifndef __ASM_GENERIC_UACCESS_H
> +#define __ASM_GENERIC_UACCESS_H
> +
> +/*
> + * User space memory access functions, these should work
> + * on a ny machine that has kernel and user data in the same
> + * address space, e.g. all NOMMU machines.
> + */
> +#include <linux/sched.h>
> +#include <linux/mm.h>
> +#include <linux/string.h>
> +
> +#include <asm/segment.h>
> +
> +#ifndef get_fs
> +#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
> +#define KERNEL_DS	MAKE_MM_SEG(~0UL)
> +#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
> +
> +#define get_ds() (KERNEL_DS)
> +#define get_fs() (current_thread_info()->addr_limit)
> +
> +static inline void set_fs(mm_segment_t fs)
> +{
> +	current_thread_info()->addr_limit = fs;
> +}
> +#endif
> +
> +#define segment_eq(a, b) ((a).seg == (b).seg)
> +
> +#define VERIFY_READ	0
> +#define VERIFY_WRITE	1
> +
> +#define access_ok(type, addr, size) _access_ok((unsigned long)(addr),(size))
> +
> +/*
> + * The architecture should really override this if possible, at least
> + * doing a check on the get_fs()
> + */
> +#ifndef _access_ok
> +static inline int _access_ok(unsigned long addr, unsigned long size)
> +{
> +	return 1;
> +}
> +#endif
> +
> +/*
> + * The exception table consists of pairs of addresses: the first is the
> + * address of an instruction that is allowed to fault, and the second is
> + * the address at which the program should continue.  No registers are
> + * modified, so it is entirely up to the continuation code to figure out
> + * what to do.
> + *
> + * All the routines below use bits of fixup code that are out of line
> + * with the main instruction path.  This means when everything is well,
> + * we don't even have to jump over them.  Further, they do not intrude
> + * on our cache or tlb entries.
> + */
> +
> +struct exception_table_entry
> +{
> +	unsigned long insn, fixup;
> +};
> +
> +/* Returns 0 if exception not found and fixup otherwise.  */
> +extern unsigned long search_exception_table(unsigned long);
> +
> +/*
> + * These are the main single-value transfer routines.  They automatically
> + * use the right size if we just have the right pointer type.
> + */
> +#ifndef __put_user
> +#define __put_user(x, ptr)				\
> +({							\
> +	int __pu_err = 0;				\
> +	typeof(*(ptr)) __pu_val = (x);			\
> +	switch (sizeof (*(ptr))) {			\
> +	case 1:						\
> +	case 2:						\
> +	case 4:						\
> +		*(ptr) = (__pu_val);			\
> +		break;					\
> +	case 8:						\
> +		memcpy(ptr, &__pu_val, sizeof (*(ptr)));\
> +		break;					\
> +	default:					\
> +		__pu_err = __put_user_bad();		\
> +		break;					\
> +	}						\
> +	__pu_err;					\
> +})
> +extern int __put_user_bad(void);
> +#endif
> +
> +#define put_user(x, ptr) (				\
> +	access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?	\
> +		__put_user(x, ptr) :			\
> +		-EFAULT)
> +
> +#ifndef __get_user
> +#define __get_user(x, ptr)				\
> +({							\
> +	int __gu_err = 0;				\
> +	unsigned long __gu_val = (unsigned long)*ptr;	\
> +	switch (sizeof(*(ptr))) {			\
> +	case 1:						\
> +	case 2:						\
> +	case 4:						\
> +	case 8:						\
> +		break;					\
> +	default:					\
> +		__gu_err = __get_user_bad();		\
> +		__gu_val = 0;				\
> +		break;					\
> +	}						\
> +	(x) = (typeof(*ptr))__gu_val;			\
> +	__gu_err;					\
> +})
> +extern int __get_user_bad(void);
> +#endif
> +
> +#define get_user(x, ptr) (				\
> +	access_ok(VERIFY_READ, ptr, sizeof (*ptr)) ?	\
> +		__get_user(x, ptr) :			\
> +		-EFAULT)
> +
> +#define __copy_from_user(to, from, n) (memcpy(to, from, n), 0)
> +#define __copy_to_user(to, from, n) (memcpy(to, from, n), 0)
> +#define __copy_to_user_inatomic __copy_to_user
> +#define __copy_from_user_inatomic __copy_from_user
> +
> +#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
> +
> +#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
> +
> +static inline long copy_from_user(void *to,
> +				  const void __user * from, unsigned long n)
> +{
> +	if (access_ok(VERIFY_READ, from, n))
> +		__copy_from_user(to, from, n);
> +	else
> +		return n;
> +	return 0;
> +}
> +
> +static inline long copy_to_user(void *to,
> +				const void __user * from, unsigned long n)
> +{
> +	if (access_ok(VERIFY_WRITE, to, n))
> +		__copy_to_user(to, from, n);
> +	else
> +		return n;
> +	return 0;
> +}
> +
> +/*
> + * Copy a null terminated string from userspace.
> + */
> +
> +static inline long
> +__do_strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	char *tmp;
> +	strncpy(dst, src, count);
> +	for (tmp = dst; *tmp && count > 0; tmp++, count--)
> +		;
> +	return (tmp - dst);
> +}
> +
> +static inline long
> +strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	if (!access_ok(VERIFY_READ, src, 1))
> +		return -EFAULT;
> +	return __do_strncpy_from_user(dst, src, count);
> +}
> +
> +static inline long
> +__strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	return __do_strncpy_from_user(dst, src, count);
> +}
> +
> +/*
> + * Return the size of a string (including the ending 0)
> + *
> + * Return 0 on exception, a value greater than N if too long
> + */
> +static inline long strnlen_user(const char *src, long n)
> +{
> +	return strlen(src) + 1;
> +}

Here is the cast problem too.

Michal


> +
> +#define strlen_user(str) strnlen_user(str, 32767)
> +
> +/*
> + * Zero Userspace
> + */
> +
> +static inline unsigned long
> +__clear_user(void *to, unsigned long n)
> +{
> +	memset(to, 0, n);
> +	return 0;
> +}
> +
> +#define clear_user(to, n) __clear_user(to, n)
> +
> +#endif /* __ASM_GENERIC_UACCESS_H */


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
  2009-05-01 10:07   ` Michal Simek
@ 2009-05-01 10:22   ` Russell King
       [not found]   ` <c1a198be0904302337x714621d8xc4685a634c5cf222@mail.gmail.com>
  2009-05-04  7:24   ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Geert Uytterhoeven
  3 siblings, 0 replies; 83+ messages in thread
From: Russell King @ 2009-05-01 10:22 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Thu, Nov 06, 2008 at 04:31:03PM +0100, Arnd Bergmann wrote:
> +#define put_user(x, ptr) (				\
> +	access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?	\
> +		__put_user(x, ptr) :			\
> +		-EFAULT)
> +
> +#ifndef __get_user
> +#define __get_user(x, ptr)				\
> +({							\
> +	int __gu_err = 0;				\
> +	unsigned long __gu_val = (unsigned long)*ptr;	\
> +	switch (sizeof(*(ptr))) {			\
> +	case 1:						\
> +	case 2:						\
> +	case 4:						\
> +	case 8:						\
> +		break;					\

If sizeof(unsigned long) = 4, then how can the sizeof(*(ptr)) > 4 case
work?

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
       [not found]   ` <c1a198be0904302309w4154f97dqddd0b2df1924a821@mail.gmail.com>
@ 2009-05-01 12:22     ` Arnd Bergmann
  2009-05-01 12:25       ` Michal Simek
  2009-05-01 12:36       ` Russell King
  0 siblings, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 12:22 UTC (permalink / raw)
  To: Michal Simek; +Cc: linux-arch, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Michal Simek wrote:
> > +/*
> > + * CLOCK_TICK_RATE is highly PC-specific and should not
> > + * be used in portable code. 1193182 is the value for the
> > + * original i8253 PIC.
> > + */
> > +#ifndef CLOCK_TICK_RATE
> > +#define CLOCK_TICK_RATE                1193182
> > +#endif
> 
> 
> Why is this in generic code?

CLOCK_TICK_RATE is only used in a few places:

drivers/char/vt_ioctl.c:                        arg = CLOCK_TICK_RATE / arg;
drivers/char/vt_ioctl.c:                        count = CLOCK_TICK_RATE / count;
drivers/clocksource/acpi_pm.c:  ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10))
drivers/input/joystick/analog.c:#define DELTA(x,y)      (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? CLOCK_TICK_RATE / HZ : 0
drivers/rtc/rtc-pxa.c:#define TIMER_FREQ                CLOCK_TICK_RATE
drivers/serial/serial_ks8695.c:         .uartclk        = CLOCK_TICK_RATE * 16,
drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff);
drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32);
drivers/watchdog/ks8695_wdt.c:  unsigned long tval = wdt_time * CLOCK_TICK_RATE;
include/linux/jiffies.h:#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)  /* For divider */
include/linux/jiffies.h:#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8))
include/linux/timex.h: *        Moved CLOCK_TICK_RATE, CLOCK_TICK_FACTOR and FINETUNE to asm/timex.h
sound/oss/pas2_pcm.c:           foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg;
sound/oss/pas2_pcm.c:           arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo;
sound/oss/pas2_pcm.c:           foo = (CLOCK_TICK_RATE + (arg / 2)) / arg;
sound/oss/pas2_pcm.c:           arg = (CLOCK_TICK_RATE + (foo / 2)) / foo;

All of these are either PC-specific, or they don't actually care
about the specific value. Most architectures just use the
value from the IBM PC, so we might as well make that the generic
default.

Alternatively, we could also move the definition back to linux/timex.h
and allow asm/timex.h to be empty.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:22     ` Arnd Bergmann
@ 2009-05-01 12:25       ` Michal Simek
  2009-05-01 12:37         ` Russell King
  2009-05-01 12:36       ` Russell King
  1 sibling, 1 reply; 83+ messages in thread
From: Michal Simek @ 2009-05-01 12:25 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> On Friday 01 May 2009, Michal Simek wrote:
>>> +/*
>>> + * CLOCK_TICK_RATE is highly PC-specific and should not
>>> + * be used in portable code. 1193182 is the value for the
>>> + * original i8253 PIC.
>>> + */
>>> +#ifndef CLOCK_TICK_RATE
>>> +#define CLOCK_TICK_RATE                1193182
>>> +#endif
>>
>> Why is this in generic code?
> 
> CLOCK_TICK_RATE is only used in a few places:
> 
> drivers/char/vt_ioctl.c:                        arg = CLOCK_TICK_RATE / arg;
> drivers/char/vt_ioctl.c:                        count = CLOCK_TICK_RATE / count;
> drivers/clocksource/acpi_pm.c:  ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10))
> drivers/input/joystick/analog.c:#define DELTA(x,y)      (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? CLOCK_TICK_RATE / HZ : 0
> drivers/rtc/rtc-pxa.c:#define TIMER_FREQ                CLOCK_TICK_RATE
> drivers/serial/serial_ks8695.c:         .uartclk        = CLOCK_TICK_RATE * 16,
> drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff);
> drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32);
> drivers/watchdog/ks8695_wdt.c:  unsigned long tval = wdt_time * CLOCK_TICK_RATE;
> include/linux/jiffies.h:#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)  /* For divider */
> include/linux/jiffies.h:#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8))
> include/linux/timex.h: *        Moved CLOCK_TICK_RATE, CLOCK_TICK_FACTOR and FINETUNE to asm/timex.h
> sound/oss/pas2_pcm.c:           foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg;
> sound/oss/pas2_pcm.c:           arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo;
> sound/oss/pas2_pcm.c:           foo = (CLOCK_TICK_RATE + (arg / 2)) / arg;
> sound/oss/pas2_pcm.c:           arg = (CLOCK_TICK_RATE + (foo / 2)) / foo;
> 
> All of these are either PC-specific, or they don't actually care
> about the specific value. Most architectures just use the
> value from the IBM PC, so we might as well make that the generic
> default.

ok. Let's move out from arch to generic location.

Michal

> 
> Alternatively, we could also move the definition back to linux/timex.h
> and allow asm/timex.h to be empty.

> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 07/27] asm-generic: add minimal cache description
       [not found]   ` <c1a198be0904302303h73c5168fi73f8dc24dc677965@mail.gmail.com>
@ 2009-05-01 12:27     ` Arnd Bergmann
  2009-05-01 12:52       ` Michal Simek
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 12:27 UTC (permalink / raw)
  To: Michal Simek; +Cc: linux-arch, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Michal Simek wrote:
> > +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
> > +       memcpy(dst, src, len)
> > +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
> > +       memcpy(dst, src, len)
> 
> 
> IMHO these two macros will generate cast errors.

I did not see errors here, can you clarify? Note that despite the name,
they don't take a __user pointer. Maybe they should be inline functions
to make that more obvious.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
       [not found]   ` <c1a198be0904302337x714621d8xc4685a634c5cf222@mail.gmail.com>
@ 2009-05-01 12:36     ` Arnd Bergmann
  2009-05-01 12:38       ` Michal Simek
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 12:36 UTC (permalink / raw)
  To: Michal Simek; +Cc: linux-arch, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Michal Simek wrote:
> > +#ifndef __put_user
> > +#define __put_user(x, ptr)                             \
> > +({                                                     \
> > +       int __pu_err = 0;                               \
> > +       typeof(*(ptr)) __pu_val = (x);                  \
> > +       switch (sizeof (*(ptr))) {                      \
> > +       case 1:                                         \
> > +       case 2:                                         \
> > +       case 4:                                         \
> > +               *(ptr) = (__pu_val);                    \
> > +               break;                                  \
> > +       case 8:                                         \
> > +               memcpy(ptr, &__pu_val, sizeof (*(ptr)));\
> 
> 
> potential cast problem

Yes, I'm looking into this already, probably will do something
based on the s390 code, which seems to do this correctly.

> > +#define put_user(x, ptr) (                             \
> > +       access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?   \
> > +               __put_user(x, ptr) :                    \
> > +               -EFAULT)
> 
> 
> IMHO write it as inline function with type checking.

Unfortunately, this doesn't work because of the callin
conventions: __put_user needs to know the type of ptr,
so it has to be a macro.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:22     ` Arnd Bergmann
  2009-05-01 12:25       ` Michal Simek
@ 2009-05-01 12:36       ` Russell King
  1 sibling, 0 replies; 83+ messages in thread
From: Russell King @ 2009-05-01 12:36 UTC (permalink / raw)
  To: Arnd Bergmann, linux-arm-kernel
  Cc: Michal Simek, linux-arch, Remis Lima Baima, linux-kernel

On Fri, May 01, 2009 at 02:22:29PM +0200, Arnd Bergmann wrote:
> drivers/rtc/rtc-pxa.c:#define TIMER_FREQ                CLOCK_TICK_RATE

Needs to use some separate definition, this is not related in any way
to the ISA timer stuff.

> drivers/serial/serial_ks8695.c:         .uartclk        = CLOCK_TICK_RATE * 16,

Ditto.

> drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff);
> drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32);

Ditto.

> drivers/watchdog/ks8695_wdt.c:  unsigned long tval = wdt_time * CLOCK_TICK_RATE;

Ditto.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:25       ` Michal Simek
@ 2009-05-01 12:37         ` Russell King
  2009-05-01 12:53           ` Arnd Bergmann
  2009-05-01 13:09           ` Alan Cox
  0 siblings, 2 replies; 83+ messages in thread
From: Russell King @ 2009-05-01 12:37 UTC (permalink / raw)
  To: Michal Simek; +Cc: Arnd Bergmann, linux-arch, Remis Lima Baima, linux-kernel

On Fri, May 01, 2009 at 02:25:14PM +0200, Michal Simek wrote:
> Arnd Bergmann wrote:
> > On Friday 01 May 2009, Michal Simek wrote:
> >>> +/*
> >>> + * CLOCK_TICK_RATE is highly PC-specific and should not
> >>> + * be used in portable code. 1193182 is the value for the
> >>> + * original i8253 PIC.
> >>> + */
> >>> +#ifndef CLOCK_TICK_RATE
> >>> +#define CLOCK_TICK_RATE                1193182
> >>> +#endif
> >>
> >> Why is this in generic code?
> > 
> > CLOCK_TICK_RATE is only used in a few places:
> > 
> > drivers/char/vt_ioctl.c:                        arg = CLOCK_TICK_RATE / arg;
> > drivers/char/vt_ioctl.c:                        count = CLOCK_TICK_RATE / count;
> > drivers/clocksource/acpi_pm.c:  ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10))
> > drivers/input/joystick/analog.c:#define DELTA(x,y)      (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? CLOCK_TICK_RATE / HZ : 0
> > drivers/rtc/rtc-pxa.c:#define TIMER_FREQ                CLOCK_TICK_RATE
> > drivers/serial/serial_ks8695.c:         .uartclk        = CLOCK_TICK_RATE * 16,
> > drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff);
> > drivers/watchdog/davinci_wdt.c: timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32);
> > drivers/watchdog/ks8695_wdt.c:  unsigned long tval = wdt_time * CLOCK_TICK_RATE;
> > include/linux/jiffies.h:#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)  /* For divider */
> > include/linux/jiffies.h:#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8))
> > include/linux/timex.h: *        Moved CLOCK_TICK_RATE, CLOCK_TICK_FACTOR and FINETUNE to asm/timex.h
> > sound/oss/pas2_pcm.c:           foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg;
> > sound/oss/pas2_pcm.c:           arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo;
> > sound/oss/pas2_pcm.c:           foo = (CLOCK_TICK_RATE + (arg / 2)) / arg;
> > sound/oss/pas2_pcm.c:           arg = (CLOCK_TICK_RATE + (foo / 2)) / foo;
> > 
> > All of these are either PC-specific, or they don't actually care
> > about the specific value. Most architectures just use the
> > value from the IBM PC, so we might as well make that the generic
> > default.
> 
> ok. Let's move out from arch to generic location.

That's only possible once the users have been fixed - otherwise the ARM
stuff listed above _will_ break.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2009-05-01 12:36     ` Arnd Bergmann
@ 2009-05-01 12:38       ` Michal Simek
  2009-05-01 12:38         ` Michal Simek
  2009-05-01 13:13         ` [PATCH V3] asm-generic: add a generic uaccess.h Arnd Bergmann
  0 siblings, 2 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01 12:38 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> On Friday 01 May 2009, Michal Simek wrote:
>>> +#ifndef __put_user
>>> +#define __put_user(x, ptr)                             \
>>> +({                                                     \
>>> +       int __pu_err = 0;                               \
>>> +       typeof(*(ptr)) __pu_val = (x);                  \
>>> +       switch (sizeof (*(ptr))) {                      \
>>> +       case 1:                                         \
>>> +       case 2:                                         \
>>> +       case 4:                                         \
>>> +               *(ptr) = (__pu_val);                    \
>>> +               break;                                  \
>>> +       case 8:                                         \
>>> +               memcpy(ptr, &__pu_val, sizeof (*(ptr)));\
>>
>> potential cast problem
> 
> Yes, I'm looking into this already, probably will do something
> based on the s390 code, which seems to do this correctly.
> 
>>> +#define put_user(x, ptr) (                             \
>>> +       access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?   \
>>> +               __put_user(x, ptr) :                    \
>>> +               -EFAULT)
>>
>> IMHO write it as inline function with type checking.
> 
> Unfortunately, this doesn't work because of the callin
> conventions: __put_user needs to know the type of ptr,
> so it has to be a macro.

yes, I am looking on it too.

Michal

> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2009-05-01 12:38       ` Michal Simek
@ 2009-05-01 12:38         ` Michal Simek
  2009-05-01 13:13         ` [PATCH V3] asm-generic: add a generic uaccess.h Arnd Bergmann
  1 sibling, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01 12:38 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> On Friday 01 May 2009, Michal Simek wrote:
>>> +#ifndef __put_user
>>> +#define __put_user(x, ptr)                             \
>>> +({                                                     \
>>> +       int __pu_err = 0;                               \
>>> +       typeof(*(ptr)) __pu_val = (x);                  \
>>> +       switch (sizeof (*(ptr))) {                      \
>>> +       case 1:                                         \
>>> +       case 2:                                         \
>>> +       case 4:                                         \
>>> +               *(ptr) = (__pu_val);                    \
>>> +               break;                                  \
>>> +       case 8:                                         \
>>> +               memcpy(ptr, &__pu_val, sizeof (*(ptr)));\
>>
>> potential cast problem
> 
> Yes, I'm looking into this already, probably will do something
> based on the s390 code, which seems to do this correctly.
> 
>>> +#define put_user(x, ptr) (                             \
>>> +       access_ok(VERIFY_WRITE, ptr, sizeof (*ptr)) ?   \
>>> +               __put_user(x, ptr) :                    \
>>> +               -EFAULT)
>>
>> IMHO write it as inline function with type checking.
> 
> Unfortunately, this doesn't work because of the callin
> conventions: __put_user needs to know the type of ptr,
> so it has to be a macro.

yes, I am looking on it too.

Michal

> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 07/27] asm-generic: add minimal cache description
  2009-05-01 12:27     ` Arnd Bergmann
@ 2009-05-01 12:52       ` Michal Simek
  0 siblings, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01 12:52 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel

Arnd Bergmann wrote:
> On Friday 01 May 2009, Michal Simek wrote:
>>> +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
>>> +       memcpy(dst, src, len)
>>> +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
>>> +       memcpy(dst, src, len)
>>
>> IMHO these two macros will generate cast errors.
> 
> I did not see errors here, can you clarify? Note that despite the name,
> they don't take a __user pointer. Maybe they should be inline functions
> to make that more obvious.

you are right here with __user.
x86 use it as inline function.

Michal

> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:37         ` Russell King
@ 2009-05-01 12:53           ` Arnd Bergmann
  2009-05-01 13:14             ` Alan Cox
  2009-05-01 13:09           ` Alan Cox
  1 sibling, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 12:53 UTC (permalink / raw)
  To: Russell King; +Cc: Michal Simek, linux-arch, Remis Lima Baima, linux-kernel

On Friday 01 May 2009, Russell King wrote:
> > > All of these are either PC-specific, or they don't actually care
> > > about the specific value. Most architectures just use the
> > > value from the IBM PC, so we might as well make that the generic
> > > default.
> > 
> > ok. Let's move out from arch to generic location.
> 
> That's only possible once the users have been fixed - otherwise the ARM
> stuff listed above _will_ break.

My idea was to just add a fallback of

#ifndef CLOCK_TICK_RATE
#define CLOCK_TICK_RATE                1193182
#endif

to include/linux/timex.h. Since al existing architectures already define
CLOCK_TICK_RATE as a macro, I don't see anything changing for them.

The only difference would be that all architectures that use the default
value can have an empty timex.h.

Am I missing something?

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:37         ` Russell King
  2009-05-01 12:53           ` Arnd Bergmann
@ 2009-05-01 13:09           ` Alan Cox
  2009-05-01 13:29             ` Arnd Bergmann
  1 sibling, 1 reply; 83+ messages in thread
From: Alan Cox @ 2009-05-01 13:09 UTC (permalink / raw)
  To: Russell King
  Cc: Michal Simek, Arnd Bergmann, linux-arch, Remis Lima Baima,
	linux-kernel

On Fri, 1 May 2009 13:37:28 +0100
Russell King <rmk+lkml@arm.linux.org.uk> wrote:

> On Fri, May 01, 2009 at 02:25:14PM +0200, Michal Simek wrote:
> > Arnd Bergmann wrote:
> > > On Friday 01 May 2009, Michal Simek wrote:
> > >>> +/*
> > >>> + * CLOCK_TICK_RATE is highly PC-specific and should not
> > >>> + * be used in portable code. 1193182 is the value for the
> > >>> + * original i8253 PIC.
> > >>> + */
> > >>> +#ifndef CLOCK_TICK_RATE
> > >>> +#define CLOCK_TICK_RATE                1193182
> > >>> +#endif
> > >>
> > >> Why is this in generic code?
> > > 
> > > CLOCK_TICK_RATE is only used in a few places:

Joining in late but its not at all highly PC specific. The same frequency
is used for a whole pile of setups (Alpha etc). It's not well named but
there are good sound reasons the PC chose 1193182 and while those reasons
have long lapsed its a good frequency for other reasons nowdays.

The clock isn't for the PIC either - its for the PIT (although its used
to clock various other things).

We actually have a define of PIT_TICK_RATE internal to the x86 port for
those x86 cases that can use it.





Alan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-01 12:38       ` Michal Simek
  2009-05-01 12:38         ` Michal Simek
@ 2009-05-01 13:13         ` Arnd Bergmann
  2009-05-01 13:47           ` Michal Simek
  2009-05-04  6:07           ` Michal Simek
  1 sibling, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 13:13 UTC (permalink / raw)
  To: monstr; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

This adds a new asm-generic/uaccess.h file that should be usable
by both all NOMMU architectures out of the box. Architectures with
an MMU should override the __access_ok(), __copy_from_user() and
__copy_to_user definitions with their own functions to provide
correct exception handling.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
new file mode 100644
index 0000000..deb1722
--- /dev/null
+++ b/include/asm-generic/uaccess.h
@@ -0,0 +1,319 @@
+#ifndef __ASM_GENERIC_UACCESS_H
+#define __ASM_GENERIC_UACCESS_H
+
+/*
+ * User space memory access functions, these should work
+ * on a ny machine that has kernel and user data in the same
+ * address space, e.g. all NOMMU machines.
+ */
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+
+#include <asm/segment.h>
+
+#ifndef get_fs
+#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
+#define KERNEL_DS	MAKE_MM_SEG(~0UL)
+#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
+
+#define get_ds() (KERNEL_DS)
+#define get_fs() (current_thread_info()->addr_limit)
+
+static inline void set_fs(mm_segment_t fs)
+{
+	current_thread_info()->addr_limit = fs;
+}
+#endif
+
+#define segment_eq(a, b) ((a).seg == (b).seg)
+
+#define VERIFY_READ	0
+#define VERIFY_WRITE	1
+
+#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
+
+/*
+ * The architecture should really override this if possible, at least
+ * doing a check on the get_fs()
+ */
+#ifndef __access_ok
+static inline int __access_ok(unsigned long addr, unsigned long size)
+{
+	return 1;
+}
+#endif
+
+/*
+ * The exception table consists of pairs of addresses: the first is the
+ * address of an instruction that is allowed to fault, and the second is
+ * the address at which the program should continue.  No registers are
+ * modified, so it is entirely up to the continuation code to figure out
+ * what to do.
+ *
+ * All the routines below use bits of fixup code that are out of line
+ * with the main instruction path.  This means when everything is well,
+ * we don't even have to jump over them.  Further, they do not intrude
+ * on our cache or tlb entries.
+ */
+
+struct exception_table_entry
+{
+	unsigned long insn, fixup;
+};
+
+/* Returns 0 if exception not found and fixup otherwise.  */
+extern unsigned long search_exception_table(unsigned long);
+
+/*
+ * architectures with an MMU should override these two
+ */
+#ifndef __copy_from_user
+static inline __must_check long __copy_from_user(void *to,
+		const void __user * from, unsigned long n)
+{
+	if (__builtin_constant_p(n)) {
+		switch(n) {
+		case 1:
+			*(u8 *)to = *(u8 __force *)from;
+			return 0;
+		case 2:
+			*(u16 *)to = *(u16 __force *)from;
+			return 0;
+		case 4:
+			*(u32 *)to = *(u32 __force *)from;
+			return 0;
+#ifdef CONFIG_64BIT
+		case 8:
+			*(u64 *)to = *(u64 __force *)from;
+			return 0;
+#endif
+		default:
+			break;
+		}
+	}
+
+	memcpy(to, (const void __force *)from, n);
+	return 0;
+}
+#endif
+
+#ifndef __copy_to_user
+static inline __must_check long __copy_to_user(void __user *to,
+		const void *from, unsigned long n)
+{
+	if (__builtin_constant_p(n)) {
+		switch(n) {
+		case 1:
+			*(u8 __force *)to = *(u8 *)from;
+			return 0;
+		case 2:
+			*(u16 __force *)to = *(u16 *)from;
+			return 0;
+		case 4:
+			*(u32 __force *)to = *(u32 *)from;
+			return 0;
+#ifdef CONFIG_64BIT
+		case 8:
+			*(u64 __force *)to = *(u64 *)from;
+			return 0;
+#endif
+		default:
+			break;
+		}
+	}
+
+	memcpy((void __force *)to, from, n);
+	return 0;
+}
+#endif
+
+/*
+ * These are the main single-value transfer routines.  They automatically
+ * use the right size if we just have the right pointer type.
+ * This version just falls back to copy_{from,to}_user, which should
+ * provide a fast-path for small values. 
+ */
+#define __put_user(x, ptr) \
+({								\
+	__typeof__(*(ptr)) __x = (x);				\
+	int __pu_err = -EFAULT;					\
+        __chk_user_ptr(ptr);					\
+	switch (sizeof (*(ptr))) {				\
+	case 1:							\
+	case 2:							\
+	case 4:							\
+	case 8:							\
+		__pu_err = __put_user_fn(sizeof (*(ptr)),	\
+					 ptr, &__x);		\
+		break;						\
+	default:						\
+		__put_user_bad();				\
+		break;						\
+	 }							\
+	__pu_err;						\
+})
+
+#define put_user(x, ptr)					\
+({								\
+	might_sleep();						\
+	__access_ok(ptr, sizeof (*ptr)) ?			\
+		__put_user(x, ptr) :				\
+		-EFAULT;					\
+})
+
+static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
+{
+	size = __copy_to_user(ptr, x, size);
+	return size ? -EFAULT : size;
+}
+
+extern int __put_user_bad(void) __attribute__((noreturn));
+
+#define __get_user(x, ptr)					\
+({								\
+	int __gu_err = -EFAULT;					\
+	__chk_user_ptr(ptr);					\
+	switch (sizeof(*(ptr))) {				\
+	case 1: {						\
+		unsigned char __x;				\
+		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
+					 ptr, &__x);		\
+		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
+		break;						\
+	};							\
+	case 2: {						\
+		unsigned short __x;				\
+		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
+					 ptr, &__x);		\
+		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
+		break;						\
+	};							\
+	case 4: {						\
+		unsigned int __x;				\
+		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
+					 ptr, &__x);		\
+		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
+		break;						\
+	};							\
+	case 8: {						\
+		unsigned long long __x;				\
+		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
+					 ptr, &__x);		\
+		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
+		break;						\
+	};							\
+	default:						\
+		__get_user_bad();				\
+		break;						\
+	}							\
+	__gu_err;						\
+})
+
+#define get_user(x, ptr)					\
+({								\
+	might_sleep();						\
+	__access_ok(ptr, sizeof (*ptr)) ?			\
+		__get_user(x, ptr) :				\
+		-EFAULT;					\
+})
+
+static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
+{
+	size = __copy_from_user(x, ptr, size);
+	return size ? -EFAULT : size;
+}
+
+extern int __get_user_bad(void) __attribute__((noreturn));
+
+#ifndef __copy_from_user_inatomic
+#define __copy_from_user_inatomic __copy_from_user
+#endif
+
+#ifndef __copy_to_user_inatomic
+#define __copy_to_user_inatomic __copy_to_user
+#endif
+
+static inline long copy_from_user(void *to,
+		const void __user * from, unsigned long n)
+{
+	might_sleep();
+	if (__access_ok(from, n))
+		return __copy_from_user(to, from, n);
+	else
+		return n;
+}
+
+static inline long copy_to_user(void __user *to,
+		const void *from, unsigned long n)
+{
+	might_sleep();
+	if (__access_ok(to, n))
+		return __copy_to_user(to, from, n);
+	else
+		return n;
+}
+
+/*
+ * Copy a null terminated string from userspace.
+ */
+#ifndef __strncpy_from_user
+static inline long
+__strncpy_from_user(char *dst, const char __user *src, long count)
+{
+	char *tmp;
+	strncpy(dst, (const char __force *)src, count);
+	for (tmp = dst; *tmp && count > 0; tmp++, count--)
+		;
+	return (tmp - dst);
+}
+#endif
+
+static inline long
+strncpy_from_user(char *dst, const char __user *src, long count)
+{
+	if (!__access_ok(src, 1))
+		return -EFAULT;
+	return __strncpy_from_user(dst, src, count);
+}
+
+/*
+ * Return the size of a string (including the ending 0)
+ *
+ * Return 0 on exception, a value greater than N if too long
+ */
+#ifndef strnlen_user
+static inline long strnlen_user(const char __user *src, long n)
+{
+	return strlen((void * __force)src) + 1;
+}
+#endif
+
+static inline long strlen_user(const char __user *src)
+{
+	return strnlen_user(src, 32767);
+}
+
+/*
+ * Zero Userspace
+ */
+#ifndef __clear_user
+static inline __must_check unsigned long
+__clear_user(void __user *to, unsigned long n)
+{
+	memset((void __force *)to, 0, n);
+	return 0;
+}
+#endif
+
+static inline __must_check unsigned long
+clear_user(void __user *to, unsigned long n)
+{
+	might_sleep();
+	if (!__access_ok(to, n))
+		return n;
+
+	return __clear_user(to, n);
+}
+
+#endif /* __ASM_GENERIC_UACCESS_H */

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 12:53           ` Arnd Bergmann
@ 2009-05-01 13:14             ` Alan Cox
  2009-05-01 13:20               ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: Alan Cox @ 2009-05-01 13:14 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

> #ifndef CLOCK_TICK_RATE
> #define CLOCK_TICK_RATE                1193182
> #endif
> 
> to include/linux/timex.h. Since al existing architectures already define
> CLOCK_TICK_RATE as a macro, I don't see anything changing for them.
> 
> The only difference would be that all architectures that use the default
> value can have an empty timex.h.
> 
> Am I missing something?

Currently if you create a new architecture you have to figure out what
your equivalent tick rate is or you get an error for not defining it.
Ditto if you try to build code using it on platforms that it is
meaningless (eg S/390) you get an error.

You'd lose that rather useful property.

Alan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:14             ` Alan Cox
@ 2009-05-01 13:20               ` Arnd Bergmann
  2009-05-01 13:20                 ` Arnd Bergmann
  2009-05-01 13:40                 ` Alan Cox
  0 siblings, 2 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 13:20 UTC (permalink / raw)
  To: Alan Cox
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

On Friday 01 May 2009, Alan Cox wrote:
> Currently if you create a new architecture you have to figure out what
> your equivalent tick rate is or you get an error for not defining it.
> Ditto if you try to build code using it on platforms that it is
> meaningless (eg S/390) you get an error.
> 
> You'd lose that rather useful property.

In that case, I still think it would be good to have it in asm-generic.
Half the architectures define it in this way currently, and new architectures
would still have to think about it before falling back on the default.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:20               ` Arnd Bergmann
@ 2009-05-01 13:20                 ` Arnd Bergmann
  2009-05-01 13:40                 ` Alan Cox
  1 sibling, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 13:20 UTC (permalink / raw)
  To: Alan Cox
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

On Friday 01 May 2009, Alan Cox wrote:
> Currently if you create a new architecture you have to figure out what
> your equivalent tick rate is or you get an error for not defining it.
> Ditto if you try to build code using it on platforms that it is
> meaningless (eg S/390) you get an error.
> 
> You'd lose that rather useful property.

In that case, I still think it would be good to have it in asm-generic.
Half the architectures define it in this way currently, and new architectures
would still have to think about it before falling back on the default.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:09           ` Alan Cox
@ 2009-05-01 13:29             ` Arnd Bergmann
  2009-05-01 13:44               ` Alan Cox
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 13:29 UTC (permalink / raw)
  To: Alan Cox
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

On Friday 01 May 2009, Alan Cox wrote:
> Joining in late but its not at all highly PC specific. The same frequency
> is used for a whole pile of setups (Alpha etc). It's not well named but
> there are good sound reasons the PC chose 1193182 and while those reasons
> have long lapsed its a good frequency for other reasons nowdays.
> 
> The clock isn't for the PIC either - its for the PIT (although its used
> to clock various other things).
> 
> We actually have a define of PIT_TICK_RATE internal to the x86 port for
> those x86 cases that can use it.

How about this comment then:

/*
 * CLOCK_TICK_RATE is traditionally the base frequency using the PC-style
 * i8253 "PIT" timer. Architecture independent device drivers should not
 * rely on this value.
 * Any architecture that either has a real PC-style PIT, or does not have a
 * fixed timer interval at all and just needs to provide some value here
 * should just fall back to this default.
 */

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:20               ` Arnd Bergmann
  2009-05-01 13:20                 ` Arnd Bergmann
@ 2009-05-01 13:40                 ` Alan Cox
  1 sibling, 0 replies; 83+ messages in thread
From: Alan Cox @ 2009-05-01 13:40 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

> In that case, I still think it would be good to have it in asm-generic.
> Half the architectures define it in this way currently, and new architectures
> would still have to think about it before falling back on the default.

Only if they noticed it was even present in the generic includes. Why
would they notice - meaningless code would just compile perfectly.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:29             ` Arnd Bergmann
@ 2009-05-01 13:44               ` Alan Cox
  2009-05-01 13:56                 ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: Alan Cox @ 2009-05-01 13:44 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

> /*
>  * CLOCK_TICK_RATE is traditionally the base frequency using the PC-style
>  * i8253 "PIT" timer. Architecture independent device drivers should not
>  * rely on this value.
>  * Any architecture that either has a real PC-style PIT, or does not have a
>  * fixed timer interval at all and just needs to provide some value here
>  * should just fall back to this default.
>  */

They shouldn't define it - we want those invalid cases to error. Stick
CLOCK_TICK_RATE in the depths of the x86 arch includes and then we can
fix the other cases properly. Either the device has an independant clock
of the same frequency (some watchdogs do this), it relies upon a
motherboard timer in which case the platform can define CLOCK_TICK_RATE
(or a better name for it), or it doesn't have any meaning in which case
we *want* it not to compile.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-01 13:13         ` [PATCH V3] asm-generic: add a generic uaccess.h Arnd Bergmann
@ 2009-05-01 13:47           ` Michal Simek
  2009-05-01 14:06             ` Arnd Bergmann
  2009-05-04  6:07           ` Michal Simek
  1 sibling, 1 reply; 83+ messages in thread
From: Michal Simek @ 2009-05-01 13:47 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

Arnd Bergmann wrote:
> This adds a new asm-generic/uaccess.h file that should be usable
> by both all NOMMU architectures out of the box. Architectures with
> an MMU should override the __access_ok(), __copy_from_user() and
> __copy_to_user definitions with their own functions to provide
> correct exception handling.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> 
> diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
> new file mode 100644
> index 0000000..deb1722
> --- /dev/null
> +++ b/include/asm-generic/uaccess.h
> @@ -0,0 +1,319 @@
> +#ifndef __ASM_GENERIC_UACCESS_H
> +#define __ASM_GENERIC_UACCESS_H
> +
> +/*
> + * User space memory access functions, these should work
> + * on a ny machine that has kernel and user data in the same
> + * address space, e.g. all NOMMU machines.
> + */
> +#include <linux/sched.h>
> +#include <linux/mm.h>
> +#include <linux/string.h>
> +
> +#include <asm/segment.h>
> +
> +#ifndef get_fs
> +#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })

one line above -> get_fs could be defined in different space
and this arch could use MAKE_MM_SEG too -> for example powerpc.


> +#define KERNEL_DS	MAKE_MM_SEG(~0UL)
> +#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
> +
> +#define get_ds() (KERNEL_DS)
> +#define get_fs() (current_thread_info()->addr_limit)
> +
> +static inline void set_fs(mm_segment_t fs)
> +{
> +	current_thread_info()->addr_limit = fs;
> +}
> +#endif
> +
> +#define segment_eq(a, b) ((a).seg == (b).seg)
> +
> +#define VERIFY_READ	0
> +#define VERIFY_WRITE	1
> +


Not sure if any arch do READ/WRITE check but if yes.

#ifndef access_ok

> +#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))

#endif

> +
> +/*
> + * The architecture should really override this if possible, at least
> + * doing a check on the get_fs()
> + */

If they should really override it but why write it here.

> +#ifndef __access_ok
> +static inline int __access_ok(unsigned long addr, unsigned long size)
> +{
> +	return 1;
> +}
> +#endif
> +
> +/*
> + * The exception table consists of pairs of addresses: the first is the
> + * address of an instruction that is allowed to fault, and the second is
> + * the address at which the program should continue.  No registers are
> + * modified, so it is entirely up to the continuation code to figure out
> + * what to do.
> + *
> + * All the routines below use bits of fixup code that are out of line
> + * with the main instruction path.  This means when everything is well,
> + * we don't even have to jump over them.  Further, they do not intrude
> + * on our cache or tlb entries.
> + */
> +
> +struct exception_table_entry
> +{
> +	unsigned long insn, fixup;
> +};
> +
> +/* Returns 0 if exception not found and fixup otherwise.  */
> +extern unsigned long search_exception_table(unsigned long);
> +
> +/*
> + * architectures with an MMU should override these two
> + */
> +#ifndef __copy_from_user
> +static inline __must_check long __copy_from_user(void *to,
> +		const void __user * from, unsigned long n)
> +{
> +	if (__builtin_constant_p(n)) {
> +		switch(n) {
> +		case 1:
> +			*(u8 *)to = *(u8 __force *)from;
> +			return 0;
> +		case 2:
> +			*(u16 *)to = *(u16 __force *)from;
> +			return 0;
> +		case 4:
> +			*(u32 *)to = *(u32 __force *)from;
> +			return 0;
> +#ifdef CONFIG_64BIT
> +		case 8:
> +			*(u64 *)to = *(u64 __force *)from;
> +			return 0;
> +#endif
> +		default:
> +			break;
> +		}
> +	}
> +
> +	memcpy(to, (const void __force *)from, n);
> +	return 0;
> +}
> +#endif
> +
> +#ifndef __copy_to_user
> +static inline __must_check long __copy_to_user(void __user *to,
> +		const void *from, unsigned long n)
> +{
> +	if (__builtin_constant_p(n)) {
> +		switch(n) {
> +		case 1:
> +			*(u8 __force *)to = *(u8 *)from;
> +			return 0;
> +		case 2:
> +			*(u16 __force *)to = *(u16 *)from;
> +			return 0;
> +		case 4:
> +			*(u32 __force *)to = *(u32 *)from;
> +			return 0;
> +#ifdef CONFIG_64BIT
> +		case 8:
> +			*(u64 __force *)to = *(u64 *)from;
> +			return 0;
> +#endif
> +		default:
> +			break;
> +		}
> +	}
> +
> +	memcpy((void __force *)to, from, n);
> +	return 0;
> +}
> +#endif
> +
> +/*
> + * These are the main single-value transfer routines.  They automatically
> + * use the right size if we just have the right pointer type.
> + * This version just falls back to copy_{from,to}_user, which should
> + * provide a fast-path for small values. 
> + */
> +#define __put_user(x, ptr) \
> +({								\
> +	__typeof__(*(ptr)) __x = (x);				\
> +	int __pu_err = -EFAULT;					\
> +        __chk_user_ptr(ptr);					\
> +	switch (sizeof (*(ptr))) {				\
> +	case 1:							\
> +	case 2:							\
> +	case 4:							\
> +	case 8:							\
> +		__pu_err = __put_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		break;						\
> +	default:						\
> +		__put_user_bad();				\
> +		break;						\
> +	 }							\
> +	__pu_err;						\
> +})
> +
> +#define put_user(x, ptr)					\
> +({								\
> +	might_sleep();						\
> +	__access_ok(ptr, sizeof (*ptr)) ?			\
> +		__put_user(x, ptr) :				\
> +		-EFAULT;					\
> +})
> +
> +static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
> +{
> +	size = __copy_to_user(ptr, x, size);
> +	return size ? -EFAULT : size;
> +}
> +
> +extern int __put_user_bad(void) __attribute__((noreturn));
> +
> +#define __get_user(x, ptr)					\
> +({								\
> +	int __gu_err = -EFAULT;					\
> +	__chk_user_ptr(ptr);					\
> +	switch (sizeof(*(ptr))) {				\
> +	case 1: {						\
> +		unsigned char __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 2: {						\
> +		unsigned short __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 4: {						\
> +		unsigned int __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 8: {						\
> +		unsigned long long __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	default:						\
> +		__get_user_bad();				\
> +		break;						\
> +	}							\
> +	__gu_err;						\
> +})
> +
> +#define get_user(x, ptr)					\
> +({								\
> +	might_sleep();						\
> +	__access_ok(ptr, sizeof (*ptr)) ?			\
> +		__get_user(x, ptr) :				\
> +		-EFAULT;					\
> +})

I am getting here (for put_user macro too) any error on noMMU. :-(

> +
> +static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
> +{
> +	size = __copy_from_user(x, ptr, size);
> +	return size ? -EFAULT : size;
> +}
> +
> +extern int __get_user_bad(void) __attribute__((noreturn));
> +
> +#ifndef __copy_from_user_inatomic
> +#define __copy_from_user_inatomic __copy_from_user
> +#endif
> +
> +#ifndef __copy_to_user_inatomic
> +#define __copy_to_user_inatomic __copy_to_user
> +#endif
> +
> +static inline long copy_from_user(void *to,
> +		const void __user * from, unsigned long n)
> +{
> +	might_sleep();
> +	if (__access_ok(from, n))
> +		return __copy_from_user(to, from, n);
> +	else
> +		return n;
> +}
> +
> +static inline long copy_to_user(void __user *to,
> +		const void *from, unsigned long n)
> +{
> +	might_sleep();
> +	if (__access_ok(to, n))
> +		return __copy_to_user(to, from, n);
> +	else
> +		return n;
> +}
> +
> +/*
> + * Copy a null terminated string from userspace.
> + */
> +#ifndef __strncpy_from_user
> +static inline long
> +__strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	char *tmp;
> +	strncpy(dst, (const char __force *)src, count);
> +	for (tmp = dst; *tmp && count > 0; tmp++, count--)

I have the same code here with ++tmp, --count.

> +		;
> +	return (tmp - dst);
> +}
> +#endif
> +
> +static inline long
> +strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	if (!__access_ok(src, 1))
> +		return -EFAULT;
> +	return __strncpy_from_user(dst, src, count);
> +}

Is it a good place to add might_sleep() and unlikely(+ some other cases) too?
We have almost the same code.

Michal


> +
> +/*
> + * Return the size of a string (including the ending 0)
> + *
> + * Return 0 on exception, a value greater than N if too long
> + */
> +#ifndef strnlen_user
> +static inline long strnlen_user(const char __user *src, long n)
> +{
> +	return strlen((void * __force)src) + 1;
> +}
> +#endif
> +
> +static inline long strlen_user(const char __user *src)
> +{
> +	return strnlen_user(src, 32767);
> +}
> +
> +/*
> + * Zero Userspace
> + */
> +#ifndef __clear_user
> +static inline __must_check unsigned long
> +__clear_user(void __user *to, unsigned long n)
> +{
> +	memset((void __force *)to, 0, n);
> +	return 0;
> +}
> +#endif
> +
> +static inline __must_check unsigned long
> +clear_user(void __user *to, unsigned long n)
> +{
> +	might_sleep();
> +	if (!__access_ok(to, n))
> +		return n;
> +
> +	return __clear_user(to, n);
> +}
> +
> +#endif /* __ASM_GENERIC_UACCESS_H */


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:44               ` Alan Cox
@ 2009-05-01 13:56                 ` Arnd Bergmann
  2009-05-01 14:03                   ` Alan Cox
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 13:56 UTC (permalink / raw)
  To: Alan Cox
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

On Friday 01 May 2009, Alan Cox wrote:
> They shouldn't define it - we want those invalid cases to error. Stick
> CLOCK_TICK_RATE in the depths of the x86 arch includes and then we can
> fix the other cases properly. Either the device has an independant clock
> of the same frequency (some watchdogs do this), it relies upon a
> motherboard timer in which case the platform can define CLOCK_TICK_RATE
> (or a better name for it), or it doesn't have any meaning in which case
> we *want* it not to compile.

I just noticed that linux/jiffies.h does not compile without a definition
of CLOCK_TICK_RATE, so that's probably why every architecture defines it.
If I find a way to remove that dependency, I can simply leave out the
CLOCK_TICK_RATE from the generic header. I have not yet understood the
relation of jiffies to CLOCK_TICK_RATE, but my suspicion is that it's
not good for architectures that do not have a clock tick.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 13:56                 ` Arnd Bergmann
@ 2009-05-01 14:03                   ` Alan Cox
  2009-05-01 14:07                     ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: Alan Cox @ 2009-05-01 14:03 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

> I just noticed that linux/jiffies.h does not compile without a definition
> of CLOCK_TICK_RATE, so that's probably why every architecture defines it.

It should do so just fine what errors are you seeing ?

CLOCK_TICK_RATE produces ACTHZ and LATCH

ACTHZ is specific to the jiffies timer (and requires CLOCK_TICK_RATE
represents the input frequency that is divided to generate the target HZ
value for the system), LATCH is used in a couple of ugly bits of x86 code
and can probably now go away.

So we now have at least two conflicting meanings for CLOCK_TICK_RATE
which again says it needs fixing not wallpapering over.

Alan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-01 13:47           ` Michal Simek
@ 2009-05-01 14:06             ` Arnd Bergmann
  2009-05-01 14:11               ` Michal Simek
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 14:06 UTC (permalink / raw)
  To: monstr; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

On Friday 01 May 2009, Michal Simek wrote:
> Arnd Bergmann wrote:
> > +
> > +#include <asm/segment.h>
> > +
> > +#ifndef get_fs
> > +#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
> 
> one line above -> get_fs could be defined in different space
> and this arch could use MAKE_MM_SEG too -> for example powerpc.

I don't think I understand what you are trying to tell me.
How do you think this should look?

> > +
> > +#define VERIFY_READ	0
> > +#define VERIFY_WRITE	1
> > +
> 
> 
> Not sure if any arch do READ/WRITE check but if yes.

I could not find any architecture using it either, but the
API is defined this way.

> #ifndef access_ok
> 
> > +#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
> 
> #endif

right, will change.

> > +
> > +/*
> > + * The architecture should really override this if possible, at least
> > + * doing a check on the get_fs()
> > + */
> 
> If they should really override it but why write it here.

Mostly for documentation purposes, so that an architecture maintainer
can copy the prototype. I see the asm-generic headers as both fallbacks
for architectures and as templates of what should be implemented.

> > +#define get_user(x, ptr)					\
> > +({								\
> > +	might_sleep();						\
> > +	__access_ok(ptr, sizeof (*ptr)) ?			\
> > +		__get_user(x, ptr) :				\
> > +		-EFAULT;					\
> > +})
> 
> I am getting here (for put_user macro too) any error on noMMU. :-(

What kind of error do you see?
 
> > +static inline long
> > +strncpy_from_user(char *dst, const char __user *src, long count)
> > +{
> > +	if (!__access_ok(src, 1))
> > +		return -EFAULT;
> > +	return __strncpy_from_user(dst, src, count);
> > +}
> 
> Is it a good place to add might_sleep() and unlikely(+ some other cases) too?
> We have almost the same code.

Yes, I think so. The unlikely() can probably go into __access_ok() though,
so we don't have to write it every time.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 04/27] asm-generic: add legacy I/O header files
  2009-05-01 14:03                   ` Alan Cox
@ 2009-05-01 14:07                     ` Arnd Bergmann
  0 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-01 14:07 UTC (permalink / raw)
  To: Alan Cox
  Cc: Russell King, Michal Simek, linux-arch, Remis Lima Baima,
	linux-kernel

On Friday 01 May 2009, Alan Cox wrote:
> So we now have at least two conflicting meanings for CLOCK_TICK_RATE
> which again says it needs fixing not wallpapering over.

Right, I agree. I'll look into it next week.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-01 14:06             ` Arnd Bergmann
@ 2009-05-01 14:11               ` Michal Simek
  0 siblings, 0 replies; 83+ messages in thread
From: Michal Simek @ 2009-05-01 14:11 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

Arnd Bergmann wrote:
> On Friday 01 May 2009, Michal Simek wrote:
>> Arnd Bergmann wrote:
>>> +
>>> +#include <asm/segment.h>
>>> +
>>> +#ifndef get_fs
>>> +#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
>> one line above -> get_fs could be defined in different space
>> and this arch could use MAKE_MM_SEG too -> for example powerpc.
> 
> I don't think I understand what you are trying to tell me.
> How do you think this should look?

I meant move MAKE_MM_SEG macro to this position because this macro could be use
with arch which define different get_fs.

#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
#ifndef get_fs
...


> 
>>> +
>>> +#define VERIFY_READ	0
>>> +#define VERIFY_WRITE	1
>>> +
>>
>> Not sure if any arch do READ/WRITE check but if yes.
> 
> I could not find any architecture using it either, but the
> API is defined this way.
> 
>> #ifndef access_ok
>>
>>> +#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
>> #endif
> 
> right, will change.
> 
>>> +
>>> +/*
>>> + * The architecture should really override this if possible, at least
>>> + * doing a check on the get_fs()
>>> + */
>> If they should really override it but why write it here.
> 
> Mostly for documentation purposes, so that an architecture maintainer
> can copy the prototype. I see the asm-generic headers as both fallbacks
> for architectures and as templates of what should be implemented.
> 
>>> +#define get_user(x, ptr)					\
>>> +({								\
>>> +	might_sleep();						\
>>> +	__access_ok(ptr, sizeof (*ptr)) ?			\
>>> +		__get_user(x, ptr) :				\
>>> +		-EFAULT;					\
>>> +})
>> I am getting here (for put_user macro too) any error on noMMU. :-(
> 
> What kind of error do you see?

System is getting crazy with -> I am debugging it.


>  
>>> +static inline long
>>> +strncpy_from_user(char *dst, const char __user *src, long count)
>>> +{
>>> +	if (!__access_ok(src, 1))
>>> +		return -EFAULT;
>>> +	return __strncpy_from_user(dst, src, count);
>>> +}
>> Is it a good place to add might_sleep() and unlikely(+ some other cases) too?
>> We have almost the same code.
> 
> Yes, I think so. The unlikely() can probably go into __access_ok() though,
> so we don't have to write it every time.

ok

Michal


> 
> 	Arnd <><


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 00/27] more non-ABI asm-generic headers
  2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
                   ` (27 preceding siblings ...)
  2009-04-30 16:39 ` [PATCH 0/2] use generic headers in x86 Arnd Bergmann
@ 2009-05-03 11:17 ` Geert Uytterhoeven
  2009-05-04 14:32   ` Arnd Bergmann
  28 siblings, 1 reply; 83+ messages in thread
From: Geert Uytterhoeven @ 2009-05-03 11:17 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Thu, Apr 30, 2009 at 17:34, Arnd Bergmann <arnd@arndb.de> wrote:
> To avoid trouble with quilt mail, I'm now trying
> git-format-patch to generate them, hopefully this
> works a little better. Can anyone tell me why I can't
> add a 'To' header rather than just 'Cc' in
> git-format-patch?

I always specify the --to with git send-email.

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-01 13:13         ` [PATCH V3] asm-generic: add a generic uaccess.h Arnd Bergmann
  2009-05-01 13:47           ` Michal Simek
@ 2009-05-04  6:07           ` Michal Simek
  2009-05-04 10:32             ` Arnd Bergmann
  1 sibling, 1 reply; 83+ messages in thread
From: Michal Simek @ 2009-05-04  6:07 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

Arnd Bergmann wrote:
> This adds a new asm-generic/uaccess.h file that should be usable
> by both all NOMMU architectures out of the box. Architectures with
> an MMU should override the __access_ok(), __copy_from_user() and
> __copy_to_user definitions with their own functions to provide
> correct exception handling.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> 
> diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
> new file mode 100644
> index 0000000..deb1722
> --- /dev/null
> +++ b/include/asm-generic/uaccess.h
> @@ -0,0 +1,319 @@
> +#ifndef __ASM_GENERIC_UACCESS_H
> +#define __ASM_GENERIC_UACCESS_H
> +
> +/*
> + * User space memory access functions, these should work
> + * on a ny machine that has kernel and user data in the same
> + * address space, e.g. all NOMMU machines.
> + */
> +#include <linux/sched.h>
> +#include <linux/mm.h>
> +#include <linux/string.h>
> +
> +#include <asm/segment.h>
> +
> +#ifndef get_fs
> +#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
> +#define KERNEL_DS	MAKE_MM_SEG(~0UL)
> +#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
> +
> +#define get_ds() (KERNEL_DS)
> +#define get_fs() (current_thread_info()->addr_limit)
> +
> +static inline void set_fs(mm_segment_t fs)
> +{
> +	current_thread_info()->addr_limit = fs;
> +}
> +#endif

This part should be rewrite to this style.

#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })

#ifndef KERNEL_DS
#define KERNEL_DS	MAKE_MM_SEG(~0UL)
#endif

#ifndef USER_DS
#define USER_DS		MAKE_MM_SEG(TASK_SIZE - 1)
#endif


#ifndef get_fs
#define get_ds() (KERNEL_DS)
#define get_fs() (current_thread_info()->addr_limit)

static inline void set_fs(mm_segment_t fs)
{
	current_thread_info()->addr_limit = fs;
}
#endif

What do you think?


Michal






> +
> +#define segment_eq(a, b) ((a).seg == (b).seg)
> +
> +#define VERIFY_READ	0
> +#define VERIFY_WRITE	1
> +
> +#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
> +
> +/*
> + * The architecture should really override this if possible, at least
> + * doing a check on the get_fs()
> + */
> +#ifndef __access_ok
> +static inline int __access_ok(unsigned long addr, unsigned long size)
> +{
> +	return 1;
> +}
> +#endif
> +
> +/*
> + * The exception table consists of pairs of addresses: the first is the
> + * address of an instruction that is allowed to fault, and the second is
> + * the address at which the program should continue.  No registers are
> + * modified, so it is entirely up to the continuation code to figure out
> + * what to do.
> + *
> + * All the routines below use bits of fixup code that are out of line
> + * with the main instruction path.  This means when everything is well,
> + * we don't even have to jump over them.  Further, they do not intrude
> + * on our cache or tlb entries.
> + */
> +
> +struct exception_table_entry
> +{
> +	unsigned long insn, fixup;
> +};
> +
> +/* Returns 0 if exception not found and fixup otherwise.  */
> +extern unsigned long search_exception_table(unsigned long);
> +
> +/*
> + * architectures with an MMU should override these two
> + */
> +#ifndef __copy_from_user
> +static inline __must_check long __copy_from_user(void *to,
> +		const void __user * from, unsigned long n)
> +{
> +	if (__builtin_constant_p(n)) {
> +		switch(n) {
> +		case 1:
> +			*(u8 *)to = *(u8 __force *)from;
> +			return 0;
> +		case 2:
> +			*(u16 *)to = *(u16 __force *)from;
> +			return 0;
> +		case 4:
> +			*(u32 *)to = *(u32 __force *)from;
> +			return 0;
> +#ifdef CONFIG_64BIT
> +		case 8:
> +			*(u64 *)to = *(u64 __force *)from;
> +			return 0;
> +#endif
> +		default:
> +			break;
> +		}
> +	}
> +
> +	memcpy(to, (const void __force *)from, n);
> +	return 0;
> +}
> +#endif
> +
> +#ifndef __copy_to_user
> +static inline __must_check long __copy_to_user(void __user *to,
> +		const void *from, unsigned long n)
> +{
> +	if (__builtin_constant_p(n)) {
> +		switch(n) {
> +		case 1:
> +			*(u8 __force *)to = *(u8 *)from;
> +			return 0;
> +		case 2:
> +			*(u16 __force *)to = *(u16 *)from;
> +			return 0;
> +		case 4:
> +			*(u32 __force *)to = *(u32 *)from;
> +			return 0;
> +#ifdef CONFIG_64BIT
> +		case 8:
> +			*(u64 __force *)to = *(u64 *)from;
> +			return 0;
> +#endif
> +		default:
> +			break;
> +		}
> +	}
> +
> +	memcpy((void __force *)to, from, n);
> +	return 0;
> +}
> +#endif
> +
> +/*
> + * These are the main single-value transfer routines.  They automatically
> + * use the right size if we just have the right pointer type.
> + * This version just falls back to copy_{from,to}_user, which should
> + * provide a fast-path for small values. 
> + */
> +#define __put_user(x, ptr) \
> +({								\
> +	__typeof__(*(ptr)) __x = (x);				\
> +	int __pu_err = -EFAULT;					\
> +        __chk_user_ptr(ptr);					\
> +	switch (sizeof (*(ptr))) {				\
> +	case 1:							\
> +	case 2:							\
> +	case 4:							\
> +	case 8:							\
> +		__pu_err = __put_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		break;						\
> +	default:						\
> +		__put_user_bad();				\
> +		break;						\
> +	 }							\
> +	__pu_err;						\
> +})
> +
> +#define put_user(x, ptr)					\
> +({								\
> +	might_sleep();						\
> +	__access_ok(ptr, sizeof (*ptr)) ?			\
> +		__put_user(x, ptr) :				\
> +		-EFAULT;					\
> +})
> +
> +static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
> +{
> +	size = __copy_to_user(ptr, x, size);
> +	return size ? -EFAULT : size;
> +}
> +
> +extern int __put_user_bad(void) __attribute__((noreturn));
> +
> +#define __get_user(x, ptr)					\
> +({								\
> +	int __gu_err = -EFAULT;					\
> +	__chk_user_ptr(ptr);					\
> +	switch (sizeof(*(ptr))) {				\
> +	case 1: {						\
> +		unsigned char __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 2: {						\
> +		unsigned short __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 4: {						\
> +		unsigned int __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	case 8: {						\
> +		unsigned long long __x;				\
> +		__gu_err = __get_user_fn(sizeof (*(ptr)),	\
> +					 ptr, &__x);		\
> +		(x) = *(__force __typeof__(*(ptr)) *) &__x;	\
> +		break;						\
> +	};							\
> +	default:						\
> +		__get_user_bad();				\
> +		break;						\
> +	}							\
> +	__gu_err;						\
> +})
> +
> +#define get_user(x, ptr)					\
> +({								\
> +	might_sleep();						\
> +	__access_ok(ptr, sizeof (*ptr)) ?			\
> +		__get_user(x, ptr) :				\
> +		-EFAULT;					\
> +})
> +
> +static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
> +{
> +	size = __copy_from_user(x, ptr, size);
> +	return size ? -EFAULT : size;
> +}
> +
> +extern int __get_user_bad(void) __attribute__((noreturn));
> +
> +#ifndef __copy_from_user_inatomic
> +#define __copy_from_user_inatomic __copy_from_user
> +#endif
> +
> +#ifndef __copy_to_user_inatomic
> +#define __copy_to_user_inatomic __copy_to_user
> +#endif
> +
> +static inline long copy_from_user(void *to,
> +		const void __user * from, unsigned long n)
> +{
> +	might_sleep();
> +	if (__access_ok(from, n))
> +		return __copy_from_user(to, from, n);
> +	else
> +		return n;
> +}
> +
> +static inline long copy_to_user(void __user *to,
> +		const void *from, unsigned long n)
> +{
> +	might_sleep();
> +	if (__access_ok(to, n))
> +		return __copy_to_user(to, from, n);
> +	else
> +		return n;
> +}
> +
> +/*
> + * Copy a null terminated string from userspace.
> + */
> +#ifndef __strncpy_from_user
> +static inline long
> +__strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	char *tmp;
> +	strncpy(dst, (const char __force *)src, count);
> +	for (tmp = dst; *tmp && count > 0; tmp++, count--)
> +		;
> +	return (tmp - dst);
> +}
> +#endif
> +
> +static inline long
> +strncpy_from_user(char *dst, const char __user *src, long count)
> +{
> +	if (!__access_ok(src, 1))
> +		return -EFAULT;
> +	return __strncpy_from_user(dst, src, count);
> +}
> +
> +/*
> + * Return the size of a string (including the ending 0)
> + *
> + * Return 0 on exception, a value greater than N if too long
> + */
> +#ifndef strnlen_user
> +static inline long strnlen_user(const char __user *src, long n)
> +{
> +	return strlen((void * __force)src) + 1;
> +}
> +#endif
> +
> +static inline long strlen_user(const char __user *src)
> +{
> +	return strnlen_user(src, 32767);
> +}
> +
> +/*
> + * Zero Userspace
> + */
> +#ifndef __clear_user
> +static inline __must_check unsigned long
> +__clear_user(void __user *to, unsigned long n)
> +{
> +	memset((void __force *)to, 0, n);
> +	return 0;
> +}
> +#endif
> +
> +static inline __must_check unsigned long
> +clear_user(void __user *to, unsigned long n)
> +{
> +	might_sleep();
> +	if (!__access_ok(to, n))
> +		return n;
> +
> +	return __clear_user(to, n);
> +}
> +
> +#endif /* __ASM_GENERIC_UACCESS_H */


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 05/27] asm-generic: add generic io.h
  2008-11-06 13:38 ` [PATCH 05/27] asm-generic: add generic io.h Arnd Bergmann
@ 2009-05-04  7:07   ` Geert Uytterhoeven
  2009-05-04 10:48     ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: Geert Uytterhoeven @ 2009-05-04  7:07 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Thu, Nov 6, 2008 at 15:38, Arnd Bergmann <arnd@arndb.de> wrote:
> --- /dev/null
> +++ b/include/asm-generic/io.h

> +static inline void insb(unsigned long addr, void *buffer, int count)
> +{
> +       if (count) {
> +               u8 *buf = buffer;
> +               do {
> +                       u8 x = inb(addr);
> +                       *buf++ = x;
> +               } while (--count);
> +       }
> +}
> +
> +static inline void insw(unsigned long addr, void *buffer, int count)
> +{
> +       if (count) {
> +               u16 *buf = buffer;
> +               do {
> +                       u16 x = inw(addr);
> +                       *buf++ = x;
> +               } while (--count);
> +       }
> +}
> +
> +static inline void insl(unsigned long addr, void *buffer, int count)
> +{
> +       if (count) {
> +               u32 *buf = buffer;
> +               do {
> +                       u32 x = inl(addr);
> +                       *buf++ = x;
> +               } while (--count);
> +       }
> +}
> +
> +static inline void outsb(unsigned long addr, const void *buffer, int count)
> +{
> +       if (count) {
> +               const u8 *buf = buffer;
> +               do {
> +                       outb(*buf++, addr);
> +               } while (--count);
> +       }
> +}
> +
> +static inline void outsw(unsigned long addr, const void *buffer, int count)
> +{
> +       if (count) {
> +               const u16 *buf = buffer;
> +               do {
> +                       outw(*buf++, addr);
> +               } while (--count);
> +       }
> +}
> +
> +static inline void outsl(unsigned long addr, const void *buffer, int count)
> +{
> +       if (count) {
> +               const u32 *buf = buffer;
> +               do {
> +                       outl(*buf++, addr);
> +               } while (--count);
> +       }
> +}

Do we ever call these with count == 0?

> +/*
> + * Change "struct page" to physical address.
> + */

Which `struct page'?

> +static inline void *__ioremap(unsigned long offset, unsigned long size,
> +                             unsigned long flags)
> +{
> +       return (void *) offset;
> +}
> +
> +static inline void *ioremap(unsigned long offset, unsigned long size)
> +{
> +       return (void *) offset;
> +}

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 11/27] asm-generic: add generic page.h
  2009-04-29 14:55 ` [PATCH 11/27] asm-generic: add generic page.h Arnd Bergmann
@ 2009-05-04  7:11   ` Geert Uytterhoeven
  0 siblings, 0 replies; 83+ messages in thread
From: Geert Uytterhoeven @ 2009-05-04  7:11 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Wed, Apr 29, 2009 at 16:55, Arnd Bergmann <arnd@arndb.de> wrote:
> Architectures that have no mmu should not have to
> describe their page tables. This adds a new page.h
> file based on the existing nommu architectures
> that adds a lot of dummy definitions to let you
> correctly compile a nommu kernel.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  include/asm-generic/page.h |   99 ++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 99 insertions(+), 0 deletions(-)
>  create mode 100644 include/asm-generic/page.h
>
> diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
> new file mode 100644
> index 0000000..75fec18
> --- /dev/null
> +++ b/include/asm-generic/page.h
> @@ -0,0 +1,99 @@
> +#ifndef __ASM_GENERIC_PAGE_H
> +#define __ASM_GENERIC_PAGE_H
> +/*
> + * Generic page.h implementation, for NOMMU architectures.
> + * This provides the dummy definitions for the memory management.
> + */
> +
> +#ifdef CONFIG_MMU
> +#error need to prove a real asm/page.h
> +#endif
> +
> +
> +/* PAGE_SHIFT determines the page size */
> +
> +#define PAGE_SHIFT     12
> +#ifdef __ASSEMBLY__
> +#define PAGE_SIZE      (1 << PAGE_SHIFT)
> +#else
> +#define PAGE_SIZE      (1UL << PAGE_SHIFT)
> +#endif

#include <linux/const.h> and use (_AC(1, UL) << PAGE_SHIFT)

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 12/27] asm-generic: add a NOMMU uaccess.h
  2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
                     ` (2 preceding siblings ...)
       [not found]   ` <c1a198be0904302337x714621d8xc4685a634c5cf222@mail.gmail.com>
@ 2009-05-04  7:24   ` Geert Uytterhoeven
  3 siblings, 0 replies; 83+ messages in thread
From: Geert Uytterhoeven @ 2009-05-04  7:24 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Thu, Nov 6, 2008 at 17:31, Arnd Bergmann <arnd@arndb.de> wrote:
> index 549cb3a..ebeacd9 100644
> --- a/include/asm-generic/uaccess.h
> +++ b/include/asm-generic/uaccess.h

> +/*
> + * User space memory access functions, these should work
> + * on a ny machine that has kernel and user data in the same
         any

> + * address space, e.g. all NOMMU machines.
> + */

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH V3] asm-generic: add a generic uaccess.h
  2009-05-04  6:07           ` Michal Simek
@ 2009-05-04 10:32             ` Arnd Bergmann
  0 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-04 10:32 UTC (permalink / raw)
  To: monstr; +Cc: linux-arch, Remis Lima Baima, linux-kernel, Russell King

On Monday 04 May 2009, Michal Simek wrote:
> #define MAKE_MM_SEG(s)  ((mm_segment_t) { (s) })
> 
> #ifndef KERNEL_DS
> #define KERNEL_DS       MAKE_MM_SEG(~0UL)
> #endif
> 
> #ifndef USER_DS
> #define USER_DS         MAKE_MM_SEG(TASK_SIZE - 1)
> #endif
> 
> 
> #ifndef get_fs
> #define get_ds() (KERNEL_DS)
> #define get_fs() (current_thread_info()->addr_limit)
> 
> static inline void set_fs(mm_segment_t fs)
> {
>         current_thread_info()->addr_limit = fs;
> }
> #endif
> 

yes, looks good. Thanks for the suggestion.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 05/27] asm-generic: add generic io.h
  2009-05-04  7:07   ` Geert Uytterhoeven
@ 2009-05-04 10:48     ` Arnd Bergmann
  0 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-04 10:48 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel,
	David Howells

io.h is more or less a straight copy from the mn10300 code,
so maybe David Howells is interested in this as well.

On Monday 04 May 2009, Geert Uytterhoeven wrote:
> On Thu, Nov 6, 2008 at 15:38, Arnd Bergmann <arnd@arndb.de> wrote:
> > +static inline void outsw(unsigned long addr, const void *buffer, int count)
> > +{
> > +       if (count) {
> > +               const u16 *buf = buffer;
> > +               do {
> > +                       outw(*buf++, addr);
> > +               } while (--count);
> > +       }
> > +}
> > +
> > +static inline void outsl(unsigned long addr, const void *buffer, int count)
> > +{
> > +       if (count) {
> > +               const u32 *buf = buffer;
> > +               do {
> > +                       outl(*buf++, addr);
> > +               } while (--count);
> > +       }
> > +}
> 
> Do we ever call these with count == 0?

I don't think it can, but code is still more correct if it can handle it.
It could of course be written as

	const u32 *buf;
	for (buf = buffer; count; count--)
		outl(*buf++, addr);


> > +/*
> > + * Change "struct page" to physical address.
> > + */
> 
> Which `struct page'?

I can change the comment to what avr32 and m32r have:

arch/avr32/include/asm/io.h-/*
arch/avr32/include/asm/io.h: * ioremap  -   map bus memory into CPU space
arch/avr32/include/asm/io.h- * @offset  bus address of the memory
arch/avr32/include/asm/io.h- * @size    size of the resource to map
arch/avr32/include/asm/io.h- *
arch/avr32/include/asm/io.h: * ioremap performs a platform specific sequence of operations to make
arch/avr32/include/asm/io.h- * bus memory CPU accessible via the readb/.../writel functions and
arch/avr32/include/asm/io.h- * the other mmio helpers. The returned address is not guaranteed to
arch/avr32/include/asm/io.h- * be usable directly as a virtual address.
arch/avr32/include/asm/io.h- */


	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 00/27] more non-ABI asm-generic headers
  2009-05-03 11:17 ` [PATCH 00/27] more non-ABI asm-generic headers Geert Uytterhoeven
@ 2009-05-04 14:32   ` Arnd Bergmann
  2009-05-08 14:04     ` Geert Uytterhoeven
  0 siblings, 1 reply; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-04 14:32 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Sunday 03 May 2009, Geert Uytterhoeven wrote:
> On Thu, Apr 30, 2009 at 17:34, Arnd Bergmann <arnd@arndb.de> wrote:
> > To avoid trouble with quilt mail, I'm now trying
> > git-format-patch to generate them, hopefully this
> > works a little better. Can anyone tell me why I can't
> > add a 'To' header rather than just 'Cc' in
> > git-format-patch?
> 
> I always specify the --to with git send-email.

I haven't tried using git send-email yet, because it does not let
me inspect mails after changing the headers but before sending
them out.

I have now gone back to my old method of

rm -rf patches
mkdir -p patches
git-format-patch -o patches | cut -f 2- -d/ > patches/series
quilt mail --mbox ~/Mail/outbox
#manually edit outbox if necessary, then hit send button in mail client.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 00/27] more non-ABI asm-generic headers
  2009-05-04 14:32   ` Arnd Bergmann
@ 2009-05-08 14:04     ` Geert Uytterhoeven
  2009-05-14 11:59       ` Arnd Bergmann
  0 siblings, 1 reply; 83+ messages in thread
From: Geert Uytterhoeven @ 2009-05-08 14:04 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Mon, May 4, 2009 at 16:32, Arnd Bergmann <arnd@arndb.de> wrote:
> On Sunday 03 May 2009, Geert Uytterhoeven wrote:
>> On Thu, Apr 30, 2009 at 17:34, Arnd Bergmann <arnd@arndb.de> wrote:
>> > To avoid trouble with quilt mail, I'm now trying
>> > git-format-patch to generate them, hopefully this
>> > works a little better. Can anyone tell me why I can't
>> > add a 'To' header rather than just 'Cc' in
>> > git-format-patch?
>>
>> I always specify the --to with git send-email.
>
> I haven't tried using git send-email yet, because it does not let
> me inspect mails after changing the headers but before sending
> them out.

The --dry-run option is not sufficient for you?

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH 00/27] more non-ABI asm-generic headers
  2009-05-08 14:04     ` Geert Uytterhoeven
@ 2009-05-14 11:59       ` Arnd Bergmann
  0 siblings, 0 replies; 83+ messages in thread
From: Arnd Bergmann @ 2009-05-14 11:59 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: linux-arch, Michal Simek, Remis Lima Baima, linux-kernel

On Friday 08 May 2009, Geert Uytterhoeven wrote:
> On Mon, May 4, 2009 at 16:32, Arnd Bergmann <arnd@arndb.de> wrote:
> > I haven't tried using git send-email yet, because it does not let
> > me inspect mails after changing the headers but before sending
> > them out.
> 
> The --dry-run option is not sufficient for you?

I've now started using git-send-email after yet another screwup
with quilt+kmail. I now played around using '--suppress-cc all' sending
patches to myself and fixed the problems I found there, which gave
me enough confidence in the general procedure.

	Arnd <><

^ permalink raw reply	[flat|nested] 83+ messages in thread

end of thread, other threads:[~2009-05-14 12:00 UTC | newest]

Thread overview: 83+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-30 15:34 [PATCH 00/27] more non-ABI asm-generic headers Arnd Bergmann
2008-11-06 12:08 ` [PATCH 01/27] asm-generic: rename atomic.h to atomic-long.h Arnd Bergmann
2009-04-30 16:06   ` Ingo Molnar
2008-11-06 12:24 ` [PATCH 03/27] asm-generic: make pci.h usable directly Arnd Bergmann
2008-11-06 13:16 ` [PATCH 04/27] asm-generic: add legacy I/O header files Arnd Bergmann
     [not found]   ` <c1a198be0904302309w4154f97dqddd0b2df1924a821@mail.gmail.com>
2009-05-01 12:22     ` Arnd Bergmann
2009-05-01 12:25       ` Michal Simek
2009-05-01 12:37         ` Russell King
2009-05-01 12:53           ` Arnd Bergmann
2009-05-01 13:14             ` Alan Cox
2009-05-01 13:20               ` Arnd Bergmann
2009-05-01 13:20                 ` Arnd Bergmann
2009-05-01 13:40                 ` Alan Cox
2009-05-01 13:09           ` Alan Cox
2009-05-01 13:29             ` Arnd Bergmann
2009-05-01 13:44               ` Alan Cox
2009-05-01 13:56                 ` Arnd Bergmann
2009-05-01 14:03                   ` Alan Cox
2009-05-01 14:07                     ` Arnd Bergmann
2009-05-01 12:36       ` Russell King
2008-11-06 13:38 ` [PATCH 05/27] asm-generic: add generic io.h Arnd Bergmann
2009-05-04  7:07   ` Geert Uytterhoeven
2009-05-04 10:48     ` Arnd Bergmann
2008-11-06 13:40 ` [PATCH 07/27] asm-generic: add minimal cache description Arnd Bergmann
     [not found]   ` <c1a198be0904302303h73c5168fi73f8dc24dc677965@mail.gmail.com>
2009-05-01 12:27     ` Arnd Bergmann
2009-05-01 12:52       ` Michal Simek
2008-11-06 15:10 ` [PATCH 09/27] asm-generic: add generic NOMMU versions of some headers Arnd Bergmann
2008-11-06 15:26 ` [PATCH 10/27] asm-generic: rename page.h to getorder.h Arnd Bergmann
2008-11-06 15:31 ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Arnd Bergmann
2009-05-01 10:07   ` Michal Simek
2009-05-01 10:22   ` Russell King
     [not found]   ` <c1a198be0904302337x714621d8xc4685a634c5cf222@mail.gmail.com>
2009-05-01 12:36     ` Arnd Bergmann
2009-05-01 12:38       ` Michal Simek
2009-05-01 12:38         ` Michal Simek
2009-05-01 13:13         ` [PATCH V3] asm-generic: add a generic uaccess.h Arnd Bergmann
2009-05-01 13:47           ` Michal Simek
2009-05-01 14:06             ` Arnd Bergmann
2009-05-01 14:11               ` Michal Simek
2009-05-04  6:07           ` Michal Simek
2009-05-04 10:32             ` Arnd Bergmann
2009-05-04  7:24   ` [PATCH 12/27] asm-generic: add a NOMMU uaccess.h Geert Uytterhoeven
2008-11-07 20:43 ` [PATCH 14/27] asm-generic: make bitops.h usable Arnd Bergmann
2008-11-08 10:37 ` [PATCH 15/27] asm-generic: Add missing generic tlb_flush definition Arnd Bergmann
2009-03-31 13:30 ` [PATCH 17/27] add generic lib/checksum.c Arnd Bergmann
2009-04-30 22:35   ` Jan-Benedict Glaw
2009-04-30 22:35     ` Jan-Benedict Glaw
2009-05-01  9:14     ` Arnd Bergmann
2009-05-01  9:20   ` Russell King
2009-05-01  9:23     ` Michal Simek
2009-05-01  9:35     ` Arnd Bergmann
2009-05-01  9:37       ` Michal Simek
2009-04-01 12:35 ` [PATCH 19/27] microblaze: make syscall_table implementation generic Arnd Bergmann
2009-04-14 13:12 ` [PATCH 20/27] microblaze: use the generic lib/checksum.c Remis Lima Baima
2009-04-15 13:00 ` [PATCH 23/27] microblaze: convert all simple headers to use asm-generic Remis Lima Baima
2009-04-15 15:28 ` [PATCH 22/27] microblaze: don't include asm/mmu.h in hw_exception_handler Arnd Bergmann
2009-04-20 11:53 ` [PATCH 25/27] microblaze: use generic uaccess.h Remis Lima Baima
2009-04-27 11:04 ` [PATCH 06/27] asm-generic: clean up asm-generic/io.h Remis Lima Baima
2009-04-27 11:10 ` [PATCH 26/27] microblaze: make io.h use asm-generic/io.h Remis Lima Baima
2009-04-27 12:42 ` [PATCH 27/27] microblaze: use generic system.h Remis Lima Baima
2009-04-27 15:18 ` [PATCH 21/27] microblaze: use generic swab.h Arnd Bergmann
2009-04-27 15:34 ` [PATCH 16/27] asm-generic: introduce generic syscalls.h Arnd Bergmann
2009-04-27 15:38 ` [PATCH 24/27] microblaze: use generic dma-mapping.h Arnd Bergmann
2009-04-28 14:15 ` [PATCH 08/27] asm-generic: add generic versions of common headers Arnd Bergmann
2009-04-30 16:41   ` David Miller
2009-04-30 16:49     ` Arnd Bergmann
2009-04-30 16:51       ` David Miller
2009-04-30 17:07         ` Arnd Bergmann
2009-04-30 17:12           ` David Miller
2009-04-30 17:34             ` Arnd Bergmann
2009-04-30 17:39               ` David Miller
2009-04-30 18:01       ` Sam Ravnborg
2009-04-29 13:33 ` [PATCH 13/27] asm-generic: make uaccess.h usable by mmu archs Arnd Bergmann
2009-04-29 14:25 ` [PATCH 18/27] microblaze: use generic syscalls.h Arnd Bergmann
2009-04-29 14:51 ` [PATCH 02/27] asm-generic: add generic atomic.h Arnd Bergmann
2009-04-29 14:55 ` [PATCH 11/27] asm-generic: add generic page.h Arnd Bergmann
2009-05-04  7:11   ` Geert Uytterhoeven
2009-04-30 16:39 ` [PATCH 0/2] use generic headers in x86 Arnd Bergmann
2009-04-30 16:40   ` [PATCH 1/2] x86: two small fixes in termios.h Arnd Bergmann
2009-04-30 16:42   ` [PATCH 2/2] x86: adapt simple headers to use generic headers Arnd Bergmann
2009-05-03 11:17 ` [PATCH 00/27] more non-ABI asm-generic headers Geert Uytterhoeven
2009-05-04 14:32   ` Arnd Bergmann
2009-05-08 14:04     ` Geert Uytterhoeven
2009-05-14 11:59       ` Arnd Bergmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox