mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02:00
RISC-V Fixes for 5.16-rc4
* .rodata is no longer linkd into PT_DYNAMIC, it was not supposed to be there in the first place and resultst in invalid (but unused) entries. This manifests as at least warnings in llvm-readelf. * A fix for runtime constants with all-0 upper 32-bits. This should only manifest on MMU=n kernels. * A fix for context save/restore on systems using the T-Head vector extensions. * A fix for a conflicting "+r"/"r" register constraint in the VDSO getrandom syscall wrapper, which is undefined behavior in clang. * A fix for a missing register clobber in the RVV raid6 implementation. This manifests as a NULL pointer reference on some compilers, but could trigger in other ways. * Misaligned accesses from userspace at faulting addresses are now handled correctly. * A fix for an incorrect optimization that allowed access_ok() to mark invalid addresses as accessible, which can result in userspace triggering BUG()s. * A few fixes for build warnings, and an update to Drew's email address. -----BEGIN PGP SIGNATURE----- iQJNBAABCAA3FiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmhe80kZHHBhbG1lcmRh YmJlbHRAZ29vZ2xlLmNvbQAKCRAuExnzX7sYicV6EACT/5384tdpYSQ6WQ4K2mT2 XxPbrYTJ4jrhZMugnfe1LHBokeBGoGPRK11Dr/PyNJ71oeeDF7opv0kxAfqsiOO3 QrwUE/4zhGgEzs7Z6D8UgYiqVDfb4aMU+oZ0qIfy+r+cB4F9M65TIejdVj99V6Hu V9cjJ4ABM9KfaZhD5BvoqflblYtwuSg/VYsUmZH6aolDyadzTy4rWcPk1jdFJDQt tIEsXjc92KNAKGSFe8DDZjjhM216Th/nUsZcxI2DLRQjjHPNEthkAgLNltQGocU9 gJ8U3IqfazgnqcZAlrr7BXlWYlBFH/wGXVsxuBL5LPov19RcTkjl2PWH7T08yyuv lCGXrfkz3hSu+Sa9A40w4LptrKNWUEFJztaPkQ68gn1ZQP7KB/rsWp+82dCqhT35 RNxmSznLyTsHFRXR2n9fZrWX/F/LwxY7vaH7cTZUDkMHI8F7WP/3tlihxPCQaUHD dIb+osch8puxG3YjO7H99WrpJamNNw3+L1l2lXtXTRmXdxE+x7fyatmHX98mY8IC 7NXGOdNNIEvv4i9vzSphYQHBOT3tBVfz40z878qfSL3xYHG3ZLMIsWuynaWDMI73 QprwAPmdFxdmJrHyIY6gIiyrscNHz5WLMjkG4K+jXlsBBmDxJMAY5zzNdFoeUVDz tjnDY4DYc4fCnteKSA/hpw== =42TO -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-5.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V Fixes for 5.16-rc4 - .rodata is no longer linkd into PT_DYNAMIC. It was not supposed to be there in the first place and resulted in invalid (but unused) entries. This manifests as at least warnings in llvm-readelf - A fix for runtime constants with all-0 upper 32-bits. This should only manifest on MMU=n kernels - A fix for context save/restore on systems using the T-Head vector extensions - A fix for a conflicting "+r"/"r" register constraint in the VDSO getrandom syscall wrapper, which is undefined behavior in clang - A fix for a missing register clobber in the RVV raid6 implementation. This manifests as a NULL pointer reference on some compilers, but could trigger in other ways - Misaligned accesses from userspace at faulting addresses are now handled correctly - A fix for an incorrect optimization that allowed access_ok() to mark invalid addresses as accessible, which can result in userspace triggering BUG()s - A few fixes for build warnings, and an update to Drew's email address * tag 'riscv-for-linus-5.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: riscv: export boot_cpu_hartid Revert "riscv: Define TASK_SIZE_MAX for __access_ok()" riscv: Fix sparse warning in vendor_extensions/sifive.c Revert "riscv: misaligned: fix sleeping function called during misaligned access handling" MAINTAINERS: Update Drew Fustini's email address RISC-V: uaccess: Wrap the get_user_8 uaccess macro raid6: riscv: Fix NULL pointer dereference caused by a missing clobber RISC-V: vDSO: Correct inline assembly constraints in the getrandom syscall wrapper riscv: vector: Fix context save/restore with xtheadvector riscv: fix runtime constant support for nommu kernels riscv: vdso: Exclude .rodata from the PT_DYNAMIC segment
This commit is contained in:
commit
867b9987a3
1
.mailmap
1
.mailmap
|
@ -223,6 +223,7 @@ Dmitry Safonov <0x7f454c46@gmail.com> <d.safonov@partner.samsung.com>
|
|||
Dmitry Safonov <0x7f454c46@gmail.com> <dsafonov@virtuozzo.com>
|
||||
Domen Puncer <domen@coderock.org>
|
||||
Douglas Gilbert <dougg@torque.net>
|
||||
Drew Fustini <fustini@kernel.org> <drew@pdp7.com>
|
||||
Ed L. Cashin <ecashin@coraid.com>
|
||||
Elliot Berman <quic_eberman@quicinc.com> <eberman@codeaurora.org>
|
||||
Enric Balletbo i Serra <eballetbo@kernel.org> <enric.balletbo@collabora.com>
|
||||
|
|
|
@ -21388,7 +21388,7 @@ N: spacemit
|
|||
K: spacemit
|
||||
|
||||
RISC-V THEAD SoC SUPPORT
|
||||
M: Drew Fustini <drew@pdp7.com>
|
||||
M: Drew Fustini <fustini@kernel.org>
|
||||
M: Guo Ren <guoren@kernel.org>
|
||||
M: Fu Wei <wefu@redhat.com>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
|
|
|
@ -1075,7 +1075,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
|
|||
*/
|
||||
#ifdef CONFIG_64BIT
|
||||
#define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2)
|
||||
#define TASK_SIZE_MAX LONG_MAX
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE)
|
||||
|
|
|
@ -206,7 +206,7 @@ static inline void __runtime_fixup_32(__le16 *lui_parcel, __le16 *addi_parcel, u
|
|||
addi_insn_mask &= 0x07fff;
|
||||
}
|
||||
|
||||
if (lower_immediate & 0x00000fff) {
|
||||
if (lower_immediate & 0x00000fff || lui_insn == RISCV_INSN_NOP4) {
|
||||
/* replace upper 12 bits of addi with lower 12 bits of val */
|
||||
addi_insn &= addi_insn_mask;
|
||||
addi_insn |= (lower_immediate & 0x00000fff) << 20;
|
||||
|
|
|
@ -127,6 +127,7 @@ do { \
|
|||
|
||||
#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
|
||||
#define __get_user_8(x, ptr, label) \
|
||||
do { \
|
||||
u32 __user *__ptr = (u32 __user *)(ptr); \
|
||||
u32 __lo, __hi; \
|
||||
asm_goto_output( \
|
||||
|
@ -141,7 +142,7 @@ do { \
|
|||
: : label); \
|
||||
(x) = (__typeof__(x))((__typeof__((x) - (x)))( \
|
||||
(((u64)__hi << 32) | __lo))); \
|
||||
|
||||
} while (0)
|
||||
#else /* !CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
|
||||
#define __get_user_8(x, ptr, label) \
|
||||
do { \
|
||||
|
|
|
@ -18,7 +18,7 @@ static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, uns
|
|||
register unsigned int flags asm("a2") = _flags;
|
||||
|
||||
asm volatile ("ecall\n"
|
||||
: "+r" (ret)
|
||||
: "=r" (ret)
|
||||
: "r" (nr), "r" (buffer), "r" (len), "r" (flags)
|
||||
: "memory");
|
||||
|
||||
|
|
|
@ -205,11 +205,11 @@ static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to,
|
|||
THEAD_VSETVLI_T4X0E8M8D1
|
||||
THEAD_VSB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
THEAD_VSB_V_V8T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
THEAD_VSB_V_V16T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
THEAD_VSB_V_V24T0
|
||||
: : "r" (datap) : "memory", "t0", "t4");
|
||||
} else {
|
||||
asm volatile (
|
||||
|
@ -241,11 +241,11 @@ static inline void __riscv_v_vstate_restore(struct __riscv_v_ext_state *restore_
|
|||
THEAD_VSETVLI_T4X0E8M8D1
|
||||
THEAD_VLB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
THEAD_VLB_V_V8T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
THEAD_VLB_V_V16T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
THEAD_VLB_V_V24T0
|
||||
: : "r" (datap) : "memory", "t0", "t4");
|
||||
} else {
|
||||
asm volatile (
|
||||
|
|
|
@ -50,6 +50,7 @@ atomic_t hart_lottery __section(".sdata")
|
|||
#endif
|
||||
;
|
||||
unsigned long boot_cpu_hartid;
|
||||
EXPORT_SYMBOL_GPL(boot_cpu_hartid);
|
||||
|
||||
/*
|
||||
* Place kernel memory regions on the resource tree so that
|
||||
|
|
|
@ -454,7 +454,7 @@ static int handle_scalar_misaligned_load(struct pt_regs *regs)
|
|||
|
||||
val.data_u64 = 0;
|
||||
if (user_mode(regs)) {
|
||||
if (copy_from_user_nofault(&val, (u8 __user *)addr, len))
|
||||
if (copy_from_user(&val, (u8 __user *)addr, len))
|
||||
return -1;
|
||||
} else {
|
||||
memcpy(&val, (u8 *)addr, len);
|
||||
|
@ -555,7 +555,7 @@ static int handle_scalar_misaligned_store(struct pt_regs *regs)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
if (user_mode(regs)) {
|
||||
if (copy_to_user_nofault((u8 __user *)addr, &val, len))
|
||||
if (copy_to_user((u8 __user *)addr, &val, len))
|
||||
return -1;
|
||||
} else {
|
||||
memcpy((u8 *)addr, &val, len);
|
||||
|
|
|
@ -30,7 +30,7 @@ SECTIONS
|
|||
*(.data .data.* .gnu.linkonce.d.*)
|
||||
*(.dynbss)
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
}
|
||||
} :text
|
||||
|
||||
.note : { *(.note.*) } :text :note
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <linux/types.h>
|
||||
|
||||
/* All SiFive vendor extensions supported in Linux */
|
||||
const struct riscv_isa_ext_data riscv_isa_vendor_ext_sifive[] = {
|
||||
static const struct riscv_isa_ext_data riscv_isa_vendor_ext_sifive[] = {
|
||||
__RISCV_ISA_EXT_DATA(xsfvfnrclipxfqf, RISCV_ISA_VENDOR_EXT_XSFVFNRCLIPXFQF),
|
||||
__RISCV_ISA_EXT_DATA(xsfvfwmaccqqq, RISCV_ISA_VENDOR_EXT_XSFVFWMACCQQQ),
|
||||
__RISCV_ISA_EXT_DATA(xsfvqmaccdod, RISCV_ISA_VENDOR_EXT_XSFVQMACCDOD),
|
||||
|
|
|
@ -26,9 +26,9 @@ static int rvv_has_vector(void)
|
|||
static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
|
||||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
unsigned long d;
|
||||
int z, z0;
|
||||
u8 *p, *q;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = disks - 3; /* Highest data disk */
|
||||
p = dptr[z0 + 1]; /* XOR parity */
|
||||
|
@ -36,8 +36,9 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
|
||||
|
@ -99,7 +100,7 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
|
|||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
u8 *p, *q;
|
||||
unsigned long d;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = stop; /* P/Q right side optimization */
|
||||
|
@ -108,8 +109,9 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
|
||||
|
@ -195,9 +197,9 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
|
|||
static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
|
||||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
unsigned long d;
|
||||
int z, z0;
|
||||
u8 *p, *q;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = disks - 3; /* Highest data disk */
|
||||
p = dptr[z0 + 1]; /* XOR parity */
|
||||
|
@ -205,8 +207,9 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
@ -287,7 +290,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
|
|||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
u8 *p, *q;
|
||||
unsigned long d;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = stop; /* P/Q right side optimization */
|
||||
|
@ -296,8 +299,9 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
@ -413,9 +417,9 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
|
|||
static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
|
||||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
unsigned long d;
|
||||
int z, z0;
|
||||
u8 *p, *q;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = disks - 3; /* Highest data disk */
|
||||
p = dptr[z0 + 1]; /* XOR parity */
|
||||
|
@ -423,8 +427,9 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
@ -539,7 +544,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
|
|||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
u8 *p, *q;
|
||||
unsigned long d;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = stop; /* P/Q right side optimization */
|
||||
|
@ -548,8 +553,9 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
@ -721,9 +727,9 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
|
|||
static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
|
||||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
unsigned long d;
|
||||
int z, z0;
|
||||
u8 *p, *q;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = disks - 3; /* Highest data disk */
|
||||
p = dptr[z0 + 1]; /* XOR parity */
|
||||
|
@ -731,8 +737,9 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
@ -915,7 +922,7 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
|
|||
{
|
||||
u8 **dptr = (u8 **)ptrs;
|
||||
u8 *p, *q;
|
||||
unsigned long d;
|
||||
unsigned long vl, d;
|
||||
int z, z0;
|
||||
|
||||
z0 = stop; /* P/Q right side optimization */
|
||||
|
@ -924,8 +931,9 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
|
|||
|
||||
asm volatile (".option push\n"
|
||||
".option arch,+v\n"
|
||||
"vsetvli t0, x0, e8, m1, ta, ma\n"
|
||||
"vsetvli %0, x0, e8, m1, ta, ma\n"
|
||||
".option pop\n"
|
||||
: "=&r" (vl)
|
||||
);
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user