Commit b0e6989c authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-v3.13-rc2' of...

Merge tag 'asoc-v3.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v3.13

A smattering of fixes here, some core ones for the rate combination
issues for things other than simple bitmasks, for readback of byte
controls and for updating the power of value muxes plus a bunch of
driver fixes of varying severity.

The warning fix in the i.MX FIQ driver is fixing a warning introduced
by a previous fix.
parents 20ce9029 29e24882
...@@ -637,14 +637,14 @@ ...@@ -637,14 +637,14 @@
tlu@2f000 { tlu@2f000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x2f000 0x1000>; reg = <0x2f000 0x1000>;
interupts = <61 2 >; interrupts = <61 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
tlu@15000 { tlu@15000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x15000 0x1000>; reg = <0x15000 0x1000>;
interupts = <75 2>; interrupts = <75 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
}; };
......
...@@ -547,14 +547,14 @@ ...@@ -547,14 +547,14 @@
tlu@2f000 { tlu@2f000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x2f000 0x1000>; reg = <0x2f000 0x1000>;
interupts = <61 2 >; interrupts = <61 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
tlu@15000 { tlu@15000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x15000 0x1000>; reg = <0x15000 0x1000>;
interupts = <75 2>; interrupts = <75 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
}; };
......
...@@ -583,14 +583,14 @@ ...@@ -583,14 +583,14 @@
tlu@2f000 { tlu@2f000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x2f000 0x1000>; reg = <0x2f000 0x1000>;
interupts = <61 2 >; interrupts = <61 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
tlu@15000 { tlu@15000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x15000 0x1000>; reg = <0x15000 0x1000>;
interupts = <75 2>; interrupts = <75 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
}; };
......
...@@ -545,14 +545,14 @@ ...@@ -545,14 +545,14 @@
tlu@2f000 { tlu@2f000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x2f000 0x1000>; reg = <0x2f000 0x1000>;
interupts = <61 2 >; interrupts = <61 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
tlu@15000 { tlu@15000 {
compatible = "fsl,mpc8572-tlu", "fsl_tlu"; compatible = "fsl,mpc8572-tlu", "fsl_tlu";
reg = <0x15000 0x1000>; reg = <0x15000 0x1000>;
interupts = <75 2>; interrupts = <75 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
}; };
......
...@@ -71,18 +71,32 @@ udelay: ...@@ -71,18 +71,32 @@ udelay:
add r4,r4,r5 add r4,r4,r5
addi r4,r4,-1 addi r4,r4,-1
divw r4,r4,r5 /* BUS ticks */ divw r4,r4,r5 /* BUS ticks */
#ifdef CONFIG_8xx
1: mftbu r5
mftb r6
mftbu r7
#else
1: mfspr r5, SPRN_TBRU 1: mfspr r5, SPRN_TBRU
mfspr r6, SPRN_TBRL mfspr r6, SPRN_TBRL
mfspr r7, SPRN_TBRU mfspr r7, SPRN_TBRU
#endif
cmpw 0,r5,r7 cmpw 0,r5,r7
bne 1b /* Get [synced] base time */ bne 1b /* Get [synced] base time */
addc r9,r6,r4 /* Compute end time */ addc r9,r6,r4 /* Compute end time */
addze r8,r5 addze r8,r5
#ifdef CONFIG_8xx
2: mftbu r5
#else
2: mfspr r5, SPRN_TBRU 2: mfspr r5, SPRN_TBRU
#endif
cmpw 0,r5,r8 cmpw 0,r5,r8
blt 2b blt 2b
bgt 3f bgt 3f
#ifdef CONFIG_8xx
mftb r6
#else
mfspr r6, SPRN_TBRL mfspr r6, SPRN_TBRL
#endif
cmpw 0,r6,r9 cmpw 0,r6,r9
blt 2b blt 2b
3: blr 3: blr
...@@ -16,6 +16,7 @@ struct vmemmap_backing { ...@@ -16,6 +16,7 @@ struct vmemmap_backing {
unsigned long phys; unsigned long phys;
unsigned long virt_addr; unsigned long virt_addr;
}; };
extern struct vmemmap_backing *vmemmap_list;
/* /*
* Functions that deal with pagetables that could be at any level of * Functions that deal with pagetables that could be at any level of
......
...@@ -366,6 +366,8 @@ BEGIN_FTR_SECTION_NESTED(96); \ ...@@ -366,6 +366,8 @@ BEGIN_FTR_SECTION_NESTED(96); \
cmpwi dest,0; \ cmpwi dest,0; \
beq- 90b; \ beq- 90b; \
END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96)
#elif defined(CONFIG_8xx)
#define MFTB(dest) mftb dest
#else #else
#define MFTB(dest) mfspr dest, SPRN_TBRL #define MFTB(dest) mfspr dest, SPRN_TBRL
#endif #endif
......
...@@ -1174,12 +1174,19 @@ ...@@ -1174,12 +1174,19 @@
#else /* __powerpc64__ */ #else /* __powerpc64__ */
#if defined(CONFIG_8xx)
#define mftbl() ({unsigned long rval; \
asm volatile("mftbl %0" : "=r" (rval)); rval;})
#define mftbu() ({unsigned long rval; \
asm volatile("mftbu %0" : "=r" (rval)); rval;})
#else
#define mftbl() ({unsigned long rval; \ #define mftbl() ({unsigned long rval; \
asm volatile("mfspr %0, %1" : "=r" (rval) : \ asm volatile("mfspr %0, %1" : "=r" (rval) : \
"i" (SPRN_TBRL)); rval;}) "i" (SPRN_TBRL)); rval;})
#define mftbu() ({unsigned long rval; \ #define mftbu() ({unsigned long rval; \
asm volatile("mfspr %0, %1" : "=r" (rval) : \ asm volatile("mfspr %0, %1" : "=r" (rval) : \
"i" (SPRN_TBRU)); rval;}) "i" (SPRN_TBRU)); rval;})
#endif
#endif /* !__powerpc64__ */ #endif /* !__powerpc64__ */
#define mttbl(v) asm volatile("mttbl %0":: "r"(v)) #define mttbl(v) asm volatile("mttbl %0":: "r"(v))
......
...@@ -29,7 +29,11 @@ static inline cycles_t get_cycles(void) ...@@ -29,7 +29,11 @@ static inline cycles_t get_cycles(void)
ret = 0; ret = 0;
__asm__ __volatile__( __asm__ __volatile__(
#ifdef CONFIG_8xx
"97: mftb %0\n"
#else
"97: mfspr %0, %2\n" "97: mfspr %0, %2\n"
#endif
"99:\n" "99:\n"
".section __ftr_fixup,\"a\"\n" ".section __ftr_fixup,\"a\"\n"
".align 2\n" ".align 2\n"
...@@ -41,7 +45,11 @@ static inline cycles_t get_cycles(void) ...@@ -41,7 +45,11 @@ static inline cycles_t get_cycles(void)
" .long 0\n" " .long 0\n"
" .long 0\n" " .long 0\n"
".previous" ".previous"
#ifdef CONFIG_8xx
: "=r" (ret) : "i" (CPU_FTR_601));
#else
: "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL)); : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL));
#endif
return ret; return ret;
#endif #endif
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/pgalloc.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/sections.h> #include <asm/sections.h>
...@@ -75,6 +76,17 @@ void arch_crash_save_vmcoreinfo(void) ...@@ -75,6 +76,17 @@ void arch_crash_save_vmcoreinfo(void)
#ifndef CONFIG_NEED_MULTIPLE_NODES #ifndef CONFIG_NEED_MULTIPLE_NODES
VMCOREINFO_SYMBOL(contig_page_data); VMCOREINFO_SYMBOL(contig_page_data);
#endif #endif
#if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP)
VMCOREINFO_SYMBOL(vmemmap_list);
VMCOREINFO_SYMBOL(mmu_vmemmap_psize);
VMCOREINFO_SYMBOL(mmu_psize_defs);
VMCOREINFO_STRUCT_SIZE(vmemmap_backing);
VMCOREINFO_OFFSET(vmemmap_backing, list);
VMCOREINFO_OFFSET(vmemmap_backing, phys);
VMCOREINFO_OFFSET(vmemmap_backing, virt_addr);
VMCOREINFO_STRUCT_SIZE(mmu_psize_def);
VMCOREINFO_OFFSET(mmu_psize_def, shift);
#endif
} }
/* /*
......
...@@ -210,7 +210,7 @@ static void __init nvram_print_partitions(char * label) ...@@ -210,7 +210,7 @@ static void __init nvram_print_partitions(char * label)
printk(KERN_WARNING "--------%s---------\n", label); printk(KERN_WARNING "--------%s---------\n", label);
printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n");
list_for_each_entry(tmp_part, &nvram_partitions, partition) { list_for_each_entry(tmp_part, &nvram_partitions, partition) {
printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12s\n", printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12.12s\n",
tmp_part->index, tmp_part->header.signature, tmp_part->index, tmp_part->header.signature,
tmp_part->header.checksum, tmp_part->header.length, tmp_part->header.checksum, tmp_part->header.length,
tmp_part->header.name); tmp_part->header.name);
......
...@@ -445,6 +445,12 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, ...@@ -445,6 +445,12 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
#endif /* CONFIG_ALTIVEC */ #endif /* CONFIG_ALTIVEC */
if (copy_fpr_to_user(&frame->mc_fregs, current)) if (copy_fpr_to_user(&frame->mc_fregs, current))
return 1; return 1;
/*
* Clear the MSR VSX bit to indicate there is no valid state attached
* to this context, except in the specific case below where we set it.
*/
msr &= ~MSR_VSX;
#ifdef CONFIG_VSX #ifdef CONFIG_VSX
/* /*
* Copy VSR 0-31 upper half from thread_struct to local * Copy VSR 0-31 upper half from thread_struct to local
...@@ -457,15 +463,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, ...@@ -457,15 +463,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
if (copy_vsx_to_user(&frame->mc_vsregs, current)) if (copy_vsx_to_user(&frame->mc_vsregs, current))
return 1; return 1;
msr |= MSR_VSX; msr |= MSR_VSX;
} else if (!ctx_has_vsx_region) }
/*
* With a small context structure we can't hold the VSX
* registers, hence clear the MSR value to indicate the state
* was not saved.
*/
msr &= ~MSR_VSX;
#endif /* CONFIG_VSX */ #endif /* CONFIG_VSX */
#ifdef CONFIG_SPE #ifdef CONFIG_SPE
/* save spe registers */ /* save spe registers */
......
...@@ -122,6 +122,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, ...@@ -122,6 +122,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
flush_fp_to_thread(current); flush_fp_to_thread(current);
/* copy fpr regs and fpscr */ /* copy fpr regs and fpscr */
err |= copy_fpr_to_user(&sc->fp_regs, current); err |= copy_fpr_to_user(&sc->fp_regs, current);
/*
* Clear the MSR VSX bit to indicate there is no valid state attached
* to this context, except in the specific case below where we set it.
*/
msr &= ~MSR_VSX;
#ifdef CONFIG_VSX #ifdef CONFIG_VSX
/* /*
* Copy VSX low doubleword to local buffer for formatting, * Copy VSX low doubleword to local buffer for formatting,
......
...@@ -232,9 +232,15 @@ __do_get_tspec: ...@@ -232,9 +232,15 @@ __do_get_tspec:
lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
/* Get a stable TB value */ /* Get a stable TB value */
#ifdef CONFIG_8xx
2: mftbu r3
mftbl r4
mftbu r0
#else
2: mfspr r3, SPRN_TBRU 2: mfspr r3, SPRN_TBRU
mfspr r4, SPRN_TBRL mfspr r4, SPRN_TBRL
mfspr r0, SPRN_TBRU mfspr r0, SPRN_TBRU
#endif
cmplw cr0,r3,r0 cmplw cr0,r3,r0
bne- 2b bne- 2b
......
...@@ -117,6 +117,5 @@ void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr) ...@@ -117,6 +117,5 @@ void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
struct hstate *hstate = hstate_file(vma->vm_file); struct hstate *hstate = hstate_file(vma->vm_file);
unsigned long tsize = huge_page_shift(hstate) - 10; unsigned long tsize = huge_page_shift(hstate) - 10;
__flush_tlb_page(vma ? vma->vm_mm : NULL, vmaddr, tsize, 0); __flush_tlb_page(vma->vm_mm, vmaddr, tsize, 0);
} }
...@@ -305,7 +305,7 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, ...@@ -305,7 +305,7 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr,
void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
{ {
#ifdef CONFIG_HUGETLB_PAGE #ifdef CONFIG_HUGETLB_PAGE
if (is_vm_hugetlb_page(vma)) if (vma && is_vm_hugetlb_page(vma))
flush_hugetlb_page(vma, vmaddr); flush_hugetlb_page(vma, vmaddr);
#endif #endif
......
...@@ -404,13 +404,27 @@ config PPC_DOORBELL ...@@ -404,13 +404,27 @@ config PPC_DOORBELL
endmenu endmenu
config CPU_LITTLE_ENDIAN choice
bool "Build little endian kernel" prompt "Endianness selection"
default n default CPU_BIG_ENDIAN
help help
This option selects whether a big endian or little endian kernel will This option selects whether a big endian or little endian kernel will
be built. be built.
config CPU_BIG_ENDIAN
bool "Build big endian kernel"
help
Build a big endian kernel.
If unsure, select this option.
config CPU_LITTLE_ENDIAN
bool "Build little endian kernel"
help
Build a little endian kernel.
Note that if cross compiling a little endian kernel, Note that if cross compiling a little endian kernel,
CROSS_COMPILE must point to a toolchain capable of targeting CROSS_COMPILE must point to a toolchain capable of targeting
little endian powerpc. little endian powerpc.
endchoice
...@@ -101,7 +101,7 @@ config S390 ...@@ -101,7 +101,7 @@ config S390
select GENERIC_CPU_DEVICES if !SMP select GENERIC_CPU_DEVICES if !SMP
select GENERIC_FIND_FIRST_BIT select GENERIC_FIND_FIRST_BIT
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
select GENERIC_TIME_VSYSCALL_OLD select GENERIC_TIME_VSYSCALL
select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ALIGNED_STRUCT_PAGE if SLUB
select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
......
...@@ -35,7 +35,6 @@ static u8 *ctrblk; ...@@ -35,7 +35,6 @@ static u8 *ctrblk;
static char keylen_flag; static char keylen_flag;
struct s390_aes_ctx { struct s390_aes_ctx {
u8 iv[AES_BLOCK_SIZE];
u8 key[AES_MAX_KEY_SIZE]; u8 key[AES_MAX_KEY_SIZE];
long enc; long enc;
long dec; long dec;
...@@ -441,30 +440,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, ...@@ -441,30 +440,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
return aes_set_key(tfm, in_key, key_len); return aes_set_key(tfm, in_key, key_len);
} }
static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, static int cbc_aes_crypt(struct blkcipher_desc *desc, long func,
struct blkcipher_walk *walk) struct blkcipher_walk *walk)
{ {
struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
int ret = blkcipher_walk_virt(desc, walk); int ret = blkcipher_walk_virt(desc, walk);
unsigned int nbytes = walk->nbytes; unsigned int nbytes = walk->nbytes;
struct {
u8 iv[AES_BLOCK_SIZE];
u8 key[AES_MAX_KEY_SIZE];
} param;
if (!nbytes) if (!nbytes)
goto out; goto out;
memcpy(param, walk->iv, AES_BLOCK_SIZE); memcpy(param.iv, walk->iv, AES_BLOCK_SIZE);
memcpy(param.key, sctx->key, sctx->key_len);
do { do {
/* only use complete blocks */ /* only use complete blocks */
unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1);
u8 *out = walk->dst.virt.addr; u8 *out = walk->dst.virt.addr;
u8 *in = walk->src.virt.addr; u8 *in = walk->src.virt.addr;
ret = crypt_s390_kmc(func, param, out, in, n); ret = crypt_s390_kmc(func, &param, out, in, n);
if (ret < 0 || ret != n) if (ret < 0 || ret != n)
return -EIO; return -EIO;
nbytes &= AES_BLOCK_SIZE - 1; nbytes &= AES_BLOCK_SIZE - 1;
ret = blkcipher_walk_done(desc, walk, nbytes); ret = blkcipher_walk_done(desc, walk, nbytes);
} while ((nbytes = walk->nbytes)); } while ((nbytes = walk->nbytes));
memcpy(walk->iv, param, AES_BLOCK_SIZE); memcpy(walk->iv, param.iv, AES_BLOCK_SIZE);
out: out:
return ret; return ret;
...@@ -481,7 +486,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, ...@@ -481,7 +486,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc,
return fallback_blk_enc(desc, dst, src, nbytes); return fallback_blk_enc(desc, dst, src, nbytes);
blkcipher_walk_init(&walk, dst, src, nbytes); blkcipher_walk_init(&walk, dst, src, nbytes);
return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); return cbc_aes_crypt(desc, sctx->enc, &walk);
} }
static int cbc_aes_decrypt(struct blkcipher_desc *desc, static int cbc_aes_decrypt(struct blkcipher_desc *desc,
...@@ -495,7 +500,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, ...@@ -495,7 +500,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc,
return fallback_blk_dec(desc, dst, src, nbytes); return fallback_blk_dec(desc, dst, src, nbytes);
blkcipher_walk_init(&walk, dst, src, nbytes); blkcipher_walk_init(&walk, dst, src, nbytes);
return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); return cbc_aes_crypt(desc, sctx->dec, &walk);
} }
static struct crypto_alg cbc_aes_alg = { static struct crypto_alg cbc_aes_alg = {
......
...@@ -48,33 +48,21 @@ static inline void clear_page(void *page) ...@@ -48,33 +48,21 @@ static inline void clear_page(void *page)
: "memory", "cc"); : "memory", "cc");
} }
/*
* copy_page uses the mvcl instruction with 0xb0 padding byte in order to
* bypass caches when copying a page. Especially when copying huge pages
* this keeps L1 and L2 data caches alive.
*/
static inline void copy_page(void *to, void *from) static inline void copy_page(void *to, void *from)
{ {
if (MACHINE_HAS_MVPG) { register void *reg2 asm ("2") = to;
register unsigned long reg0 asm ("0") = 0; register unsigned long reg3 asm ("3") = 0x1000;
asm volatile( register void *reg4 asm ("4") = from;
" mvpg %0,%1" register unsigned long reg5 asm ("5") = 0xb0001000;
: : "a" (to), "a" (from), "d" (reg0) asm volatile(
: "memory", "cc"); " mvcl 2,4"
} else : "+d" (reg2), "+d" (reg3), "+d" (reg4), "+d" (reg5)
asm volatile( : : "memory", "cc");
" mvc 0(256,%0),0(%1)\n"
" mvc 256(256,%0),256(%1)\n"
" mvc 512(256,%0),512(%1)\n"
" mvc 768(256,%0),768(%1)\n"
" mvc 1024(256,%0),1024(%1)\n"
" mvc 1280(256,%0),1280(%1)\n"
" mvc 1536(256,%0),1536(%1)\n"
" mvc 1792(256,%0),1792(%1)\n"
" mvc 2048(256,%0),2048(%1)\n"
" mvc 2304(256,%0),2304(%1)\n"
" mvc 2560(256,%0),2560(%1)\n"
" mvc 2816(256,%0),2816(%1)\n"
" mvc 3072(256,%0),3072(%1)\n"
" mvc 3328(256,%0),3328(%1)\n"
" mvc 3584(256,%0),3584(%1)\n"
" mvc 3840(256,%0),3840(%1)\n"
: : "a" (to), "a" (from) : "memory");
} }
#define clear_user_page(page, vaddr, pg) clear_page(page) #define clear_user_page(page, vaddr, pg) clear_page(page)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment