1. 24 Aug, 2009 4 commits
    • Carl Shaw's avatar
      sh: Improve unwind info for signals · 2fc742f8
      Carl Shaw authored
      GCC does not issue unwind information for function epilogues.
      Unfortunately we can catch a signal during an epilogue.  The signal
      handler writes the current context and signal return code onto the stack
      overwriting previous contents.  During unwinding, libgcc can try to
      restore registers from the stack and restores corrupted ones. This can
      lead to segmentation, misaligned access and sigbus faults.
      
      For example, consider the following code:
      
          mov.l   r12,@-r15
          mov.l   r14,@-r15
          sts.l   pr,@-r15
          mov     r15,r14
      
          <do stuff>
      
          mov r14, r15
          lds.l @r15+, pr
      	<<< SIGNAL HERE
          mov.l @r15+, r14
          mov.l @r15+, r12
          rts
      
      Unwind is aware that pr was pushed to stack in prolog, so tries to
      restore it.  Unfortunately it restores the last word of the signal
      handler code placed on the stack by the kernel.
      
      This patch tries to avoid the problem by adding a guard region on the
      stack between where the function pushes data and where the signal handler
      pushes its return code.  We probably don't see this problem often because
      exception handling unwinding in an epilogue only occurs due to a pthread
      cancel signal.  Also the kernel signal stack handler alignment of 8 bytes
      could hide the occurance of this problem sometimes as the stack may not
      be trampled at a particular required word.
      
      This is not guaranteed to always work.  It relies on a frame pointer
      existing for the function (so it can get the correct sp value) which is
      not always the case for the SH4.
      
      Modifications will also be made to libgcc for the case where there is no
      fp.
      Signed-off-by: default avatarCarl Shaw <carl.shaw@st.com>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      2fc742f8
    • Andre Draszik's avatar
      sh: cleanup of do_address_error() · 5a0ab35e
      Andre Draszik authored
      This patch fixes a few problems with the existing code in do_address_error().
      
      a) the variable used to printk()d the offending instruction wasn't
         initialized correctly. This is a fix to bug 5727
      
      b) behaviour for CONFIG_CPU_SH2A wasn't correct
      
      c) the 'ignore address error' behaviour didn't update the PC, causing an
         infinite loop.
      Signed-off-by: default avatarAndre Draszik <andre.draszik@st.com>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      5a0ab35e
    • Andre Draszik's avatar
      sh: Allow user control over misaligned fixup handling · 7436cde6
      Andre Draszik authored
      This patch brings the SH4 misaligned trap handler in line with what
      happens on ARM:
      Add a /proc/cpu/alignment which can be read from to get alignment
      trap statistics and written to to influence the behaviour of the
      alignment trap handling. The value to write is a bitfield, which
      has the following meaning: 1 warn, 2 fixup, 4 signal
      In addition, we add a /proc/cpu/kernel_alignment, to enable or
      disable warnings in case of kernel code causing alignment errors.
      
      Signed-off by: Andre Draszik <andre.draszik@st.com>
      Signed-off-by: default avatarStuart Menefy <stuart.menefy@st.com>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      7436cde6
    • Andre Draszik's avatar
      sh: ratelimit unaligned fixups · 9a4af027
      Andre Draszik authored
      This patch makes sure we see messages about unaligned access fixups
      every now and then. Else especially userspace apps suffering from
      bad programming won't ever be noticed...
      
      Signed-off by: Andre Draszik <andre.draszik@st.com>
      Signed-off-by: default avatarStuart Menefy <stuart.menefy@st.com>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      9a4af027
  2. 23 Aug, 2009 10 commits
    • Paul Mundt's avatar
      Merge branches 'sh/hwblk' and 'sh/pm-runtime' · c3144fc4
      Paul Mundt authored
      c3144fc4
    • Magnus Damm's avatar
      sh: drop static UIO clocks for sh7722, sh7723 and sh7724 · cc58f597
      Magnus Damm authored
      The Runtime PM patch for UIO driver implements coarse grained
      dynamic power management for UIO devices. With that patch in
      place we can get rid of the static clock configuration. Which
      in turn makes it possible for cpuidle to enter deeper sleep.
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      cc58f597
    • Magnus Damm's avatar
      sh: let ARCH_SHMOBILE select PM and PM_RUNTIME · ac2c596b
      Magnus Damm authored
      With the Runtime PM driver changes in place, we must have
      Runtime PM support in place. Otherwise there is no way to
      enable clocks to the Runtime PM enabled hardware blocks.
      This patch makes Runtime PM mandatory on SuperH Mobile.
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      ac2c596b
    • Paul Mundt's avatar
      sh: Fix section mismatch in platform bus notifier. · a62926fe
      Paul Mundt authored
      The runtime PM for SH-Mobile code had platform_bus_notify() as __devinit,
      which is rather bogus. Kill off the annotation, which subsequently
      silences the section mismatch warnings.
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      a62926fe
    • Magnus Damm's avatar
      uio: Runtime PM for UIO devices · af76756e
      Magnus Damm authored
      This patch modifies the uio_pdrv_genirq driver to support
      Runtime PM. The power management implementation simply
      runtime resumes the device at open() time and runtime
      suspends it at release() time. The user space driver is
      responsible for re-initializing the hardware after open().
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      af76756e
    • Magnus Damm's avatar
      v4l2: Runtime PM for SuperH Mobile CEU · 6d1386c6
      Magnus Damm authored
      This patch modifies the SuperH Mobile CEU driver to support
      Runtime PM. Driver callbacks for Runtime PM are empty because
      the device registers are always re-initialized after
      pm_runtime_get_sync(). The Runtime PM functions replaces the
      clock framework module stop bit handling in this driver.
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      6d1386c6
    • Magnus Damm's avatar
      video: Runtime PM for SuperH Mobile LCDC · 0246c471
      Magnus Damm authored
      This patch modifies the SuperH Mobile LCDC framebuffer driver
      to support Runtime PM. The driver is using the functions
      
       - pm_runtime_get_sync()
       - pm_runtime_put_sync()
      
      to inform the bus code if the hardware is idle or not. If the
      hardware is idle then the bus code may call the runtime dev_pm_ops
      callbacks to save and restore state. pm_runtime_resume() is used
      to allow the driver to access the hardware from probe().
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      0246c471
    • Magnus Damm's avatar
      i2c: Runtime PM for SuperH Mobile I2C · f1a3b994
      Magnus Damm authored
      This patch modifies the SuperH Mobile I2C driver to support
      Runtime PM. These changes is all that is needed for proper
      Runtime PM support in this driver. Driver callbacks for
      Runtime PM are empty because the device registers are always
      re-initialized after pm_runtime_get_sync().
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      f1a3b994
    • Magnus Damm's avatar
      sh: Runtime PM for SuperH Mobile platform bus devices · 6a93dde1
      Magnus Damm authored
      This patch is V3 of the SuperH Mobile Runtime PM platform bus
      implentation matching Rafael's Runtime PM v16.
      
      The code gets invoked from the SuperH specific Runtime PM
      platform bus functions that override the weak symbols for:
       - platform_pm_runtime_suspend()
       - platform_pm_runtime_resume()
       - platform_pm_runtime_idle()
      
      This Runtime PM implementation performs two levels of power
      management. At the time of platform bus runtime suspend the
      clock to the device is stopped instantly. Later on if all
      devices within the power domain has their clocks stopped
      then the device driver ->runtime_suspend() callbacks are
      used to save hardware register state for each device.
      
      Device driver ->runtime_suspend() calls are scheduled from
      cpuidle context using platform_pm_runtime_suspend_idle().
      When all devices have been fully suspended the processor
      is allowed to enter deep sleep from cpuidle.
      
      The runtime resume operation turns on clocks and also
      restores registers if needed. It is worth noting that the
      devices start in a suspended state and the device driver
      is responsible for calling runtime resume before accessing
      the actual hardware.
      
      In this particular platform bus implementation runtime
      resume is not allowed from interrupt context. Runtime
      suspend is however allowed from interrupt context as
      long as the synchronous functions are avoided.
      
      [ updated for v17 -- PFM. ]
      Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      6a93dde1
    • Paul Mundt's avatar
      Merge branch 'sh/hwblk' into sh/pm-runtime · 0858d9c0
      Paul Mundt authored
      0858d9c0
  3. 22 Aug, 2009 8 commits
  4. 21 Aug, 2009 18 commits