Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull LoongArch fixes from Huacai Chen:
"Remove unused kernel stack padding, fix some build errors/warnings and
two bugs in laptop platform driver"

* tag 'loongarch-fixes-6.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
platform/loongarch: laptop: Fix possible UAF and simplify generic_acpi_laptop_init()
platform/loongarch: laptop: Adjust resume order for loongson_hotkey_resume()
LoongArch: BPF: Avoid declare variables in switch-case
LoongArch: Use flexible-array member instead of zero-length array
LoongArch: Remove unused kernel stack padding

+34 -36
+1 -1
arch/loongarch/include/asm/processor.h
··· 191 191 unsigned long __get_wchan(struct task_struct *p); 192 192 193 193 #define __KSTK_TOS(tsk) ((unsigned long)task_stack_page(tsk) + \ 194 - THREAD_SIZE - 32 - sizeof(struct pt_regs)) 194 + THREAD_SIZE - sizeof(struct pt_regs)) 195 195 #define task_pt_regs(tsk) ((struct pt_regs *)__KSTK_TOS(tsk)) 196 196 #define KSTK_EIP(tsk) (task_pt_regs(tsk)->csr_era) 197 197 #define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[3])
+2 -2
arch/loongarch/include/asm/ptrace.h
··· 29 29 unsigned long csr_euen; 30 30 unsigned long csr_ecfg; 31 31 unsigned long csr_estat; 32 - unsigned long __last[0]; 32 + unsigned long __last[]; 33 33 } __aligned(8); 34 34 35 35 static inline int regs_irqs_disabled(struct pt_regs *regs) ··· 133 133 #define current_pt_regs() \ 134 134 ({ \ 135 135 unsigned long sp = (unsigned long)__builtin_frame_address(0); \ 136 - (struct pt_regs *)((sp | (THREAD_SIZE - 1)) + 1 - 32) - 1; \ 136 + (struct pt_regs *)((sp | (THREAD_SIZE - 1)) + 1) - 1; \ 137 137 }) 138 138 139 139 /* Helpers for working with the user stack pointer */
+1 -2
arch/loongarch/kernel/head.S
··· 84 84 85 85 la.pcrel tp, init_thread_union 86 86 /* Set the SP after an empty pt_regs. */ 87 - PTR_LI sp, (_THREAD_SIZE - 32 - PT_SIZE) 87 + PTR_LI sp, (_THREAD_SIZE - PT_SIZE) 88 88 PTR_ADD sp, sp, tp 89 89 set_saved_sp sp, t0, t1 90 - PTR_ADDI sp, sp, -4 * SZREG # init stack pointer 91 90 92 91 bl start_kernel 93 92 ASM_BUG()
+2 -2
arch/loongarch/kernel/process.c
··· 129 129 unsigned long clone_flags = args->flags; 130 130 struct pt_regs *childregs, *regs = current_pt_regs(); 131 131 132 - childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; 132 + childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE; 133 133 134 134 /* set up new TSS. */ 135 135 childregs = (struct pt_regs *) childksp - 1; ··· 236 236 struct stack_info *info) 237 237 { 238 238 unsigned long begin = (unsigned long)task_stack_page(task); 239 - unsigned long end = begin + THREAD_SIZE - 32; 239 + unsigned long end = begin + THREAD_SIZE; 240 240 241 241 if (stack < begin || stack >= end) 242 242 return false;
+1 -1
arch/loongarch/kernel/switch.S
··· 26 26 move tp, a2 27 27 cpu_restore_nonscratch a1 28 28 29 - li.w t0, _THREAD_SIZE - 32 29 + li.w t0, _THREAD_SIZE 30 30 PTR_ADD t0, t0, tp 31 31 set_saved_sp t0, t1, t2 32 32
+13 -18
arch/loongarch/net/bpf_jit.c
··· 279 279 const u8 t1 = LOONGARCH_GPR_T1; 280 280 const u8 t2 = LOONGARCH_GPR_T2; 281 281 const u8 t3 = LOONGARCH_GPR_T3; 282 + const u8 r0 = regmap[BPF_REG_0]; 282 283 const u8 src = regmap[insn->src_reg]; 283 284 const u8 dst = regmap[insn->dst_reg]; 284 285 const s16 off = insn->off; ··· 360 359 break; 361 360 /* r0 = atomic_cmpxchg(dst + off, r0, src); */ 362 361 case BPF_CMPXCHG: 363 - u8 r0 = regmap[BPF_REG_0]; 364 - 365 362 move_reg(ctx, t2, r0); 366 363 if (isdw) { 367 364 emit_insn(ctx, lld, r0, t1, 0); ··· 389 390 390 391 static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool extra_pass) 391 392 { 392 - const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || 393 - BPF_CLASS(insn->code) == BPF_JMP32; 393 + u8 tm = -1; 394 + u64 func_addr; 395 + bool func_addr_fixed; 396 + int i = insn - ctx->prog->insnsi; 397 + int ret, jmp_offset; 394 398 const u8 code = insn->code; 395 399 const u8 cond = BPF_OP(code); 396 400 const u8 t1 = LOONGARCH_GPR_T1; ··· 402 400 const u8 dst = regmap[insn->dst_reg]; 403 401 const s16 off = insn->off; 404 402 const s32 imm = insn->imm; 405 - int jmp_offset; 406 - int i = insn - ctx->prog->insnsi; 403 + const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm; 404 + const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || BPF_CLASS(insn->code) == BPF_JMP32; 407 405 408 406 switch (code) { 409 407 /* dst = src */ ··· 726 724 case BPF_JMP32 | BPF_JSGE | BPF_K: 727 725 case BPF_JMP32 | BPF_JSLT | BPF_K: 728 726 case BPF_JMP32 | BPF_JSLE | BPF_K: 729 - u8 t7 = -1; 730 727 jmp_offset = bpf2la_offset(i, off, ctx); 731 728 if (imm) { 732 729 move_imm(ctx, t1, imm, false); 733 - t7 = t1; 730 + tm = t1; 734 731 } else { 735 732 /* If imm is 0, simply use zero register. */ 736 - t7 = LOONGARCH_GPR_ZERO; 733 + tm = LOONGARCH_GPR_ZERO; 737 734 } 738 735 move_reg(ctx, t2, dst); 739 736 if (is_signed_bpf_cond(BPF_OP(code))) { 740 - emit_sext_32(ctx, t7, is32); 737 + emit_sext_32(ctx, tm, is32); 741 738 emit_sext_32(ctx, t2, is32); 742 739 } else { 743 - emit_zext_32(ctx, t7, is32); 740 + emit_zext_32(ctx, tm, is32); 744 741 emit_zext_32(ctx, t2, is32); 745 742 } 746 - if (emit_cond_jmp(ctx, cond, t2, t7, jmp_offset) < 0) 743 + if (emit_cond_jmp(ctx, cond, t2, tm, jmp_offset) < 0) 747 744 goto toofar; 748 745 break; 749 746 ··· 776 775 777 776 /* function call */ 778 777 case BPF_JMP | BPF_CALL: 779 - int ret; 780 - u64 func_addr; 781 - bool func_addr_fixed; 782 - 783 778 mark_call(ctx); 784 779 ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass, 785 780 &func_addr, &func_addr_fixed); ··· 808 811 809 812 /* dst = imm64 */ 810 813 case BPF_LD | BPF_IMM | BPF_DW: 811 - u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm; 812 - 813 814 move_imm(ctx, dst, imm64, is32); 814 815 return 1; 815 816
+14 -10
drivers/platform/loongarch/loongson-laptop.c
··· 199 199 struct key_entry ke; 200 200 struct backlight_device *bd; 201 201 202 + bd = backlight_device_get_by_type(BACKLIGHT_PLATFORM); 203 + if (bd) { 204 + loongson_laptop_backlight_update(bd) ? 205 + pr_warn("Loongson_backlight: resume brightness failed") : 206 + pr_info("Loongson_backlight: resume brightness %d\n", bd->props.brightness); 207 + } 208 + 202 209 /* 203 210 * Only if the firmware supports SW_LID event model, we can handle the 204 211 * event. This is for the consideration of development board without EC. ··· 233 226 ke.sw.code = SW_LID; 234 227 sparse_keymap_report_entry(generic_inputdev, &ke, 1, true); 235 228 } 236 - } 237 - 238 - bd = backlight_device_get_by_type(BACKLIGHT_PLATFORM); 239 - if (bd) { 240 - loongson_laptop_backlight_update(bd) ? 241 - pr_warn("Loongson_backlight: resume brightness failed") : 242 - pr_info("Loongson_backlight: resume brightness %d\n", bd->props.brightness); 243 229 } 244 230 245 231 return 0; ··· 448 448 if (ret < 0) { 449 449 pr_err("Failed to setup input device keymap\n"); 450 450 input_free_device(generic_inputdev); 451 + generic_inputdev = NULL; 451 452 452 453 return ret; 453 454 } ··· 503 502 if (ret) 504 503 return -EINVAL; 505 504 506 - if (sub_driver->init) 507 - sub_driver->init(sub_driver); 505 + if (sub_driver->init) { 506 + ret = sub_driver->init(sub_driver); 507 + if (ret) 508 + goto err_out; 509 + } 508 510 509 511 if (sub_driver->notify) { 510 512 ret = setup_acpi_notify(sub_driver); ··· 523 519 524 520 err_out: 525 521 generic_subdriver_exit(sub_driver); 526 - return (ret < 0) ? ret : 0; 522 + return ret; 527 523 } 528 524 529 525 static void generic_subdriver_exit(struct generic_sub_driver *sub_driver)