[RTEMS Project] #4955: sparc: Potential stack corruption in uniprocessor configurations during start multitasking

RTEMS trac trac at rtems.org
Wed Sep 20 06:54:57 UTC 2023


#4955: sparc: Potential stack corruption in uniprocessor configurations during
start multitasking
------------------------------+-----------------------------
  Reporter:  Sebastian Huber  |      Owner:  Sebastian Huber
      Type:  defect           |     Status:  assigned
  Priority:  normal           |  Milestone:  6.1
 Component:  arch/sparc       |    Version:  6
  Severity:  critical         |   Keywords:  qualification
Blocked By:                   |   Blocking:
------------------------------+-----------------------------
 The system initialization uses the interrupt stack. A first level
 interrupt shall never interrupt a context which uses the interrupt stack.
 Such a use would lead to stack corruption and undefined system behaviour.
 Unfortunately, in uniprocessor configurations this is the case right now.
 Multiprocessing is started using _CPU_Context_restore(). The caller of
 this function (_Thread_Start_multitasking()) uses the interrupt stack.
 Later we have in cpukit/score/cpu/sparc/cpu_asm.S:
 {{{
         mov     %g1, %psr                     ! restore status register
 and
                                               ! **** ENABLE TRAPS ****

         ld      [%o1 + G5_OFFSET], %g5        ! restore the global
 registers
         ld      [%o1 + G7_OFFSET], %g7

         ! Load thread specific ISR dispatch prevention flag
         ld      [%o1 + ISR_DISPATCH_DISABLE_STACK_OFFSET], %o2
         ! Store it to memory later to use the cycles

         ldd     [%o1 + L0_OFFSET], %l0        ! restore the local
 registers
         ldd     [%o1 + L2_OFFSET], %l2
         ldd     [%o1 + L4_OFFSET], %l4
         ldd     [%o1 + L6_OFFSET], %l6

         ! Now restore thread specific ISR dispatch prevention flag
         st      %o2, [%g6 + PER_CPU_ISR_DISPATCH_DISABLE]

         ldd     [%o1 + I0_OFFSET], %i0        ! restore the input
 registers
         ldd     [%o1 + I2_OFFSET], %i2
         ldd     [%o1 + I4_OFFSET], %i4
         ldd     [%o1 + I6_FP_OFFSET], %i6

         ldd     [%o1 + O6_SP_OFFSET], %o6     ! restore the output
 registers
 }}}
 Between the ENABLE TRAPS and the restore of the output registers, we still
 use the stack of the caller and interrupts may be enabled. If an interrupt
 happens in this code block, the interrupt stack is concurrently used which
 may lead to a crash.

--
Ticket URL: <http://devel.rtems.org/ticket/4955>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list