CC: kbuild-...@lists.01.org
BCC: l...@intel.com
CC: Linux Memory Management List <linux...@kvack.org>
TO: Ard Biesheuvel <a...@kernel.org>
CC: "Russell King (Oracle)" <rmk+ker...@armlinux.org.uk>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 
master
head:   f8833a2b23562be2dae91775127c8014c44d8566
commit: f6b8e3526feb025d0259c18d6dc6b8c2e2cfedf0 [11211/14215] ARM: unwind: 
only permit stack switch when unwinding call_with_stack()
:::::: branch date: 6 hours ago
:::::: commit date: 11 days ago
compiler: arm-linux-gnueabi-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

>> arch/arm/kernel/unwind.c:451:48: warning: Boolean result is used in bitwise 
>> operation. Clarify expression with parentheses. [clarifyCondition]
    if (prel31_to_addr(&idx->addr_offset) == (u32)&call_with_stack) {
                                                  ^

vim +451 arch/arm/kernel/unwind.c

bff595c15c92b9 Catalin Marinas  2009-02-16  377  
bff595c15c92b9 Catalin Marinas  2009-02-16  378  /*
bff595c15c92b9 Catalin Marinas  2009-02-16  379   * Unwind a single frame 
starting with *sp for the symbol at *pc. It
bff595c15c92b9 Catalin Marinas  2009-02-16  380   * updates the *pc and *sp 
with the new values.
bff595c15c92b9 Catalin Marinas  2009-02-16  381   */
bff595c15c92b9 Catalin Marinas  2009-02-16  382  int unwind_frame(struct 
stackframe *frame)
bff595c15c92b9 Catalin Marinas  2009-02-16  383  {
de66a979012dbc Uwe Kleine-König 2011-12-05  384         const struct unwind_idx 
*idx;
bff595c15c92b9 Catalin Marinas  2009-02-16  385         struct 
unwind_ctrl_block ctrl;
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  386         unsigned long sp_low;
bff595c15c92b9 Catalin Marinas  2009-02-16  387  
a51345770e5195 Anurag Aggarwal  2014-02-24  388         /* store the highest 
address on the stack to avoid crossing it*/
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  389         sp_low = frame->sp;
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  390         ctrl.sp_high = 
ALIGN(sp_low - THREAD_SIZE, THREAD_ALIGN)
a1c510d0adc604 Ard Biesheuvel   2021-09-23  391                        + 
THREAD_SIZE;
bff595c15c92b9 Catalin Marinas  2009-02-16  392  
bff595c15c92b9 Catalin Marinas  2009-02-16  393         pr_debug("%s(pc = %08lx 
lr = %08lx sp = %08lx)\n", __func__,
bff595c15c92b9 Catalin Marinas  2009-02-16  394                  frame->pc, 
frame->lr, frame->sp);
bff595c15c92b9 Catalin Marinas  2009-02-16  395  
bff595c15c92b9 Catalin Marinas  2009-02-16  396         idx = 
unwind_find_idx(frame->pc);
bff595c15c92b9 Catalin Marinas  2009-02-16  397         if (!idx) {
81679376470ef4 Ard Biesheuvel   2022-03-02  398                 if (frame->pc 
&& kernel_text_address(frame->pc))
8b521cb2947d88 Joe Perches      2014-09-16  399                         
pr_warn("unwind: Index not found %08lx\n", frame->pc);
bff595c15c92b9 Catalin Marinas  2009-02-16  400                 return 
-URC_FAILURE;
bff595c15c92b9 Catalin Marinas  2009-02-16  401         }
bff595c15c92b9 Catalin Marinas  2009-02-16  402  
bff595c15c92b9 Catalin Marinas  2009-02-16  403         ctrl.vrs[FP] = 
frame->fp;
bff595c15c92b9 Catalin Marinas  2009-02-16  404         ctrl.vrs[SP] = 
frame->sp;
bff595c15c92b9 Catalin Marinas  2009-02-16  405         ctrl.vrs[LR] = 
frame->lr;
bff595c15c92b9 Catalin Marinas  2009-02-16  406         ctrl.vrs[PC] = 0;
bff595c15c92b9 Catalin Marinas  2009-02-16  407  
bff595c15c92b9 Catalin Marinas  2009-02-16  408         if (idx->insn == 1)
bff595c15c92b9 Catalin Marinas  2009-02-16  409                 /* can't unwind 
*/
bff595c15c92b9 Catalin Marinas  2009-02-16  410                 return 
-URC_FAILURE;
532319b9c418fc Ard Biesheuvel   2021-10-04  411         else if (frame->pc == 
prel31_to_addr(&idx->addr_offset)) {
532319b9c418fc Ard Biesheuvel   2021-10-04  412                 /*
532319b9c418fc Ard Biesheuvel   2021-10-04  413                  * Unwinding is 
tricky when we're halfway through the prologue,
532319b9c418fc Ard Biesheuvel   2021-10-04  414                  * since the 
stack frame that the unwinder expects may not be
532319b9c418fc Ard Biesheuvel   2021-10-04  415                  * fully set up 
yet. However, one thing we do know for sure is
532319b9c418fc Ard Biesheuvel   2021-10-04  416                  * that if we 
are unwinding from the very first instruction of
532319b9c418fc Ard Biesheuvel   2021-10-04  417                  * a function, 
we are still effectively in the stack frame of
532319b9c418fc Ard Biesheuvel   2021-10-04  418                  * the caller, 
and the unwind info has no relevance yet.
532319b9c418fc Ard Biesheuvel   2021-10-04  419                  */
532319b9c418fc Ard Biesheuvel   2021-10-04  420                 if (frame->pc 
== frame->lr)
532319b9c418fc Ard Biesheuvel   2021-10-04  421                         return 
-URC_FAILURE;
532319b9c418fc Ard Biesheuvel   2021-10-04  422                 frame->pc = 
frame->lr;
532319b9c418fc Ard Biesheuvel   2021-10-04  423                 return URC_OK;
532319b9c418fc Ard Biesheuvel   2021-10-04  424         } else if ((idx->insn & 
0x80000000) == 0)
bff595c15c92b9 Catalin Marinas  2009-02-16  425                 /* prel31 to 
the unwind table */
bff595c15c92b9 Catalin Marinas  2009-02-16  426                 ctrl.insn = 
(unsigned long *)prel31_to_addr(&idx->insn);
bff595c15c92b9 Catalin Marinas  2009-02-16  427         else if ((idx->insn & 
0xff000000) == 0x80000000)
bff595c15c92b9 Catalin Marinas  2009-02-16  428                 /* only 
personality routine 0 supported in the index */
bff595c15c92b9 Catalin Marinas  2009-02-16  429                 ctrl.insn = 
&idx->insn;
bff595c15c92b9 Catalin Marinas  2009-02-16  430         else {
8b521cb2947d88 Joe Perches      2014-09-16  431                 
pr_warn("unwind: Unsupported personality routine %08lx in the index at %p\n",
bff595c15c92b9 Catalin Marinas  2009-02-16  432                         
idx->insn, idx);
bff595c15c92b9 Catalin Marinas  2009-02-16  433                 return 
-URC_FAILURE;
bff595c15c92b9 Catalin Marinas  2009-02-16  434         }
bff595c15c92b9 Catalin Marinas  2009-02-16  435  
bff595c15c92b9 Catalin Marinas  2009-02-16  436         /* check the 
personality routine */
bff595c15c92b9 Catalin Marinas  2009-02-16  437         if ((*ctrl.insn & 
0xff000000) == 0x80000000) {
bff595c15c92b9 Catalin Marinas  2009-02-16  438                 ctrl.byte = 2;
bff595c15c92b9 Catalin Marinas  2009-02-16  439                 ctrl.entries = 
1;
bff595c15c92b9 Catalin Marinas  2009-02-16  440         } else if ((*ctrl.insn 
& 0xff000000) == 0x81000000) {
bff595c15c92b9 Catalin Marinas  2009-02-16  441                 ctrl.byte = 1;
bff595c15c92b9 Catalin Marinas  2009-02-16  442                 ctrl.entries = 
1 + ((*ctrl.insn & 0x00ff0000) >> 16);
bff595c15c92b9 Catalin Marinas  2009-02-16  443         } else {
8b521cb2947d88 Joe Perches      2014-09-16  444                 
pr_warn("unwind: Unsupported personality routine %08lx at %p\n",
bff595c15c92b9 Catalin Marinas  2009-02-16  445                         
*ctrl.insn, ctrl.insn);
bff595c15c92b9 Catalin Marinas  2009-02-16  446                 return 
-URC_FAILURE;
bff595c15c92b9 Catalin Marinas  2009-02-16  447         }
bff595c15c92b9 Catalin Marinas  2009-02-16  448  
a51345770e5195 Anurag Aggarwal  2014-02-24  449         ctrl.check_each_pop = 0;
a51345770e5195 Anurag Aggarwal  2014-02-24  450  
f6b8e3526feb02 Ard Biesheuvel   2022-03-11 @451         if 
(prel31_to_addr(&idx->addr_offset) == (u32)&call_with_stack) {
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  452                 /*
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  453                  * 
call_with_stack() is the only place where we permit SP to
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  454                  * jump from 
one stack to another, and since we know it is
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  455                  * guaranteed 
to happen, set up the SP bounds accordingly.
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  456                  */
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  457                 sp_low = 
frame->fp;
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  458                 ctrl.sp_high = 
ALIGN(frame->fp, THREAD_SIZE);
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  459         }
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  460  
bff595c15c92b9 Catalin Marinas  2009-02-16  461         while (ctrl.entries > 
0) {
a51345770e5195 Anurag Aggarwal  2014-02-24  462                 int urc;
a51345770e5195 Anurag Aggarwal  2014-02-24  463                 if 
((ctrl.sp_high - ctrl.vrs[SP]) < sizeof(ctrl.vrs))
a51345770e5195 Anurag Aggarwal  2014-02-24  464                         
ctrl.check_each_pop = 1;
a51345770e5195 Anurag Aggarwal  2014-02-24  465                 urc = 
unwind_exec_insn(&ctrl);
bff595c15c92b9 Catalin Marinas  2009-02-16  466                 if (urc < 0)
bff595c15c92b9 Catalin Marinas  2009-02-16  467                         return 
urc;
f6b8e3526feb02 Ard Biesheuvel   2022-03-11  468                 if 
(ctrl.vrs[SP] < sp_low || ctrl.vrs[SP] > ctrl.sp_high)
c894ed6956f126 Catalin Marinas  2009-06-19  469                         return 
-URC_FAILURE;
bff595c15c92b9 Catalin Marinas  2009-02-16  470         }
bff595c15c92b9 Catalin Marinas  2009-02-16  471  
bff595c15c92b9 Catalin Marinas  2009-02-16  472         if (ctrl.vrs[PC] == 0)
bff595c15c92b9 Catalin Marinas  2009-02-16  473                 ctrl.vrs[PC] = 
ctrl.vrs[LR];
bff595c15c92b9 Catalin Marinas  2009-02-16  474  
c894ed6956f126 Catalin Marinas  2009-06-19  475         /* check for infinite 
loop */
8d54a275938968 Russell King     2019-12-22  476         if (frame->pc == 
ctrl.vrs[PC] && frame->sp == ctrl.vrs[SP])
c894ed6956f126 Catalin Marinas  2009-06-19  477                 return 
-URC_FAILURE;
c894ed6956f126 Catalin Marinas  2009-06-19  478  
bff595c15c92b9 Catalin Marinas  2009-02-16  479         frame->fp = 
ctrl.vrs[FP];
bff595c15c92b9 Catalin Marinas  2009-02-16  480         frame->sp = 
ctrl.vrs[SP];
bff595c15c92b9 Catalin Marinas  2009-02-16  481         frame->lr = 
ctrl.vrs[LR];
bff595c15c92b9 Catalin Marinas  2009-02-16  482         frame->pc = 
ctrl.vrs[PC];
538b9265c063f0 Ard Biesheuvel   2022-01-24  483         frame->lr_addr = 
ctrl.lr_addr;
bff595c15c92b9 Catalin Marinas  2009-02-16  484  
bff595c15c92b9 Catalin Marinas  2009-02-16  485         return URC_OK;
bff595c15c92b9 Catalin Marinas  2009-02-16  486  }
bff595c15c92b9 Catalin Marinas  2009-02-16  487  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp
_______________________________________________
kbuild mailing list -- kbuild@lists.01.org
To unsubscribe send an email to kbuild-le...@lists.01.org

Reply via email to