Commit b10a3cca authored by Linus Torvalds's avatar Linus Torvalds

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

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

Pull LoongArch fixes from Huacai Chen:
 "Preserve syscall nr across execve(), slightly clean up drdtime(), fix
  the Clang built zboot kernel, fix a stack unwinder bug and several bpf
  jit bugs"

* tag 'loongarch-fixes-6.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
  LoongArch: BPF: Fix unconditional bswap instructions
  LoongArch: BPF: Fix sign-extension mov instructions
  LoongArch: BPF: Don't sign extend function return value
  LoongArch: BPF: Don't sign extend memory load operand
  LoongArch: Preserve syscall nr across execve()
  LoongArch: Set unwind stack type to unknown rather than set error flag
  LoongArch: Slightly clean up drdtime()
  LoongArch: Apply dynamic relocations for LLD
parents b8503b21 e2f7b3d8
...@@ -83,7 +83,7 @@ endif ...@@ -83,7 +83,7 @@ endif
ifeq ($(CONFIG_RELOCATABLE),y) ifeq ($(CONFIG_RELOCATABLE),y)
KBUILD_CFLAGS_KERNEL += -fPIE KBUILD_CFLAGS_KERNEL += -fPIE
LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext $(call ld-option, --apply-dynamic-relocs)
endif endif
cflags-y += $(call cc-option, -mno-check-zero-division) cflags-y += $(call cc-option, -mno-check-zero-division)
......
...@@ -293,7 +293,7 @@ extern const char *__elf_platform; ...@@ -293,7 +293,7 @@ extern const char *__elf_platform;
#define ELF_PLAT_INIT(_r, load_addr) do { \ #define ELF_PLAT_INIT(_r, load_addr) do { \
_r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \ _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \
_r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \ _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \
_r->regs[9] = _r->regs[10] = _r->regs[11] = _r->regs[12] = 0; \ _r->regs[9] = _r->regs[10] /* syscall n */ = _r->regs[12] = 0; \
_r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \ _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \
_r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \ _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \
_r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \ _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \
......
...@@ -1098,12 +1098,11 @@ ...@@ -1098,12 +1098,11 @@
static __always_inline u64 drdtime(void) static __always_inline u64 drdtime(void)
{ {
int rID = 0;
u64 val = 0; u64 val = 0;
__asm__ __volatile__( __asm__ __volatile__(
"rdtime.d %0, %1 \n\t" "rdtime.d %0, $zero\n\t"
: "=r"(val), "=r"(rID) : "=r"(val)
: :
); );
return val; return val;
......
...@@ -32,7 +32,7 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, ...@@ -32,7 +32,7 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
} }
for (unwind_start(&state, task, regs); for (unwind_start(&state, task, regs);
!unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) { !unwind_done(&state); unwind_next_frame(&state)) {
addr = unwind_get_return_address(&state); addr = unwind_get_return_address(&state);
if (!addr || !consume_entry(cookie, addr)) if (!addr || !consume_entry(cookie, addr))
break; break;
......
...@@ -28,6 +28,5 @@ bool default_next_frame(struct unwind_state *state) ...@@ -28,6 +28,5 @@ bool default_next_frame(struct unwind_state *state)
} while (!get_stack_info(state->sp, state->task, info)); } while (!get_stack_info(state->sp, state->task, info));
state->error = true;
return false; return false;
} }
...@@ -227,7 +227,7 @@ static bool next_frame(struct unwind_state *state) ...@@ -227,7 +227,7 @@ static bool next_frame(struct unwind_state *state)
} while (!get_stack_info(state->sp, state->task, info)); } while (!get_stack_info(state->sp, state->task, info));
out: out:
state->error = true; state->stack_info.type = STACK_TYPE_UNKNOWN;
return false; return false;
} }
......
...@@ -480,10 +480,12 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -480,10 +480,12 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
case 8: case 8:
move_reg(ctx, t1, src); move_reg(ctx, t1, src);
emit_insn(ctx, extwb, dst, t1); emit_insn(ctx, extwb, dst, t1);
emit_zext_32(ctx, dst, is32);
break; break;
case 16: case 16:
move_reg(ctx, t1, src); move_reg(ctx, t1, src);
emit_insn(ctx, extwh, dst, t1); emit_insn(ctx, extwh, dst, t1);
emit_zext_32(ctx, dst, is32);
break; break;
case 32: case 32:
emit_insn(ctx, addw, dst, src, LOONGARCH_GPR_ZERO); emit_insn(ctx, addw, dst, src, LOONGARCH_GPR_ZERO);
...@@ -772,8 +774,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -772,8 +774,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
break; break;
case 32: case 32:
emit_insn(ctx, revb2w, dst, dst); emit_insn(ctx, revb2w, dst, dst);
/* zero-extend 32 bits into 64 bits */ /* clear the upper 32 bits */
emit_zext_32(ctx, dst, is32); emit_zext_32(ctx, dst, true);
break; break;
case 64: case 64:
emit_insn(ctx, revbd, dst, dst); emit_insn(ctx, revbd, dst, dst);
...@@ -911,8 +913,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -911,8 +913,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
/* function return */ /* function return */
case BPF_JMP | BPF_EXIT: case BPF_JMP | BPF_EXIT:
emit_sext_32(ctx, regmap[BPF_REG_0], true);
if (i == ctx->prog->len - 1) if (i == ctx->prog->len - 1)
break; break;
...@@ -988,14 +988,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -988,14 +988,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
} }
break; break;
case BPF_DW: case BPF_DW:
if (is_signed_imm12(off)) { move_imm(ctx, t1, off, is32);
emit_insn(ctx, ldd, dst, src, off); emit_insn(ctx, ldxd, dst, src, t1);
} else if (is_signed_imm14(off)) {
emit_insn(ctx, ldptrd, dst, src, off);
} else {
move_imm(ctx, t1, off, is32);
emit_insn(ctx, ldxd, dst, src, t1);
}
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment