mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
RISC-V Fixes for 6.5-rc8
* The vector ucontext extension has been extended with vlenb. * The vector registers ELF core dump note type has been changed to avoid aliasing with the CSR type used in embedded systems. * Support for accessing vector registers via ptrace() has been reverted. * Another build fix for the ISA spec changes around Zifencei/Zicsr that manifests on some systems built with binutils-2.37 and gcc-11.2. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmTooW4THHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYiXB5EACCEaqKDGfITAIII+KJAZFfvoL9UqgU iyywubMbFpcpmiqOM9KmRazfbLhxEU6arU5ZOPbwwf03wcS7/dyIn/fDV7wd/lDx K+tN8XE0BoQkehDMKfSGAT2WZSIfzBjoa3zkNIUzKCc9DgXdDe0TPrGuQdft5oaf /KqE18CHQmqHrWfbt0Mc+Dpq8YXhw9pOKNA994k2aX5GR9/+wphRoA3JmNa4dzHm rkBoOQpirWEz1F12JpGilscdFIJOeTs3WB20rt/zisUOfEZCfjzmdx5amviR+e4X ENPDo1TzJVYhKfJfigyYO1pPMJ8EOB3t58sVkGjbfEmy7xa4rz3DVml2rn9CYdf/ FeazMMo7R74DukQrSOMtiBhIlCNTIz0VKIeL24N9sTNXn7HaDzq45mQL6WVI4JxJ RBhvdHl3sOzMfFhB8fdebgAGtRcgBZw+joqCPBu7V37Ros2w1hv8c7Ec2q4gX5Yl wdtbV9JLmq4DoIrMnxxr8dgMt4QGc8io0UjvK82qBOQ5tHvSv430OSydcFbicBaU mLtxuI3SmlqFIURBrUPjk18B/3RZvSCtoRYgz8wyKU5DKUj7CTP6p+6sKqxM3y9G I+rg3SlteAqKWdNk3Tc2qExSIL6hWkOXXYeXr53uSweig7TmC2uutHs7w3hThMMp 9/iByBaT8H2+dQ== =bvaa -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-6.5-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V fixes from Palmer Dabbelt: "This is obviously not ideal, particularly for something this late in the cycle. Unfortunately we found some uABI issues in the vector support while reviewing the GDB port, which has triggered a revert -- probably a good sign we should have reviewed GDB before merging this, I guess I just dropped the ball because I was so worried about the context extension and libc suff I forgot. Hence the late revert. There's some risk here as we're still exposing the vector context for signal handlers, but changing that would have meant reverting all of the vector support. The issues we've found so far have been fixed already and they weren't absolute showstoppers, so we're essentially just playing it safe by holding ptrace support for another release (or until we get through a proper userspace code review). Summary: - The vector ucontext extension has been extended with vlenb - The vector registers ELF core dump note type has been changed to avoid aliasing with the CSR type used in embedded systems - Support for accessing vector registers via ptrace() has been reverted - Another build fix for the ISA spec changes around Zifencei/Zicsr that manifests on some systems built with binutils-2.37 and gcc-11.2" * tag 'riscv-for-linus-6.5-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: riscv: Fix build errors using binutils2.37 toolchains RISC-V: vector: export VLENB csr in __sc_riscv_v_state RISC-V: Remove ptrace support for vectors
This commit is contained in:
commit
4942fed84b
@ -580,15 +580,15 @@ config TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
|||||||
and Zifencei are supported in binutils from version 2.36 onwards.
|
and Zifencei are supported in binutils from version 2.36 onwards.
|
||||||
To make life easier, and avoid forcing toolchains that default to a
|
To make life easier, and avoid forcing toolchains that default to a
|
||||||
newer ISA spec to version 2.2, relax the check to binutils >= 2.36.
|
newer ISA spec to version 2.2, relax the check to binutils >= 2.36.
|
||||||
For clang < 17 or GCC < 11.1.0, for which this is not possible, this is
|
For clang < 17 or GCC < 11.3.0, for which this is not possible or need
|
||||||
dealt with in CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC.
|
special treatment, this is dealt with in TOOLCHAIN_NEEDS_OLD_ISA_SPEC.
|
||||||
|
|
||||||
config TOOLCHAIN_NEEDS_OLD_ISA_SPEC
|
config TOOLCHAIN_NEEDS_OLD_ISA_SPEC
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
depends on TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||||
# https://github.com/llvm/llvm-project/commit/22e199e6afb1263c943c0c0d4498694e15bf8a16
|
# https://github.com/llvm/llvm-project/commit/22e199e6afb1263c943c0c0d4498694e15bf8a16
|
||||||
# https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=b03be74bad08c382da47e048007a78fa3fb4ef49
|
# https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d29f5d6ab513c52fd872f532c492e35ae9fd6671
|
||||||
depends on (CC_IS_CLANG && CLANG_VERSION < 170000) || (CC_IS_GCC && GCC_VERSION < 110100)
|
depends on (CC_IS_CLANG && CLANG_VERSION < 170000) || (CC_IS_GCC && GCC_VERSION < 110300)
|
||||||
help
|
help
|
||||||
Certain versions of clang and GCC do not support zicsr and zifencei via
|
Certain versions of clang and GCC do not support zicsr and zifencei via
|
||||||
-march. This option causes an older ISA spec compatible with these older
|
-march. This option causes an older ISA spec compatible with these older
|
||||||
|
@ -70,8 +70,9 @@ static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest)
|
|||||||
"csrr %1, " __stringify(CSR_VTYPE) "\n\t"
|
"csrr %1, " __stringify(CSR_VTYPE) "\n\t"
|
||||||
"csrr %2, " __stringify(CSR_VL) "\n\t"
|
"csrr %2, " __stringify(CSR_VL) "\n\t"
|
||||||
"csrr %3, " __stringify(CSR_VCSR) "\n\t"
|
"csrr %3, " __stringify(CSR_VCSR) "\n\t"
|
||||||
|
"csrr %4, " __stringify(CSR_VLENB) "\n\t"
|
||||||
: "=r" (dest->vstart), "=r" (dest->vtype), "=r" (dest->vl),
|
: "=r" (dest->vstart), "=r" (dest->vtype), "=r" (dest->vl),
|
||||||
"=r" (dest->vcsr) : :);
|
"=r" (dest->vcsr), "=r" (dest->vlenb) : :);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src)
|
static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src)
|
||||||
|
@ -97,6 +97,7 @@ struct __riscv_v_ext_state {
|
|||||||
unsigned long vl;
|
unsigned long vl;
|
||||||
unsigned long vtype;
|
unsigned long vtype;
|
||||||
unsigned long vcsr;
|
unsigned long vcsr;
|
||||||
|
unsigned long vlenb;
|
||||||
void *datap;
|
void *datap;
|
||||||
/*
|
/*
|
||||||
* In signal handler, datap will be set a correct user stack offset
|
* In signal handler, datap will be set a correct user stack offset
|
||||||
|
@ -25,9 +25,6 @@ enum riscv_regset {
|
|||||||
#ifdef CONFIG_FPU
|
#ifdef CONFIG_FPU
|
||||||
REGSET_F,
|
REGSET_F,
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_RISCV_ISA_V
|
|
||||||
REGSET_V,
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int riscv_gpr_get(struct task_struct *target,
|
static int riscv_gpr_get(struct task_struct *target,
|
||||||
@ -84,61 +81,6 @@ static int riscv_fpr_set(struct task_struct *target,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_RISCV_ISA_V
|
|
||||||
static int riscv_vr_get(struct task_struct *target,
|
|
||||||
const struct user_regset *regset,
|
|
||||||
struct membuf to)
|
|
||||||
{
|
|
||||||
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
|
|
||||||
|
|
||||||
if (!riscv_v_vstate_query(task_pt_regs(target)))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ensure the vector registers have been saved to the memory before
|
|
||||||
* copying them to membuf.
|
|
||||||
*/
|
|
||||||
if (target == current)
|
|
||||||
riscv_v_vstate_save(current, task_pt_regs(current));
|
|
||||||
|
|
||||||
/* Copy vector header from vstate. */
|
|
||||||
membuf_write(&to, vstate, offsetof(struct __riscv_v_ext_state, datap));
|
|
||||||
membuf_zero(&to, sizeof(vstate->datap));
|
|
||||||
|
|
||||||
/* Copy all the vector registers from vstate. */
|
|
||||||
return membuf_write(&to, vstate->datap, riscv_v_vsize);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int riscv_vr_set(struct task_struct *target,
|
|
||||||
const struct user_regset *regset,
|
|
||||||
unsigned int pos, unsigned int count,
|
|
||||||
const void *kbuf, const void __user *ubuf)
|
|
||||||
{
|
|
||||||
int ret, size;
|
|
||||||
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
|
|
||||||
|
|
||||||
if (!riscv_v_vstate_query(task_pt_regs(target)))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Copy rest of the vstate except datap */
|
|
||||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vstate, 0,
|
|
||||||
offsetof(struct __riscv_v_ext_state, datap));
|
|
||||||
if (unlikely(ret))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Skip copy datap. */
|
|
||||||
size = sizeof(vstate->datap);
|
|
||||||
count -= size;
|
|
||||||
ubuf += size;
|
|
||||||
|
|
||||||
/* Copy all the vector registers. */
|
|
||||||
pos = 0;
|
|
||||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vstate->datap,
|
|
||||||
0, riscv_v_vsize);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const struct user_regset riscv_user_regset[] = {
|
static const struct user_regset riscv_user_regset[] = {
|
||||||
[REGSET_X] = {
|
[REGSET_X] = {
|
||||||
.core_note_type = NT_PRSTATUS,
|
.core_note_type = NT_PRSTATUS,
|
||||||
@ -158,17 +100,6 @@ static const struct user_regset riscv_user_regset[] = {
|
|||||||
.set = riscv_fpr_set,
|
.set = riscv_fpr_set,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_RISCV_ISA_V
|
|
||||||
[REGSET_V] = {
|
|
||||||
.core_note_type = NT_RISCV_VECTOR,
|
|
||||||
.align = 16,
|
|
||||||
.n = ((32 * RISCV_MAX_VLENB) +
|
|
||||||
sizeof(struct __riscv_v_ext_state)) / sizeof(__u32),
|
|
||||||
.size = sizeof(__u32),
|
|
||||||
.regset_get = riscv_vr_get,
|
|
||||||
.set = riscv_vr_set,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct user_regset_view riscv_user_native_view = {
|
static const struct user_regset_view riscv_user_native_view = {
|
||||||
|
@ -443,7 +443,6 @@ typedef struct elf64_shdr {
|
|||||||
#define NT_MIPS_DSP 0x800 /* MIPS DSP ASE registers */
|
#define NT_MIPS_DSP 0x800 /* MIPS DSP ASE registers */
|
||||||
#define NT_MIPS_FP_MODE 0x801 /* MIPS floating-point mode */
|
#define NT_MIPS_FP_MODE 0x801 /* MIPS floating-point mode */
|
||||||
#define NT_MIPS_MSA 0x802 /* MIPS SIMD registers */
|
#define NT_MIPS_MSA 0x802 /* MIPS SIMD registers */
|
||||||
#define NT_RISCV_VECTOR 0x900 /* RISC-V vector registers */
|
|
||||||
#define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers */
|
#define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers */
|
||||||
#define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and status registers */
|
#define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and status registers */
|
||||||
#define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD Extension registers */
|
#define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD Extension registers */
|
||||||
|
Loading…
Reference in New Issue
Block a user