提交 6741c4bb 编写于 作者: L Linus Torvalds

Merge tag 'mips_fixes_4.17_2' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips

Pull MIPS fixes from James Hogan:

 - fix build with DEBUG_ZBOOT and MACH_JZ4770 (4.16)

 - include xilfpga FDT in fitImage and stop generating dtb.o (4.15)

 - fix software IO coherence on CM SMP systems (4.8)

 - ptrace: Fix PEEKUSR/POKEUSR to o32 FGRs (3.14)

 - ptrace: Expose FIR register through FP regset (3.13)

 - fix typo in KVM debugfs file name (3.10)

* tag 'mips_fixes_4.17_2' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips:
  MIPS: Fix ptrace(2) PTRACE_PEEKUSR and PTRACE_POKEUSR accesses to o32 FGRs
  MIPS: xilfpga: Actually include FDT in fitImage
  MIPS: xilfpga: Stop generating useless dtb.o
  KVM: Fix spelling mistake: "cop_unsuable" -> "cop_unusable"
  MIPS: ptrace: Expose FIR register through FP regset
  MIPS: Fix build with DEBUG_ZBOOT and MACH_JZ4770
  MIPS: c-r4k: Fix data corruption related to cache coherence
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
#define PORT(offset) (CKSEG1ADDR(AR7_REGS_UART0) + (4 * offset)) #define PORT(offset) (CKSEG1ADDR(AR7_REGS_UART0) + (4 * offset))
#endif #endif
#if defined(CONFIG_MACH_JZ4740) || defined(CONFIG_MACH_JZ4780) #ifdef CONFIG_MACH_INGENIC
#include <asm/mach-jz4740/base.h> #define INGENIC_UART0_BASE_ADDR 0x10030000
#define PORT(offset) (CKSEG1ADDR(JZ4740_UART0_BASE_ADDR) + (4 * offset)) #define PORT(offset) (CKSEG1ADDR(INGENIC_UART0_BASE_ADDR) + (4 * offset))
#endif #endif
#ifdef CONFIG_CPU_XLR #ifdef CONFIG_CPU_XLR
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
dtb-$(CONFIG_FIT_IMAGE_FDT_XILFPGA) += nexys4ddr.dtb dtb-$(CONFIG_FIT_IMAGE_FDT_XILFPGA) += nexys4ddr.dtb
obj-y += $(patsubst %.dtb, %.dtb.o, $(dtb-y))
...@@ -16,3 +16,4 @@ all-$(CONFIG_MIPS_GENERIC) := vmlinux.gz.itb ...@@ -16,3 +16,4 @@ all-$(CONFIG_MIPS_GENERIC) := vmlinux.gz.itb
its-y := vmlinux.its.S its-y := vmlinux.its.S
its-$(CONFIG_FIT_IMAGE_FDT_BOSTON) += board-boston.its.S its-$(CONFIG_FIT_IMAGE_FDT_BOSTON) += board-boston.its.S
its-$(CONFIG_FIT_IMAGE_FDT_NI169445) += board-ni169445.its.S its-$(CONFIG_FIT_IMAGE_FDT_NI169445) += board-ni169445.its.S
its-$(CONFIG_FIT_IMAGE_FDT_XILFPGA) += board-xilfpga.its.S
...@@ -463,7 +463,7 @@ static int fpr_get_msa(struct task_struct *target, ...@@ -463,7 +463,7 @@ static int fpr_get_msa(struct task_struct *target,
/* /*
* Copy the floating-point context to the supplied NT_PRFPREG buffer. * Copy the floating-point context to the supplied NT_PRFPREG buffer.
* Choose the appropriate helper for general registers, and then copy * Choose the appropriate helper for general registers, and then copy
* the FCSR register separately. * the FCSR and FIR registers separately.
*/ */
static int fpr_get(struct task_struct *target, static int fpr_get(struct task_struct *target,
const struct user_regset *regset, const struct user_regset *regset,
...@@ -471,6 +471,7 @@ static int fpr_get(struct task_struct *target, ...@@ -471,6 +471,7 @@ static int fpr_get(struct task_struct *target,
void *kbuf, void __user *ubuf) void *kbuf, void __user *ubuf)
{ {
const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t); const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t);
const int fir_pos = fcr31_pos + sizeof(u32);
int err; int err;
if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t)) if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t))
...@@ -483,6 +484,12 @@ static int fpr_get(struct task_struct *target, ...@@ -483,6 +484,12 @@ static int fpr_get(struct task_struct *target,
err = user_regset_copyout(&pos, &count, &kbuf, &ubuf, err = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
&target->thread.fpu.fcr31, &target->thread.fpu.fcr31,
fcr31_pos, fcr31_pos + sizeof(u32)); fcr31_pos, fcr31_pos + sizeof(u32));
if (err)
return err;
err = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
&boot_cpu_data.fpu_id,
fir_pos, fir_pos + sizeof(u32));
return err; return err;
} }
...@@ -531,7 +538,8 @@ static int fpr_set_msa(struct task_struct *target, ...@@ -531,7 +538,8 @@ static int fpr_set_msa(struct task_struct *target,
/* /*
* Copy the supplied NT_PRFPREG buffer to the floating-point context. * Copy the supplied NT_PRFPREG buffer to the floating-point context.
* Choose the appropriate helper for general registers, and then copy * Choose the appropriate helper for general registers, and then copy
* the FCSR register separately. * the FCSR register separately. Ignore the incoming FIR register
* contents though, as the register is read-only.
* *
* We optimize for the case where `count % sizeof(elf_fpreg_t) == 0', * We optimize for the case where `count % sizeof(elf_fpreg_t) == 0',
* which is supposed to have been guaranteed by the kernel before * which is supposed to have been guaranteed by the kernel before
...@@ -545,6 +553,7 @@ static int fpr_set(struct task_struct *target, ...@@ -545,6 +553,7 @@ static int fpr_set(struct task_struct *target,
const void *kbuf, const void __user *ubuf) const void *kbuf, const void __user *ubuf)
{ {
const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t); const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t);
const int fir_pos = fcr31_pos + sizeof(u32);
u32 fcr31; u32 fcr31;
int err; int err;
...@@ -572,6 +581,11 @@ static int fpr_set(struct task_struct *target, ...@@ -572,6 +581,11 @@ static int fpr_set(struct task_struct *target,
ptrace_setfcr31(target, fcr31); ptrace_setfcr31(target, fcr31);
} }
if (count > 0)
err = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
fir_pos,
fir_pos + sizeof(u32));
return err; return err;
} }
...@@ -793,7 +807,7 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -793,7 +807,7 @@ long arch_ptrace(struct task_struct *child, long request,
fregs = get_fpu_regs(child); fregs = get_fpu_regs(child);
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
if (test_thread_flag(TIF_32BIT_FPREGS)) { if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
/* /*
* The odd registers are actually the high * The odd registers are actually the high
* order bits of the values stored in the even * order bits of the values stored in the even
...@@ -888,7 +902,7 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -888,7 +902,7 @@ long arch_ptrace(struct task_struct *child, long request,
init_fp_ctx(child); init_fp_ctx(child);
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
if (test_thread_flag(TIF_32BIT_FPREGS)) { if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
/* /*
* The odd registers are actually the high * The odd registers are actually the high
* order bits of the values stored in the even * order bits of the values stored in the even
......
...@@ -99,7 +99,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, ...@@ -99,7 +99,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
break; break;
} }
fregs = get_fpu_regs(child); fregs = get_fpu_regs(child);
if (test_thread_flag(TIF_32BIT_FPREGS)) { if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
/* /*
* The odd registers are actually the high * The odd registers are actually the high
* order bits of the values stored in the even * order bits of the values stored in the even
...@@ -212,7 +212,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, ...@@ -212,7 +212,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
sizeof(child->thread.fpu)); sizeof(child->thread.fpu));
child->thread.fpu.fcr31 = 0; child->thread.fpu.fcr31 = 0;
} }
if (test_thread_flag(TIF_32BIT_FPREGS)) { if (test_tsk_thread_flag(child, TIF_32BIT_FPREGS)) {
/* /*
* The odd registers are actually the high * The odd registers are actually the high
* order bits of the values stored in the even * order bits of the values stored in the even
......
...@@ -45,7 +45,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { ...@@ -45,7 +45,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
{ "cache", VCPU_STAT(cache_exits), KVM_STAT_VCPU }, { "cache", VCPU_STAT(cache_exits), KVM_STAT_VCPU },
{ "signal", VCPU_STAT(signal_exits), KVM_STAT_VCPU }, { "signal", VCPU_STAT(signal_exits), KVM_STAT_VCPU },
{ "interrupt", VCPU_STAT(int_exits), KVM_STAT_VCPU }, { "interrupt", VCPU_STAT(int_exits), KVM_STAT_VCPU },
{ "cop_unsuable", VCPU_STAT(cop_unusable_exits), KVM_STAT_VCPU }, { "cop_unusable", VCPU_STAT(cop_unusable_exits), KVM_STAT_VCPU },
{ "tlbmod", VCPU_STAT(tlbmod_exits), KVM_STAT_VCPU }, { "tlbmod", VCPU_STAT(tlbmod_exits), KVM_STAT_VCPU },
{ "tlbmiss_ld", VCPU_STAT(tlbmiss_ld_exits), KVM_STAT_VCPU }, { "tlbmiss_ld", VCPU_STAT(tlbmiss_ld_exits), KVM_STAT_VCPU },
{ "tlbmiss_st", VCPU_STAT(tlbmiss_st_exits), KVM_STAT_VCPU }, { "tlbmiss_st", VCPU_STAT(tlbmiss_st_exits), KVM_STAT_VCPU },
......
...@@ -851,9 +851,12 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size) ...@@ -851,9 +851,12 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
/* /*
* Either no secondary cache or the available caches don't have the * Either no secondary cache or the available caches don't have the
* subset property so we have to flush the primary caches * subset property so we have to flush the primary caches
* explicitly * explicitly.
* If we would need IPI to perform an INDEX-type operation, then
* we have to use the HIT-type alternative as IPI cannot be used
* here due to interrupts possibly being disabled.
*/ */
if (size >= dcache_size) { if (!r4k_op_needs_ipi(R4K_INDEX) && size >= dcache_size) {
r4k_blast_dcache(); r4k_blast_dcache();
} else { } else {
R4600_HIT_CACHEOP_WAR_IMPL; R4600_HIT_CACHEOP_WAR_IMPL;
...@@ -890,7 +893,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size) ...@@ -890,7 +893,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
return; return;
} }
if (size >= dcache_size) { if (!r4k_op_needs_ipi(R4K_INDEX) && size >= dcache_size) {
r4k_blast_dcache(); r4k_blast_dcache();
} else { } else {
R4600_HIT_CACHEOP_WAR_IMPL; R4600_HIT_CACHEOP_WAR_IMPL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册