Merge branch 'for-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k

Pull m68k fixes from Geert Uytterhoeven:
 "These are two critical fixes, needed by distro kernels, and thus also
  destined for stable:

   - The do_div() commit fixes a crash in mounting btrfs volumes, which
     was a regression from 3.2,

   - The ARAnyM fix allows to have NatFeat drivers as loadable modules,
     which is needed for initrds"

* 'for-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k:
  m68k: Truncate base in do_div()
  m68k/atari: ARAnyM - Fix NatFeat module support
This commit is contained in:
Linus Torvalds 2013-08-16 16:49:06 -07:00
commit 359d16ca1b
2 changed files with 24 additions and 8 deletions

View file

@ -18,9 +18,11 @@
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/natfeat.h> #include <asm/natfeat.h>
extern long nf_get_id2(const char *feature_name);
asm("\n" asm("\n"
" .global nf_get_id,nf_call\n" " .global nf_get_id2,nf_call\n"
"nf_get_id:\n" "nf_get_id2:\n"
" .short 0x7300\n" " .short 0x7300\n"
" rts\n" " rts\n"
"nf_call:\n" "nf_call:\n"
@ -29,12 +31,25 @@ asm("\n"
"1: moveq.l #0,%d0\n" "1: moveq.l #0,%d0\n"
" rts\n" " rts\n"
" .section __ex_table,\"a\"\n" " .section __ex_table,\"a\"\n"
" .long nf_get_id,1b\n" " .long nf_get_id2,1b\n"
" .long nf_call,1b\n" " .long nf_call,1b\n"
" .previous"); " .previous");
EXPORT_SYMBOL_GPL(nf_get_id);
EXPORT_SYMBOL_GPL(nf_call); EXPORT_SYMBOL_GPL(nf_call);
long nf_get_id(const char *feature_name)
{
/* feature_name may be in vmalloc()ed memory, so make a copy */
char name_copy[32];
size_t n;
n = strlcpy(name_copy, feature_name, sizeof(name_copy));
if (n >= sizeof(name_copy))
return 0;
return nf_get_id2(name_copy);
}
EXPORT_SYMBOL_GPL(nf_get_id);
void nfprint(const char *fmt, ...) void nfprint(const char *fmt, ...)
{ {
static char buf[256]; static char buf[256];

View file

@ -15,16 +15,17 @@
unsigned long long n64; \ unsigned long long n64; \
} __n; \ } __n; \
unsigned long __rem, __upper; \ unsigned long __rem, __upper; \
unsigned long __base = (base); \
\ \
__n.n64 = (n); \ __n.n64 = (n); \
if ((__upper = __n.n32[0])) { \ if ((__upper = __n.n32[0])) { \
asm ("divul.l %2,%1:%0" \ asm ("divul.l %2,%1:%0" \
: "=d" (__n.n32[0]), "=d" (__upper) \ : "=d" (__n.n32[0]), "=d" (__upper) \
: "d" (base), "0" (__n.n32[0])); \ : "d" (__base), "0" (__n.n32[0])); \
} \ } \
asm ("divu.l %2,%1:%0" \ asm ("divu.l %2,%1:%0" \
: "=d" (__n.n32[1]), "=d" (__rem) \ : "=d" (__n.n32[1]), "=d" (__rem) \
: "d" (base), "1" (__upper), "0" (__n.n32[1])); \ : "d" (__base), "1" (__upper), "0" (__n.n32[1])); \
(n) = __n.n64; \ (n) = __n.n64; \
__rem; \ __rem; \
}) })