Skip to content

Commit

Permalink
Merge branch 'sparc_sparse_fixes'
Browse files Browse the repository at this point in the history
Sam Ravnborg says:

====================
sparc sparse fixes + diverse cleanup

v1 => v2
- audit of all patches. I deliberately waited a while
  before doing so - in order to look at them with fresh eyes.
- Fix bogus sbus() use found by davem in iommu.c
- Split patch touching iommu.c and io-unit.c in two
- Fix bogus sbus use in time_32 (sbus_readw => sbus_readl)
- Dropped patch that touches signal_64.c
  __put_user() does many magic things and I could not convince
  myself that dropping a cast of a pointer to (u64) was correct.
- Updated a few changelogs to be more precise/descriptive
- In systbls.h rearrange include and move include to the common part
- Updated cover letter (this mail)

Fix build breakage of sparc32 in certain configurations

Fix sparse warnings in sparc32.
  What is remaining:
  - "shift too big" warnings in the soft floating point code.
    This is too complex - so I dropped trying to fix these

Fix sparse warnings in sparc64.
  What is remaining:
  - "shift too big" warnings in the soft floating point code (like sparc32)
  - pcr.c defines arch_irq_work_raise() which is also defined as __weak in common code.
    As I recall there are some issues with weak functions with prototypes
    so it is left as-is
  - signal32.c issue a lot of "cast removes address space of expression"
    This actually deserve an extra look - as I think this may be
    some code that mixes two sizes to __put_user()
  - viohs.c uses a variable length array
  - init_64.c reference vmemmap_free which is properly declared in common code
    but seems to be guarded by wrong ifdefs
  - signal_64.c mix with __user pointers and wrong casts

None of the remaining sparse warnings looks simple to fix - and any
hints how to proceed are appreciated.

A lot of the sparse warnings are fixed by addding or moving function
prototypes to common files. Many prototypes are for functions
solely called from assembler so they are added only to shut up sparse.
But there is also a lot of prototypes that had local declarations
which are now visible both in the file where the function
is defined and in the file where the function is used.

Change all prototypes in sparc .h files so they do not use extern.
This change touches a lot of files.

Fix so we no longer assumes _NIG_WORDS can have more than one value,
and add a build time check to catch if the value changes anyway.

**The following patches require extra careful review:**

[PATCH 07/34] sparc32: fix sparse warnings in sys_sparc_32.c
  The return type of a few syscalls has been changed for sparc32,
  to align with sparc64.
  I assume this is safe to do.

[PATCH 08/34] sparc32: remove cast from output constraints in math asm statements
[PATCH 09/34] sparc64: remove cast from output constraints in math asm statements
  I have not much experience with gcc inline
  assembler - so please check that this looks OK.
  A cast in the output section of the inline
  assembler is dropped - which should be OK.

[PATCH 23/34] sparc64: clean up compat_sigset_t.seta handling
  This drops code that assumed _NSIG_WORDS could change.
  But as _NIG_WORDS are always constant drop this code.

[PATCH 34/34] sparc64: fix sparse warnings in int_64.c
  Introduces some ugly ifdef in the code.
  Was not sure if there was a smarter way to do this.
  It looked like some code was executed in the
  !CONFIG_NEED_MULTIPLE_NODES case which is not required.
  For now the simple solution with ifdef was used.

**The following patches touches files outside arch/sparc:**

[PATCH 24/34] sparc64: fix sparse warning in tsb.c
  Touches kernel/sysctl.c - removes a few sparc64 specific lines

[PATCH 27/34] sparc: fix sparse warnings in smp_32.c + smp_64.c
  Adds prototype for setup_profiling_timer to include/linux/profile.h.
  I could not find any obvious candidates to cc: on this patch
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed May 19, 2014
2 parents bf65699 + 48d3721 commit 311b893
Show file tree
Hide file tree
Showing 133 changed files with 1,314 additions and 1,342 deletions.
6 changes: 3 additions & 3 deletions arch/sparc/crypto/aes_glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ extern void aes_sparc64_ctr_crypt_256(const u64 *key, const u64 *input,
u64 *output, unsigned int len,
u64 *iv);

struct aes_ops aes128_ops = {
static struct aes_ops aes128_ops = {
.encrypt = aes_sparc64_encrypt_128,
.decrypt = aes_sparc64_decrypt_128,
.load_encrypt_keys = aes_sparc64_load_encrypt_keys_128,
Expand All @@ -136,7 +136,7 @@ struct aes_ops aes128_ops = {
.ctr_crypt = aes_sparc64_ctr_crypt_128,
};

struct aes_ops aes192_ops = {
static struct aes_ops aes192_ops = {
.encrypt = aes_sparc64_encrypt_192,
.decrypt = aes_sparc64_decrypt_192,
.load_encrypt_keys = aes_sparc64_load_encrypt_keys_192,
Expand All @@ -148,7 +148,7 @@ struct aes_ops aes192_ops = {
.ctr_crypt = aes_sparc64_ctr_crypt_192,
};

struct aes_ops aes256_ops = {
static struct aes_ops aes256_ops = {
.encrypt = aes_sparc64_encrypt_256,
.decrypt = aes_sparc64_decrypt_256,
.load_encrypt_keys = aes_sparc64_load_encrypt_keys_256,
Expand Down
8 changes: 4 additions & 4 deletions arch/sparc/include/asm/atomic_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@

#define ATOMIC_INIT(i) { (i) }

extern int __atomic_add_return(int, atomic_t *);
extern int atomic_cmpxchg(atomic_t *, int, int);
int __atomic_add_return(int, atomic_t *);
int atomic_cmpxchg(atomic_t *, int, int);
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
extern int __atomic_add_unless(atomic_t *, int, int);
extern void atomic_set(atomic_t *, int);
int __atomic_add_unless(atomic_t *, int, int);
void atomic_set(atomic_t *, int);

#define atomic_read(v) (*(volatile int *)&(v)->counter)

Expand Down
18 changes: 9 additions & 9 deletions arch/sparc/include/asm/atomic_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
#define atomic_set(v, i) (((v)->counter) = i)
#define atomic64_set(v, i) (((v)->counter) = i)

extern void atomic_add(int, atomic_t *);
extern void atomic64_add(long, atomic64_t *);
extern void atomic_sub(int, atomic_t *);
extern void atomic64_sub(long, atomic64_t *);
void atomic_add(int, atomic_t *);
void atomic64_add(long, atomic64_t *);
void atomic_sub(int, atomic_t *);
void atomic64_sub(long, atomic64_t *);

extern int atomic_add_ret(int, atomic_t *);
extern long atomic64_add_ret(long, atomic64_t *);
extern int atomic_sub_ret(int, atomic_t *);
extern long atomic64_sub_ret(long, atomic64_t *);
int atomic_add_ret(int, atomic_t *);
long atomic64_add_ret(long, atomic64_t *);
int atomic_sub_ret(int, atomic_t *);
long atomic64_sub_ret(long, atomic64_t *);

#define atomic_dec_return(v) atomic_sub_ret(1, v)
#define atomic64_dec_return(v) atomic64_sub_ret(1, v)
Expand Down Expand Up @@ -106,7 +106,7 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u)

#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)

extern long atomic64_dec_if_positive(atomic64_t *v);
long atomic64_dec_if_positive(atomic64_t *v);

/* Atomic operations are already serializing */
#define smp_mb__before_atomic_dec() barrier()
Expand Down
6 changes: 3 additions & 3 deletions arch/sparc/include/asm/auxio_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
* NOTE: these routines are implementation dependent--
* understand the hardware you are querying!
*/
extern void set_auxio(unsigned char bits_on, unsigned char bits_off);
extern unsigned char get_auxio(void); /* .../asm/floppy.h */
void set_auxio(unsigned char bits_on, unsigned char bits_off);
unsigned char get_auxio(void); /* .../asm/floppy.h */

/*
* The following routines are provided for driver-compatibility
Expand Down Expand Up @@ -78,7 +78,7 @@ do { \


/* AUXIO2 (Power Off Control) */
extern __volatile__ unsigned char * auxio_power_register;
extern volatile u8 __iomem *auxio_power_register;

#define AUXIO_POWER_DETECT_FAILURE 32
#define AUXIO_POWER_CLEAR_FAILURE 2
Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/include/asm/auxio_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
*
* on - AUXIO_LTE_ON or AUXIO_LTE_OFF
*/
extern void auxio_set_lte(int on);
void auxio_set_lte(int on);

#define AUXIO_LED_ON 1
#define AUXIO_LED_OFF 0
Expand All @@ -91,7 +91,7 @@ extern void auxio_set_lte(int on);
*
* on - AUXIO_LED_ON or AUXIO_LED_OFF
*/
extern void auxio_set_led(int on);
void auxio_set_led(int on);

#endif /* ifndef __ASSEMBLY__ */

Expand Down
6 changes: 3 additions & 3 deletions arch/sparc/include/asm/bitext.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ struct bit_map {
int num_colors;
};

extern int bit_map_string_get(struct bit_map *t, int len, int align);
extern void bit_map_clear(struct bit_map *t, int offset, int len);
extern void bit_map_init(struct bit_map *t, unsigned long *map, int size);
int bit_map_string_get(struct bit_map *t, int len, int align);
void bit_map_clear(struct bit_map *t, int offset, int len);
void bit_map_init(struct bit_map *t, unsigned long *map, int size);

#endif /* defined(_SPARC_BITEXT_H) */
6 changes: 3 additions & 3 deletions arch/sparc/include/asm/bitops_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
#error only <linux/bitops.h> can be included directly
#endif

extern unsigned long ___set_bit(unsigned long *addr, unsigned long mask);
extern unsigned long ___clear_bit(unsigned long *addr, unsigned long mask);
extern unsigned long ___change_bit(unsigned long *addr, unsigned long mask);
unsigned long ___set_bit(unsigned long *addr, unsigned long mask);
unsigned long ___clear_bit(unsigned long *addr, unsigned long mask);
unsigned long ___change_bit(unsigned long *addr, unsigned long mask);

/*
* Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0'
Expand Down
24 changes: 12 additions & 12 deletions arch/sparc/include/asm/bitops_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
#include <linux/compiler.h>
#include <asm/byteorder.h>

extern int test_and_set_bit(unsigned long nr, volatile unsigned long *addr);
extern int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr);
extern int test_and_change_bit(unsigned long nr, volatile unsigned long *addr);
extern void set_bit(unsigned long nr, volatile unsigned long *addr);
extern void clear_bit(unsigned long nr, volatile unsigned long *addr);
extern void change_bit(unsigned long nr, volatile unsigned long *addr);
int test_and_set_bit(unsigned long nr, volatile unsigned long *addr);
int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr);
int test_and_change_bit(unsigned long nr, volatile unsigned long *addr);
void set_bit(unsigned long nr, volatile unsigned long *addr);
void clear_bit(unsigned long nr, volatile unsigned long *addr);
void change_bit(unsigned long nr, volatile unsigned long *addr);

#include <asm-generic/bitops/non-atomic.h>

Expand All @@ -32,8 +32,8 @@ extern void change_bit(unsigned long nr, volatile unsigned long *addr);

#ifdef __KERNEL__

extern int ffs(int x);
extern unsigned long __ffs(unsigned long);
int ffs(int x);
unsigned long __ffs(unsigned long);

#include <asm-generic/bitops/ffz.h>
#include <asm-generic/bitops/sched.h>
Expand All @@ -43,10 +43,10 @@ extern unsigned long __ffs(unsigned long);
* of bits set) of a N-bit word
*/

extern unsigned long __arch_hweight64(__u64 w);
extern unsigned int __arch_hweight32(unsigned int w);
extern unsigned int __arch_hweight16(unsigned int w);
extern unsigned int __arch_hweight8(unsigned int w);
unsigned long __arch_hweight64(__u64 w);
unsigned int __arch_hweight32(unsigned int w);
unsigned int __arch_hweight16(unsigned int w);
unsigned int __arch_hweight8(unsigned int w);

#include <asm-generic/bitops/const_hweight.h>
#include <asm-generic/bitops/lock.h>
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/include/asm/btext.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifndef _SPARC_BTEXT_H
#define _SPARC_BTEXT_H

extern int btext_find_display(void);
int btext_find_display(void);

#endif /* _SPARC_BTEXT_H */
2 changes: 1 addition & 1 deletion arch/sparc/include/asm/bug.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <linux/compiler.h>

#ifdef CONFIG_DEBUG_BUGVERBOSE
extern void do_BUG(const char *file, int line);
void do_BUG(const char *file, int line);
#define BUG() do { \
do_BUG(__FILE__, __LINE__); \
__builtin_trap(); \
Expand Down
8 changes: 4 additions & 4 deletions arch/sparc/include/asm/cacheflush_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
#define flush_page_for_dma(addr) \
sparc32_cachetlb_ops->page_for_dma(addr)

extern void sparc_flush_page_to_ram(struct page *page);
void sparc_flush_page_to_ram(struct page *page);

#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
#define flush_dcache_page(page) sparc_flush_page_to_ram(page)
Expand All @@ -51,8 +51,8 @@ extern void sparc_flush_page_to_ram(struct page *page);
* way the windows are all clean for the next process and the stack
* frames are up to date.
*/
extern void flush_user_windows(void);
extern void kill_user_windows(void);
extern void flushw_all(void);
void flush_user_windows(void);
void kill_user_windows(void);
void flushw_all(void);

#endif /* _SPARC_CACHEFLUSH_H */
24 changes: 12 additions & 12 deletions arch/sparc/include/asm/cacheflush_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
/* Cache flush operations. */
#define flushw_all() __asm__ __volatile__("flushw")

extern void __flushw_user(void);
void __flushw_user(void);
#define flushw_user() __flushw_user()

#define flush_user_windows flushw_user
Expand All @@ -30,29 +30,29 @@ extern void __flushw_user(void);
* use block commit stores (which invalidate icache lines) during
* module load, so we need this.
*/
extern void flush_icache_range(unsigned long start, unsigned long end);
extern void __flush_icache_page(unsigned long);
void flush_icache_range(unsigned long start, unsigned long end);
void __flush_icache_page(unsigned long);

extern void __flush_dcache_page(void *addr, int flush_icache);
extern void flush_dcache_page_impl(struct page *page);
void __flush_dcache_page(void *addr, int flush_icache);
void flush_dcache_page_impl(struct page *page);
#ifdef CONFIG_SMP
extern void smp_flush_dcache_page_impl(struct page *page, int cpu);
extern void flush_dcache_page_all(struct mm_struct *mm, struct page *page);
void smp_flush_dcache_page_impl(struct page *page, int cpu);
void flush_dcache_page_all(struct mm_struct *mm, struct page *page);
#else
#define smp_flush_dcache_page_impl(page,cpu) flush_dcache_page_impl(page)
#define flush_dcache_page_all(mm,page) flush_dcache_page_impl(page)
#endif

extern void __flush_dcache_range(unsigned long start, unsigned long end);
void __flush_dcache_range(unsigned long start, unsigned long end);
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
extern void flush_dcache_page(struct page *page);
void flush_dcache_page(struct page *page);

#define flush_icache_page(vma, pg) do { } while(0)
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)

extern void flush_ptrace_access(struct vm_area_struct *, struct page *,
unsigned long uaddr, void *kaddr,
unsigned long len, int write);
void flush_ptrace_access(struct vm_area_struct *, struct page *,
unsigned long uaddr, void *kaddr,
unsigned long len, int write);

#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
do { \
Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/include/asm/checksum_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
*
* it's best to have buff aligned on a 32-bit boundary
*/
extern __wsum csum_partial(const void *buff, int len, __wsum sum);
__wsum csum_partial(const void *buff, int len, __wsum sum);

/* the same as csum_partial, but copies from fs:src while it
* checksums
Expand All @@ -38,7 +38,7 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);
* better 64-bit) boundary
*/

extern unsigned int __csum_partial_copy_sparc_generic (const unsigned char *, unsigned char *);
unsigned int __csum_partial_copy_sparc_generic (const unsigned char *, unsigned char *);

static inline __wsum
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
Expand Down
32 changes: 16 additions & 16 deletions arch/sparc/include/asm/checksum_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,20 @@
*
* it's best to have buff aligned on a 32-bit boundary
*/
extern __wsum csum_partial(const void * buff, int len, __wsum sum);
__wsum csum_partial(const void * buff, int len, __wsum sum);

/* the same as csum_partial, but copies from user space 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_nocheck(const void *src, void *dst,
int len, __wsum sum);
__wsum csum_partial_copy_nocheck(const void *src, void *dst,
int len, __wsum sum);

extern long __csum_partial_copy_from_user(const void __user *src,
void *dst, int len,
__wsum sum);
long __csum_partial_copy_from_user(const void __user *src,
void *dst, int len,
__wsum sum);

static inline __wsum
csum_partial_copy_from_user(const void __user *src,
Expand All @@ -59,9 +59,9 @@ csum_partial_copy_from_user(const void __user *src,
* Copy and checksum to user
*/
#define HAVE_CSUM_COPY_USER
extern long __csum_partial_copy_to_user(const void *src,
void __user *dst, int len,
__wsum sum);
long __csum_partial_copy_to_user(const void *src,
void __user *dst, int len,
__wsum sum);

static inline __wsum
csum_and_copy_to_user(const void *src,
Expand All @@ -77,7 +77,7 @@ csum_and_copy_to_user(const void *src,
/* ihl is always 5 or greater, almost always is 5, and iph is word aligned
* the majority of the time.
*/
extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
__sum16 ip_fast_csum(const void *iph, unsigned int ihl);

/* Fold a partial checksum without adding pseudo headers. */
static inline __sum16 csum_fold(__wsum sum)
Expand All @@ -96,9 +96,9 @@ static inline __sum16 csum_fold(__wsum sum)
}

static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
unsigned int len,
unsigned short proto,
__wsum sum)
unsigned int len,
unsigned short proto,
__wsum sum)
{
__asm__ __volatile__(
" addcc %1, %0, %0\n"
Expand All @@ -116,9 +116,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
* returns a 16-bit checksum, already complemented
*/
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
unsigned short len,
unsigned short proto,
__wsum sum)
unsigned short len,
unsigned short proto,
__wsum sum)
{
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}
Expand Down
6 changes: 3 additions & 3 deletions arch/sparc/include/asm/cmpxchg_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ static inline unsigned long xchg_u32(__volatile__ unsigned long *m, unsigned lon
return val;
}

extern void __xchg_called_with_bad_pointer(void);
void __xchg_called_with_bad_pointer(void);

static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int size)
{
Expand All @@ -45,9 +45,9 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int
#define __HAVE_ARCH_CMPXCHG 1

/* bug catcher for when unsupported size is used - won't link */
extern void __cmpxchg_called_with_bad_pointer(void);
void __cmpxchg_called_with_bad_pointer(void);
/* we only need to support cmpxchg of a u32 on sparc */
extern unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_);
unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_);

/* don't worry...optimizer will get rid of most of this */
static inline unsigned long
Expand Down
Loading

0 comments on commit 311b893

Please sign in to comment.