mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
RISC-V Fixes for 6.8-rc7
* A fix for detecting ".option arch" support on not-yet-released LLVM builds. * A fix for a missing TLB flush when modifying non-leaf PTEs. * A handufl of fixes for T-Head custom extensions. * A fix for systems with the legacy PMU, that manifests as a crash on kernels built without SBI PMU support. * A fix for systems that clear *envcfg on suspend, which manifests as cbo.zero trapping after resume. * A pair of fixes for Svnapot systems, including removing Svnapot support for huge vmalloc/vmap regions. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmXh8A0THHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYif7tD/9mlPpK/OZs9U8DXVpZU91iEekVU7ss CWY+Y9+fx9hjOahqUgJ72aG6mj5p9DW9cqz+73Ktds4xGCrh3Sr734nAFTshpo2K IiKx+Ruq6YIURzXMcNuQ4JHAOMI4P4p34cha+fZ5ORPXRKLJQqBR3eNFBa5NHuR4 md6TaU0gJAZE3yY2llLJOPlj9cT8swPV4gc8I0pUb4gKYj3sU/2HWVEYfiBoDnjo XUSNV2ts9mWv7OGgBqS1QqdZeFKizPp87PRfzNBye5Gx8mpUXS52Z+W7vr6f/EUf stWhDnR2XQ2HYSPoo5rQqIfZHH9dp+DUtqGjNo+jX54OoFAvHHtlhrEVC4q3uGkY Y3RoIe17s1EvozMKXCVQ+tCrhOh/jttye5Om5gb8yJ2clATL5dJM/jkoMKMdIh5n KLhZBYLrgN/Z0Mb0wePnlXhVnW2/N4ruIlP5Kd+wHRR+rUlQm6Xjccg4r5MgxMgK iaVbBZ/JTkJhP/II5ACr519Mz5Nh2N1QKTQkbHA5XWrn9+SDnF9Dio/EurPshvmm xJYcG42sxkI4V9UEmriyiAs6NqIDTKyNoA28WXYLVDCrFomtehmttS9RWE7FqPku mAUIUd3hbP4Qrt81Gus+CwCIZSuVhJin+3VUAI6Z6FpImDoamquJvIQ3aYtZ/nye pDSC3QhivYUA6A== =FpVN -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-6.8-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V fixes from Palmer Dabbelt: - detect ".option arch" support on not-yet-released LLVM builds - fix missing TLB flush when modifying non-leaf PTEs - fixes for T-Head custom extensions - fix for systems with the legacy PMU, that manifests as a crash on kernels built without SBI PMU support - fix for systems that clear *envcfg on suspend, which manifests as cbo.zero trapping after resume - fixes for Svnapot systems, including removing Svnapot support for huge vmalloc/vmap regions * tag 'riscv-for-linus-6.8-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: riscv: Sparse-Memory/vmemmap out-of-bounds fix riscv: Fix pte_leaf_size() for NAPOT Revert "riscv: mm: support Svnapot in huge vmap" riscv: Save/restore envcfg CSR during CPU suspend riscv: Add a custom ISA extension for the [ms]envcfg CSR riscv: Fix enabling cbo.zero when running in M-mode perf: RISCV: Fix panic on pmu overflow handler MAINTAINERS: Update SiFive driver maintainers drivers: perf: ctr_get_width function for legacy is not defined drivers: perf: added capabilities for legacy PMU RISC-V: Ignore V from the riscv,isa DT property on older T-Head CPUs riscv: Fix build error if !CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION riscv: mm: fix NOCACHE_THEAD does not set bit[61] correctly riscv: add CALLER_ADDRx support RISC-V: Drop invalid test from CONFIG_AS_HAS_OPTION_ARCH kbuild: Add -Wa,--fatal-warnings to as-instr invocation riscv: tlb: fix __p*d_free_tlb()
This commit is contained in:
commit
d17468c6f1
31
MAINTAINERS
31
MAINTAINERS
@ -1395,6 +1395,7 @@ F: drivers/hwmon/max31760.c
|
|||||||
|
|
||||||
ANALOGBITS PLL LIBRARIES
|
ANALOGBITS PLL LIBRARIES
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
|
M: Samuel Holland <samuel.holland@sifive.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/clk/analogbits/*
|
F: drivers/clk/analogbits/*
|
||||||
F: include/linux/clk/analogbits*
|
F: include/linux/clk/analogbits*
|
||||||
@ -16743,6 +16744,7 @@ F: drivers/pci/controller/dwc/*layerscape*
|
|||||||
PCI DRIVER FOR FU740
|
PCI DRIVER FOR FU740
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
M: Greentime Hu <greentime.hu@sifive.com>
|
M: Greentime Hu <greentime.hu@sifive.com>
|
||||||
|
M: Samuel Holland <samuel.holland@sifive.com>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml
|
F: Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml
|
||||||
@ -19988,35 +19990,14 @@ S: Maintained
|
|||||||
F: drivers/watchdog/simatic-ipc-wdt.c
|
F: drivers/watchdog/simatic-ipc-wdt.c
|
||||||
|
|
||||||
SIFIVE DRIVERS
|
SIFIVE DRIVERS
|
||||||
M: Palmer Dabbelt <palmer@dabbelt.com>
|
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
|
M: Samuel Holland <samuel.holland@sifive.com>
|
||||||
L: linux-riscv@lists.infradead.org
|
L: linux-riscv@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
N: sifive
|
|
||||||
K: [^@]sifive
|
|
||||||
|
|
||||||
SIFIVE CACHE DRIVER
|
|
||||||
M: Conor Dooley <conor@kernel.org>
|
|
||||||
L: linux-riscv@lists.infradead.org
|
|
||||||
S: Maintained
|
|
||||||
F: Documentation/devicetree/bindings/cache/sifive,ccache0.yaml
|
|
||||||
F: drivers/cache/sifive_ccache.c
|
|
||||||
|
|
||||||
SIFIVE FU540 SYSTEM-ON-CHIP
|
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
|
||||||
M: Palmer Dabbelt <palmer@dabbelt.com>
|
|
||||||
L: linux-riscv@lists.infradead.org
|
|
||||||
S: Supported
|
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pjw/sifive.git
|
|
||||||
N: fu540
|
|
||||||
K: fu540
|
|
||||||
|
|
||||||
SIFIVE PDMA DRIVER
|
|
||||||
M: Green Wan <green.wan@sifive.com>
|
|
||||||
S: Maintained
|
|
||||||
F: Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
|
|
||||||
F: drivers/dma/sf-pdma/
|
F: drivers/dma/sf-pdma/
|
||||||
|
N: sifive
|
||||||
|
K: fu[57]40
|
||||||
|
K: [^@]sifive
|
||||||
|
|
||||||
SILEAD TOUCHSCREEN DRIVER
|
SILEAD TOUCHSCREEN DRIVER
|
||||||
M: Hans de Goede <hdegoede@redhat.com>
|
M: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
@ -315,7 +315,6 @@ config AS_HAS_OPTION_ARCH
|
|||||||
# https://reviews.llvm.org/D123515
|
# https://reviews.llvm.org/D123515
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on $(as-instr, .option arch$(comma) +m)
|
depends on $(as-instr, .option arch$(comma) +m)
|
||||||
depends on !$(as-instr, .option arch$(comma) -i)
|
|
||||||
|
|
||||||
source "arch/riscv/Kconfig.socs"
|
source "arch/riscv/Kconfig.socs"
|
||||||
source "arch/riscv/Kconfig.errata"
|
source "arch/riscv/Kconfig.errata"
|
||||||
|
@ -424,6 +424,7 @@
|
|||||||
# define CSR_STATUS CSR_MSTATUS
|
# define CSR_STATUS CSR_MSTATUS
|
||||||
# define CSR_IE CSR_MIE
|
# define CSR_IE CSR_MIE
|
||||||
# define CSR_TVEC CSR_MTVEC
|
# define CSR_TVEC CSR_MTVEC
|
||||||
|
# define CSR_ENVCFG CSR_MENVCFG
|
||||||
# define CSR_SCRATCH CSR_MSCRATCH
|
# define CSR_SCRATCH CSR_MSCRATCH
|
||||||
# define CSR_EPC CSR_MEPC
|
# define CSR_EPC CSR_MEPC
|
||||||
# define CSR_CAUSE CSR_MCAUSE
|
# define CSR_CAUSE CSR_MCAUSE
|
||||||
@ -448,6 +449,7 @@
|
|||||||
# define CSR_STATUS CSR_SSTATUS
|
# define CSR_STATUS CSR_SSTATUS
|
||||||
# define CSR_IE CSR_SIE
|
# define CSR_IE CSR_SIE
|
||||||
# define CSR_TVEC CSR_STVEC
|
# define CSR_TVEC CSR_STVEC
|
||||||
|
# define CSR_ENVCFG CSR_SENVCFG
|
||||||
# define CSR_SCRATCH CSR_SSCRATCH
|
# define CSR_SCRATCH CSR_SSCRATCH
|
||||||
# define CSR_EPC CSR_SEPC
|
# define CSR_EPC CSR_SEPC
|
||||||
# define CSR_CAUSE CSR_SCAUSE
|
# define CSR_CAUSE CSR_SCAUSE
|
||||||
|
@ -25,6 +25,11 @@
|
|||||||
|
|
||||||
#define ARCH_SUPPORTS_FTRACE_OPS 1
|
#define ARCH_SUPPORTS_FTRACE_OPS 1
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
extern void *return_address(unsigned int level);
|
||||||
|
|
||||||
|
#define ftrace_return_address(n) return_address(n)
|
||||||
|
|
||||||
void MCOUNT_NAME(void);
|
void MCOUNT_NAME(void);
|
||||||
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
||||||
{
|
{
|
||||||
|
@ -11,8 +11,10 @@ static inline void arch_clear_hugepage_flags(struct page *page)
|
|||||||
}
|
}
|
||||||
#define arch_clear_hugepage_flags arch_clear_hugepage_flags
|
#define arch_clear_hugepage_flags arch_clear_hugepage_flags
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
|
||||||
bool arch_hugetlb_migration_supported(struct hstate *h);
|
bool arch_hugetlb_migration_supported(struct hstate *h);
|
||||||
#define arch_hugetlb_migration_supported arch_hugetlb_migration_supported
|
#define arch_hugetlb_migration_supported arch_hugetlb_migration_supported
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_RISCV_ISA_SVNAPOT
|
#ifdef CONFIG_RISCV_ISA_SVNAPOT
|
||||||
#define __HAVE_ARCH_HUGE_PTE_CLEAR
|
#define __HAVE_ARCH_HUGE_PTE_CLEAR
|
||||||
|
@ -81,6 +81,8 @@
|
|||||||
#define RISCV_ISA_EXT_ZTSO 72
|
#define RISCV_ISA_EXT_ZTSO 72
|
||||||
#define RISCV_ISA_EXT_ZACAS 73
|
#define RISCV_ISA_EXT_ZACAS 73
|
||||||
|
|
||||||
|
#define RISCV_ISA_EXT_XLINUXENVCFG 127
|
||||||
|
|
||||||
#define RISCV_ISA_EXT_MAX 128
|
#define RISCV_ISA_EXT_MAX 128
|
||||||
#define RISCV_ISA_EXT_INVALID U32_MAX
|
#define RISCV_ISA_EXT_INVALID U32_MAX
|
||||||
|
|
||||||
|
@ -95,7 +95,13 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
|||||||
__pud_free(mm, pud);
|
__pud_free(mm, pud);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pud_free_tlb(tlb, pud, addr) pud_free((tlb)->mm, pud)
|
#define __pud_free_tlb(tlb, pud, addr) \
|
||||||
|
do { \
|
||||||
|
if (pgtable_l4_enabled) { \
|
||||||
|
pagetable_pud_dtor(virt_to_ptdesc(pud)); \
|
||||||
|
tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(pud)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define p4d_alloc_one p4d_alloc_one
|
#define p4d_alloc_one p4d_alloc_one
|
||||||
static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr)
|
static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr)
|
||||||
@ -124,7 +130,11 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d)
|
|||||||
__p4d_free(mm, p4d);
|
__p4d_free(mm, p4d);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __p4d_free_tlb(tlb, p4d, addr) p4d_free((tlb)->mm, p4d)
|
#define __p4d_free_tlb(tlb, p4d, addr) \
|
||||||
|
do { \
|
||||||
|
if (pgtable_l5_enabled) \
|
||||||
|
tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(p4d)); \
|
||||||
|
} while (0)
|
||||||
#endif /* __PAGETABLE_PMD_FOLDED */
|
#endif /* __PAGETABLE_PMD_FOLDED */
|
||||||
|
|
||||||
static inline void sync_kernel_mappings(pgd_t *pgd)
|
static inline void sync_kernel_mappings(pgd_t *pgd)
|
||||||
@ -149,7 +159,11 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
|
|||||||
|
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
|
#define __pmd_free_tlb(tlb, pmd, addr) \
|
||||||
|
do { \
|
||||||
|
pagetable_pmd_dtor(virt_to_ptdesc(pmd)); \
|
||||||
|
tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(pmd)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#endif /* __PAGETABLE_PMD_FOLDED */
|
#endif /* __PAGETABLE_PMD_FOLDED */
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ enum napot_cont_order {
|
|||||||
* 10010 - IO Strongly-ordered, Non-cacheable, Non-bufferable, Shareable, Non-trustable
|
* 10010 - IO Strongly-ordered, Non-cacheable, Non-bufferable, Shareable, Non-trustable
|
||||||
*/
|
*/
|
||||||
#define _PAGE_PMA_THEAD ((1UL << 62) | (1UL << 61) | (1UL << 60))
|
#define _PAGE_PMA_THEAD ((1UL << 62) | (1UL << 61) | (1UL << 60))
|
||||||
#define _PAGE_NOCACHE_THEAD ((1UL < 61) | (1UL << 60))
|
#define _PAGE_NOCACHE_THEAD ((1UL << 61) | (1UL << 60))
|
||||||
#define _PAGE_IO_THEAD ((1UL << 63) | (1UL << 60))
|
#define _PAGE_IO_THEAD ((1UL << 63) | (1UL << 60))
|
||||||
#define _PAGE_MTMASK_THEAD (_PAGE_PMA_THEAD | _PAGE_IO_THEAD | (1UL << 59))
|
#define _PAGE_MTMASK_THEAD (_PAGE_PMA_THEAD | _PAGE_IO_THEAD | (1UL << 59))
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
* Define vmemmap for pfn_to_page & page_to_pfn calls. Needed if kernel
|
* Define vmemmap for pfn_to_page & page_to_pfn calls. Needed if kernel
|
||||||
* is configured with CONFIG_SPARSEMEM_VMEMMAP enabled.
|
* is configured with CONFIG_SPARSEMEM_VMEMMAP enabled.
|
||||||
*/
|
*/
|
||||||
#define vmemmap ((struct page *)VMEMMAP_START)
|
#define vmemmap ((struct page *)VMEMMAP_START - (phys_ram_base >> PAGE_SHIFT))
|
||||||
|
|
||||||
#define PCI_IO_SIZE SZ_16M
|
#define PCI_IO_SIZE SZ_16M
|
||||||
#define PCI_IO_END VMEMMAP_START
|
#define PCI_IO_END VMEMMAP_START
|
||||||
@ -439,6 +439,10 @@ static inline pte_t pte_mkhuge(pte_t pte)
|
|||||||
return pte;
|
return pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define pte_leaf_size(pte) (pte_napot(pte) ? \
|
||||||
|
napot_cont_size(napot_cont_order(pte)) :\
|
||||||
|
PAGE_SIZE)
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA_BALANCING
|
#ifdef CONFIG_NUMA_BALANCING
|
||||||
/*
|
/*
|
||||||
* See the comment in include/asm-generic/pgtable.h
|
* See the comment in include/asm-generic/pgtable.h
|
||||||
|
@ -14,6 +14,7 @@ struct suspend_context {
|
|||||||
struct pt_regs regs;
|
struct pt_regs regs;
|
||||||
/* Saved and restored by high-level functions */
|
/* Saved and restored by high-level functions */
|
||||||
unsigned long scratch;
|
unsigned long scratch;
|
||||||
|
unsigned long envcfg;
|
||||||
unsigned long tvec;
|
unsigned long tvec;
|
||||||
unsigned long ie;
|
unsigned long ie;
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
|
@ -19,65 +19,6 @@ static inline bool arch_vmap_pmd_supported(pgprot_t prot)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_RISCV_ISA_SVNAPOT
|
#endif
|
||||||
#include <linux/pgtable.h>
|
|
||||||
|
|
||||||
#define arch_vmap_pte_range_map_size arch_vmap_pte_range_map_size
|
|
||||||
static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr, unsigned long end,
|
|
||||||
u64 pfn, unsigned int max_page_shift)
|
|
||||||
{
|
|
||||||
unsigned long map_size = PAGE_SIZE;
|
|
||||||
unsigned long size, order;
|
|
||||||
|
|
||||||
if (!has_svnapot())
|
|
||||||
return map_size;
|
|
||||||
|
|
||||||
for_each_napot_order_rev(order) {
|
|
||||||
if (napot_cont_shift(order) > max_page_shift)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
size = napot_cont_size(order);
|
|
||||||
if (end - addr < size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!IS_ALIGNED(addr, size))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!IS_ALIGNED(PFN_PHYS(pfn), size))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
map_size = size;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return map_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define arch_vmap_pte_supported_shift arch_vmap_pte_supported_shift
|
|
||||||
static inline int arch_vmap_pte_supported_shift(unsigned long size)
|
|
||||||
{
|
|
||||||
int shift = PAGE_SHIFT;
|
|
||||||
unsigned long order;
|
|
||||||
|
|
||||||
if (!has_svnapot())
|
|
||||||
return shift;
|
|
||||||
|
|
||||||
WARN_ON_ONCE(size >= PMD_SIZE);
|
|
||||||
|
|
||||||
for_each_napot_order_rev(order) {
|
|
||||||
if (napot_cont_size(order) > size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!IS_ALIGNED(size, napot_cont_size(order)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
shift = napot_cont_shift(order);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_RISCV_ISA_SVNAPOT */
|
|
||||||
#endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
|
|
||||||
#endif /* _ASM_RISCV_VMALLOC_H */
|
#endif /* _ASM_RISCV_VMALLOC_H */
|
||||||
|
@ -7,6 +7,7 @@ ifdef CONFIG_FTRACE
|
|||||||
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||||
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
||||||
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
||||||
|
CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
|
||||||
endif
|
endif
|
||||||
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
||||||
CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
||||||
@ -46,6 +47,7 @@ obj-y += irq.o
|
|||||||
obj-y += process.o
|
obj-y += process.o
|
||||||
obj-y += ptrace.o
|
obj-y += ptrace.o
|
||||||
obj-y += reset.o
|
obj-y += reset.o
|
||||||
|
obj-y += return_address.o
|
||||||
obj-y += setup.o
|
obj-y += setup.o
|
||||||
obj-y += signal.o
|
obj-y += signal.o
|
||||||
obj-y += syscall_table.o
|
obj-y += syscall_table.o
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <asm/hwprobe.h>
|
#include <asm/hwprobe.h>
|
||||||
#include <asm/patch.h>
|
#include <asm/patch.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
#include <asm/sbi.h>
|
||||||
#include <asm/vector.h>
|
#include <asm/vector.h>
|
||||||
|
|
||||||
#include "copy-unaligned.h"
|
#include "copy-unaligned.h"
|
||||||
@ -201,6 +202,16 @@ static const unsigned int riscv_zvbb_exts[] = {
|
|||||||
RISCV_ISA_EXT_ZVKB
|
RISCV_ISA_EXT_ZVKB
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* While the [ms]envcfg CSRs were not defined until version 1.12 of the RISC-V
|
||||||
|
* privileged ISA, the existence of the CSRs is implied by any extension which
|
||||||
|
* specifies [ms]envcfg bit(s). Hence, we define a custom ISA extension for the
|
||||||
|
* existence of the CSR, and treat it as a subset of those other extensions.
|
||||||
|
*/
|
||||||
|
static const unsigned int riscv_xlinuxenvcfg_exts[] = {
|
||||||
|
RISCV_ISA_EXT_XLINUXENVCFG
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The canonical order of ISA extension names in the ISA string is defined in
|
* The canonical order of ISA extension names in the ISA string is defined in
|
||||||
* chapter 27 of the unprivileged specification.
|
* chapter 27 of the unprivileged specification.
|
||||||
@ -250,8 +261,8 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
|
|||||||
__RISCV_ISA_EXT_DATA(c, RISCV_ISA_EXT_c),
|
__RISCV_ISA_EXT_DATA(c, RISCV_ISA_EXT_c),
|
||||||
__RISCV_ISA_EXT_DATA(v, RISCV_ISA_EXT_v),
|
__RISCV_ISA_EXT_DATA(v, RISCV_ISA_EXT_v),
|
||||||
__RISCV_ISA_EXT_DATA(h, RISCV_ISA_EXT_h),
|
__RISCV_ISA_EXT_DATA(h, RISCV_ISA_EXT_h),
|
||||||
__RISCV_ISA_EXT_DATA(zicbom, RISCV_ISA_EXT_ZICBOM),
|
__RISCV_ISA_EXT_SUPERSET(zicbom, RISCV_ISA_EXT_ZICBOM, riscv_xlinuxenvcfg_exts),
|
||||||
__RISCV_ISA_EXT_DATA(zicboz, RISCV_ISA_EXT_ZICBOZ),
|
__RISCV_ISA_EXT_SUPERSET(zicboz, RISCV_ISA_EXT_ZICBOZ, riscv_xlinuxenvcfg_exts),
|
||||||
__RISCV_ISA_EXT_DATA(zicntr, RISCV_ISA_EXT_ZICNTR),
|
__RISCV_ISA_EXT_DATA(zicntr, RISCV_ISA_EXT_ZICNTR),
|
||||||
__RISCV_ISA_EXT_DATA(zicond, RISCV_ISA_EXT_ZICOND),
|
__RISCV_ISA_EXT_DATA(zicond, RISCV_ISA_EXT_ZICOND),
|
||||||
__RISCV_ISA_EXT_DATA(zicsr, RISCV_ISA_EXT_ZICSR),
|
__RISCV_ISA_EXT_DATA(zicsr, RISCV_ISA_EXT_ZICSR),
|
||||||
@ -538,6 +549,20 @@ static void __init riscv_fill_hwcap_from_isa_string(unsigned long *isa2hwcap)
|
|||||||
set_bit(RISCV_ISA_EXT_ZIHPM, isainfo->isa);
|
set_bit(RISCV_ISA_EXT_ZIHPM, isainfo->isa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "V" in ISA strings is ambiguous in practice: it should mean
|
||||||
|
* just the standard V-1.0 but vendors aren't well behaved.
|
||||||
|
* Many vendors with T-Head CPU cores which implement the 0.7.1
|
||||||
|
* version of the vector specification put "v" into their DTs.
|
||||||
|
* CPU cores with the ratified spec will contain non-zero
|
||||||
|
* marchid.
|
||||||
|
*/
|
||||||
|
if (acpi_disabled && riscv_cached_mvendorid(cpu) == THEAD_VENDOR_ID &&
|
||||||
|
riscv_cached_marchid(cpu) == 0x0) {
|
||||||
|
this_hwcap &= ~isa2hwcap[RISCV_ISA_EXT_v];
|
||||||
|
clear_bit(RISCV_ISA_EXT_v, isainfo->isa);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All "okay" hart should have same isa. Set HWCAP based on
|
* All "okay" hart should have same isa. Set HWCAP based on
|
||||||
* common capabilities of every "okay" hart, in case they don't
|
* common capabilities of every "okay" hart, in case they don't
|
||||||
@ -950,7 +975,7 @@ arch_initcall(check_unaligned_access_all_cpus);
|
|||||||
void riscv_user_isa_enable(void)
|
void riscv_user_isa_enable(void)
|
||||||
{
|
{
|
||||||
if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_ZICBOZ))
|
if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_ZICBOZ))
|
||||||
csr_set(CSR_SENVCFG, ENVCFG_CBZE);
|
csr_set(CSR_ENVCFG, ENVCFG_CBZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_RISCV_ALTERNATIVE
|
#ifdef CONFIG_RISCV_ALTERNATIVE
|
||||||
|
48
arch/riscv/kernel/return_address.c
Normal file
48
arch/riscv/kernel/return_address.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* This code come from arch/arm64/kernel/return_address.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 SiFive.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/export.h>
|
||||||
|
#include <linux/kprobes.h>
|
||||||
|
#include <linux/stacktrace.h>
|
||||||
|
|
||||||
|
struct return_address_data {
|
||||||
|
unsigned int level;
|
||||||
|
void *addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool save_return_addr(void *d, unsigned long pc)
|
||||||
|
{
|
||||||
|
struct return_address_data *data = d;
|
||||||
|
|
||||||
|
if (!data->level) {
|
||||||
|
data->addr = (void *)pc;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
--data->level;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
NOKPROBE_SYMBOL(save_return_addr);
|
||||||
|
|
||||||
|
noinline void *return_address(unsigned int level)
|
||||||
|
{
|
||||||
|
struct return_address_data data;
|
||||||
|
|
||||||
|
data.level = level + 3;
|
||||||
|
data.addr = NULL;
|
||||||
|
|
||||||
|
arch_stack_walk(save_return_addr, &data, current, NULL);
|
||||||
|
|
||||||
|
if (!data.level)
|
||||||
|
return data.addr;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(return_address);
|
||||||
|
NOKPROBE_SYMBOL(return_address);
|
@ -15,6 +15,8 @@
|
|||||||
void suspend_save_csrs(struct suspend_context *context)
|
void suspend_save_csrs(struct suspend_context *context)
|
||||||
{
|
{
|
||||||
context->scratch = csr_read(CSR_SCRATCH);
|
context->scratch = csr_read(CSR_SCRATCH);
|
||||||
|
if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_XLINUXENVCFG))
|
||||||
|
context->envcfg = csr_read(CSR_ENVCFG);
|
||||||
context->tvec = csr_read(CSR_TVEC);
|
context->tvec = csr_read(CSR_TVEC);
|
||||||
context->ie = csr_read(CSR_IE);
|
context->ie = csr_read(CSR_IE);
|
||||||
|
|
||||||
@ -36,6 +38,8 @@ void suspend_save_csrs(struct suspend_context *context)
|
|||||||
void suspend_restore_csrs(struct suspend_context *context)
|
void suspend_restore_csrs(struct suspend_context *context)
|
||||||
{
|
{
|
||||||
csr_write(CSR_SCRATCH, context->scratch);
|
csr_write(CSR_SCRATCH, context->scratch);
|
||||||
|
if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_XLINUXENVCFG))
|
||||||
|
csr_write(CSR_ENVCFG, context->envcfg);
|
||||||
csr_write(CSR_TVEC, context->tvec);
|
csr_write(CSR_TVEC, context->tvec);
|
||||||
csr_write(CSR_IE, context->ie);
|
csr_write(CSR_IE, context->ie);
|
||||||
|
|
||||||
|
@ -426,10 +426,12 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
|
|||||||
return __hugetlb_valid_size(size);
|
return __hugetlb_valid_size(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
|
||||||
bool arch_hugetlb_migration_supported(struct hstate *h)
|
bool arch_hugetlb_migration_supported(struct hstate *h)
|
||||||
{
|
{
|
||||||
return __hugetlb_valid_size(huge_page_size(h));
|
return __hugetlb_valid_size(huge_page_size(h));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CONTIG_ALLOC
|
#ifdef CONFIG_CONTIG_ALLOC
|
||||||
static __init int gigantic_pages_init(void)
|
static __init int gigantic_pages_init(void)
|
||||||
|
@ -150,19 +150,11 @@ u64 riscv_pmu_ctr_get_width_mask(struct perf_event *event)
|
|||||||
struct riscv_pmu *rvpmu = to_riscv_pmu(event->pmu);
|
struct riscv_pmu *rvpmu = to_riscv_pmu(event->pmu);
|
||||||
struct hw_perf_event *hwc = &event->hw;
|
struct hw_perf_event *hwc = &event->hw;
|
||||||
|
|
||||||
if (!rvpmu->ctr_get_width)
|
if (hwc->idx == -1)
|
||||||
/**
|
/* Handle init case where idx is not initialized yet */
|
||||||
* If the pmu driver doesn't support counter width, set it to default
|
cwidth = rvpmu->ctr_get_width(0);
|
||||||
* maximum allowed by the specification.
|
else
|
||||||
*/
|
cwidth = rvpmu->ctr_get_width(hwc->idx);
|
||||||
cwidth = 63;
|
|
||||||
else {
|
|
||||||
if (hwc->idx == -1)
|
|
||||||
/* Handle init case where idx is not initialized yet */
|
|
||||||
cwidth = rvpmu->ctr_get_width(0);
|
|
||||||
else
|
|
||||||
cwidth = rvpmu->ctr_get_width(hwc->idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GENMASK_ULL(cwidth, 0);
|
return GENMASK_ULL(cwidth, 0);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,12 @@ static int pmu_legacy_event_map(struct perf_event *event, u64 *config)
|
|||||||
return pmu_legacy_ctr_get_idx(event);
|
return pmu_legacy_ctr_get_idx(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* cycle & instret are always 64 bit, one bit less according to SBI spec */
|
||||||
|
static int pmu_legacy_ctr_get_width(int idx)
|
||||||
|
{
|
||||||
|
return 63;
|
||||||
|
}
|
||||||
|
|
||||||
static u64 pmu_legacy_read_ctr(struct perf_event *event)
|
static u64 pmu_legacy_read_ctr(struct perf_event *event)
|
||||||
{
|
{
|
||||||
struct hw_perf_event *hwc = &event->hw;
|
struct hw_perf_event *hwc = &event->hw;
|
||||||
@ -111,12 +117,14 @@ static void pmu_legacy_init(struct riscv_pmu *pmu)
|
|||||||
pmu->ctr_stop = NULL;
|
pmu->ctr_stop = NULL;
|
||||||
pmu->event_map = pmu_legacy_event_map;
|
pmu->event_map = pmu_legacy_event_map;
|
||||||
pmu->ctr_get_idx = pmu_legacy_ctr_get_idx;
|
pmu->ctr_get_idx = pmu_legacy_ctr_get_idx;
|
||||||
pmu->ctr_get_width = NULL;
|
pmu->ctr_get_width = pmu_legacy_ctr_get_width;
|
||||||
pmu->ctr_clear_idx = NULL;
|
pmu->ctr_clear_idx = NULL;
|
||||||
pmu->ctr_read = pmu_legacy_read_ctr;
|
pmu->ctr_read = pmu_legacy_read_ctr;
|
||||||
pmu->event_mapped = pmu_legacy_event_mapped;
|
pmu->event_mapped = pmu_legacy_event_mapped;
|
||||||
pmu->event_unmapped = pmu_legacy_event_unmapped;
|
pmu->event_unmapped = pmu_legacy_event_unmapped;
|
||||||
pmu->csr_index = pmu_legacy_csr_index;
|
pmu->csr_index = pmu_legacy_csr_index;
|
||||||
|
pmu->pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||||
|
pmu->pmu.capabilities |= PERF_PMU_CAP_NO_EXCLUDE;
|
||||||
|
|
||||||
perf_pmu_register(&pmu->pmu, "cpu", PERF_TYPE_RAW);
|
perf_pmu_register(&pmu->pmu, "cpu", PERF_TYPE_RAW);
|
||||||
}
|
}
|
||||||
|
@ -512,7 +512,7 @@ static void pmu_sbi_set_scounteren(void *arg)
|
|||||||
|
|
||||||
if (event->hw.idx != -1)
|
if (event->hw.idx != -1)
|
||||||
csr_write(CSR_SCOUNTEREN,
|
csr_write(CSR_SCOUNTEREN,
|
||||||
csr_read(CSR_SCOUNTEREN) | (1 << pmu_sbi_csr_index(event)));
|
csr_read(CSR_SCOUNTEREN) | BIT(pmu_sbi_csr_index(event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pmu_sbi_reset_scounteren(void *arg)
|
static void pmu_sbi_reset_scounteren(void *arg)
|
||||||
@ -521,7 +521,7 @@ static void pmu_sbi_reset_scounteren(void *arg)
|
|||||||
|
|
||||||
if (event->hw.idx != -1)
|
if (event->hw.idx != -1)
|
||||||
csr_write(CSR_SCOUNTEREN,
|
csr_write(CSR_SCOUNTEREN,
|
||||||
csr_read(CSR_SCOUNTEREN) & ~(1 << pmu_sbi_csr_index(event)));
|
csr_read(CSR_SCOUNTEREN) & ~BIT(pmu_sbi_csr_index(event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pmu_sbi_ctr_start(struct perf_event *event, u64 ival)
|
static void pmu_sbi_ctr_start(struct perf_event *event, u64 ival)
|
||||||
@ -731,14 +731,14 @@ static irqreturn_t pmu_sbi_ovf_handler(int irq, void *dev)
|
|||||||
/* compute hardware counter index */
|
/* compute hardware counter index */
|
||||||
hidx = info->csr - CSR_CYCLE;
|
hidx = info->csr - CSR_CYCLE;
|
||||||
/* check if the corresponding bit is set in sscountovf */
|
/* check if the corresponding bit is set in sscountovf */
|
||||||
if (!(overflow & (1 << hidx)))
|
if (!(overflow & BIT(hidx)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Keep a track of overflowed counters so that they can be started
|
* Keep a track of overflowed counters so that they can be started
|
||||||
* with updated initial value.
|
* with updated initial value.
|
||||||
*/
|
*/
|
||||||
overflowed_ctrs |= 1 << lidx;
|
overflowed_ctrs |= BIT(lidx);
|
||||||
hw_evt = &event->hw;
|
hw_evt = &event->hw;
|
||||||
riscv_pmu_event_update(event);
|
riscv_pmu_event_update(event);
|
||||||
perf_sample_data_init(&data, 0, hw_evt->last_period);
|
perf_sample_data_init(&data, 0, hw_evt->last_period);
|
||||||
|
@ -33,7 +33,7 @@ ld-option = $(success,$(LD) -v $(1))
|
|||||||
|
|
||||||
# $(as-instr,<instr>)
|
# $(as-instr,<instr>)
|
||||||
# Return y if the assembler supports <instr>, n otherwise
|
# Return y if the assembler supports <instr>, n otherwise
|
||||||
as-instr = $(success,printf "%b\n" "$(1)" | $(CC) $(CLANG_FLAGS) -c -x assembler-with-cpp -o /dev/null -)
|
as-instr = $(success,printf "%b\n" "$(1)" | $(CC) $(CLANG_FLAGS) -Wa$(comma)--fatal-warnings -c -x assembler-with-cpp -o /dev/null -)
|
||||||
|
|
||||||
# check if $(CC) and $(LD) exist
|
# check if $(CC) and $(LD) exist
|
||||||
$(error-if,$(failure,command -v $(CC)),C compiler '$(CC)' not found)
|
$(error-if,$(failure,command -v $(CC)),C compiler '$(CC)' not found)
|
||||||
|
@ -38,7 +38,7 @@ as-option = $(call try-run,\
|
|||||||
# Usage: aflags-y += $(call as-instr,instr,option1,option2)
|
# Usage: aflags-y += $(call as-instr,instr,option1,option2)
|
||||||
|
|
||||||
as-instr = $(call try-run,\
|
as-instr = $(call try-run,\
|
||||||
printf "%b\n" "$(1)" | $(CC) -Werror $(CLANG_FLAGS) $(KBUILD_AFLAGS) -c -x assembler-with-cpp -o "$$TMP" -,$(2),$(3))
|
printf "%b\n" "$(1)" | $(CC) -Werror $(CLANG_FLAGS) $(KBUILD_AFLAGS) -Wa$(comma)--fatal-warnings -c -x assembler-with-cpp -o "$$TMP" -,$(2),$(3))
|
||||||
|
|
||||||
# __cc-option
|
# __cc-option
|
||||||
# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
|
# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
|
||||||
|
Loading…
Reference in New Issue
Block a user