Commit 39879e3a authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'loongarch-fixes-6.17-2' of...

Merge tag 'loongarch-fixes-6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson

Pull LoongArch fixes from Huacai Chen:
 "Fix some build warnings for RUST-enabled objtool check, align ACPI
  structures for ARCH_STRICT_ALIGN, fix an unreliable stack for live
  patching, add some NULL pointer checkings, and fix some bugs around
  KVM"

* tag 'loongarch-fixes-6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
  LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_pch_pic_regs_access()
  LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_sw_status_access()
  LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_regs_access()
  LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_ctrl_access()
  LoongArch: KVM: Fix VM migration failure with PTW enabled
  LoongArch: KVM: Remove unused returns and semicolons
  LoongArch: vDSO: Check kcalloc() result in init_vdso()
  LoongArch: Fix unreliable stack for live patching
  LoongArch: Replace sprintf() with sysfs_emit()
  LoongArch: Check the return value when creating kobj
  LoongArch: Align ACPI structures if ARCH_STRICT_ALIGN enabled
  LoongArch: Update help info of ARCH_STRICT_ALIGN
  LoongArch: Handle jump tables options for RUST
  LoongArch: Make LTO case independent in Makefile
  objtool/LoongArch: Mark special atomic instruction as INSN_BUG type
  objtool/LoongArch: Mark types based on break immediate code
parents dcf7d9e0 8dc52456
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -298,6 +298,10 @@ config AS_HAS_LVZ_EXTENSION
config CC_HAS_ANNOTATE_TABLEJUMP
	def_bool $(cc-option,-mannotate-tablejump)

config RUSTC_HAS_ANNOTATE_TABLEJUMP
	depends on RUST
	def_bool $(rustc-option,-Cllvm-args=--loongarch-annotate-tablejump)

menu "Kernel type and options"

source "kernel/Kconfig.hz"
@@ -563,10 +567,14 @@ config ARCH_STRICT_ALIGN
	  -mstrict-align build parameter to prevent unaligned accesses.

	  CPUs with h/w unaligned access support:
	  Loongson-2K2000/2K3000/3A5000/3C5000/3D5000.
	  Loongson-2K2000/2K3000 and all of Loongson-3 series processors
	  based on LoongArch.

	  CPUs without h/w unaligned access support:
	  Loongson-2K500/2K1000.
	  Loongson-2K0300/2K0500/2K1000.

	  If you want to make sure whether to support unaligned memory access
	  on your hardware, please read the bit 20 (UAL) of CPUCFG1 register.

	  This option is enabled by default to make the kernel be able to run
	  on all LoongArch systems. But you can disable it manually if you want
+10 −5
Original line number Diff line number Diff line
@@ -102,16 +102,21 @@ KBUILD_CFLAGS += $(call cc-option,-mthin-add-sub) $(call cc-option,-Wa$(comma)

ifdef CONFIG_OBJTOOL
ifdef CONFIG_CC_HAS_ANNOTATE_TABLEJUMP
KBUILD_CFLAGS			+= -mannotate-tablejump
else
KBUILD_CFLAGS			+= -fno-jump-tables # keep compatibility with older compilers
endif
ifdef CONFIG_RUSTC_HAS_ANNOTATE_TABLEJUMP
KBUILD_RUSTFLAGS		+= -Cllvm-args=--loongarch-annotate-tablejump
else
KBUILD_RUSTFLAGS		+= -Zno-jump-tables # keep compatibility with older compilers
endif
ifdef CONFIG_LTO_CLANG
# The annotate-tablejump option can not be passed to LLVM backend when LTO is enabled.
# Ensure it is aware of linker with LTO, '--loongarch-annotate-tablejump' also needs to
# be passed via '-mllvm' to ld.lld.
KBUILD_CFLAGS			+= -mannotate-tablejump
ifdef CONFIG_LTO_CLANG
KBUILD_LDFLAGS			+= -mllvm --loongarch-annotate-tablejump
endif
else
KBUILD_CFLAGS			+= -fno-jump-tables # keep compatibility with older compilers
endif
endif

KBUILD_RUSTFLAGS		+= --target=loongarch64-unknown-none-softfloat -Ccode-model=small
+3 −4
Original line number Diff line number Diff line
@@ -10,9 +10,8 @@
#ifndef _ASM_LOONGARCH_ACENV_H
#define _ASM_LOONGARCH_ACENV_H

/*
 * This header is required by ACPI core, but we have nothing to fill in
 * right now. Will be updated later when needed.
 */
#ifdef CONFIG_ARCH_STRICT_ALIGN
#define ACPI_MISALIGNMENT_NOT_SUPPORTED
#endif /* CONFIG_ARCH_STRICT_ALIGN */

#endif /* _ASM_LOONGARCH_ACENV_H */
+16 −4
Original line number Diff line number Diff line
@@ -16,6 +16,13 @@
 */
#define KVM_MMU_CACHE_MIN_PAGES	(CONFIG_PGTABLE_LEVELS - 1)

/*
 * _PAGE_MODIFIED is a SW pte bit, it records page ever written on host
 * kernel, on secondary MMU it records the page writeable attribute, in
 * order for fast path handling.
 */
#define KVM_PAGE_WRITEABLE	_PAGE_MODIFIED

#define _KVM_FLUSH_PGTABLE	0x1
#define _KVM_HAS_PGMASK		0x2
#define kvm_pfn_pte(pfn, prot)	(((pfn) << PFN_PTE_SHIFT) | pgprot_val(prot))
@@ -52,10 +59,10 @@ static inline void kvm_set_pte(kvm_pte_t *ptep, kvm_pte_t val)
	WRITE_ONCE(*ptep, val);
}

static inline int kvm_pte_write(kvm_pte_t pte) { return pte & _PAGE_WRITE; }
static inline int kvm_pte_dirty(kvm_pte_t pte) { return pte & _PAGE_DIRTY; }
static inline int kvm_pte_young(kvm_pte_t pte) { return pte & _PAGE_ACCESSED; }
static inline int kvm_pte_huge(kvm_pte_t pte) { return pte & _PAGE_HUGE; }
static inline int kvm_pte_dirty(kvm_pte_t pte) { return pte & __WRITEABLE; }
static inline int kvm_pte_writeable(kvm_pte_t pte) { return pte & KVM_PAGE_WRITEABLE; }

static inline kvm_pte_t kvm_pte_mkyoung(kvm_pte_t pte)
{
@@ -69,12 +76,12 @@ static inline kvm_pte_t kvm_pte_mkold(kvm_pte_t pte)

static inline kvm_pte_t kvm_pte_mkdirty(kvm_pte_t pte)
{
	return pte | _PAGE_DIRTY;
	return pte | __WRITEABLE;
}

static inline kvm_pte_t kvm_pte_mkclean(kvm_pte_t pte)
{
	return pte & ~_PAGE_DIRTY;
	return pte & ~__WRITEABLE;
}

static inline kvm_pte_t kvm_pte_mkhuge(kvm_pte_t pte)
@@ -87,6 +94,11 @@ static inline kvm_pte_t kvm_pte_mksmall(kvm_pte_t pte)
	return pte & ~_PAGE_HUGE;
}

static inline kvm_pte_t kvm_pte_mkwriteable(kvm_pte_t pte)
{
	return pte | KVM_PAGE_WRITEABLE;
}

static inline int kvm_need_flush(kvm_ptw_ctx *ctx)
{
	return ctx->flag & _KVM_FLUSH_PGTABLE;
+3 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ late_initcall(fdt_cpu_clk_init);
static ssize_t boardinfo_show(struct kobject *kobj,
			      struct kobj_attribute *attr, char *buf)
{
	return sprintf(buf,
	return sysfs_emit(buf,
		"BIOS Information\n"
		"Vendor\t\t\t: %s\n"
		"Version\t\t\t: %s\n"
@@ -109,6 +109,8 @@ static int __init boardinfo_init(void)
	struct kobject *loongson_kobj;

	loongson_kobj = kobject_create_and_add("loongson", firmware_kobj);
	if (!loongson_kobj)
		return -ENOMEM;

	return sysfs_create_file(loongson_kobj, &boardinfo_attr.attr);
}
Loading