]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Aug 2022 11:45:04 +0000 (13:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Aug 2022 11:45:04 +0000 (13:45 +0200)
added patches:
asoc-tas2770-allow-mono-streams.patch
asoc-tas2770-drop-conflicting-set_bias_level-power-setting.patch
asoc-tas2770-fix-handling-of-mute-unmute.patch
asoc-tas2770-set-correct-fsync-polarity.patch
iavf-fix-adminq-error-handling.patch
nios2-add-force_successful_syscall_return.patch
nios2-don-t-leave-nulls-in-sys_call_table.patch
nios2-fix-syscall-restart-checks.patch
nios2-page-fault-et.al.-are-not-restartable-syscalls.patch
nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch
nios2-traced-syscall-does-need-to-check-the-syscall-number.patch

12 files changed:
queue-5.10/asoc-tas2770-allow-mono-streams.patch [new file with mode: 0644]
queue-5.10/asoc-tas2770-drop-conflicting-set_bias_level-power-setting.patch [new file with mode: 0644]
queue-5.10/asoc-tas2770-fix-handling-of-mute-unmute.patch [new file with mode: 0644]
queue-5.10/asoc-tas2770-set-correct-fsync-polarity.patch [new file with mode: 0644]
queue-5.10/iavf-fix-adminq-error-handling.patch [new file with mode: 0644]
queue-5.10/nios2-add-force_successful_syscall_return.patch [new file with mode: 0644]
queue-5.10/nios2-don-t-leave-nulls-in-sys_call_table.patch [new file with mode: 0644]
queue-5.10/nios2-fix-syscall-restart-checks.patch [new file with mode: 0644]
queue-5.10/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch [new file with mode: 0644]
queue-5.10/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch [new file with mode: 0644]
queue-5.10/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch [new file with mode: 0644]
queue-5.10/series

diff --git a/queue-5.10/asoc-tas2770-allow-mono-streams.patch b/queue-5.10/asoc-tas2770-allow-mono-streams.patch
new file mode 100644 (file)
index 0000000..fae4e0f
--- /dev/null
@@ -0,0 +1,35 @@
+From bf54d97a835dfe62d4d29e245e170c63d0089be7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
+Date: Mon, 8 Aug 2022 16:12:44 +0200
+Subject: ASoC: tas2770: Allow mono streams
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Martin Povišer <povik+lin@cutebit.org>
+
+commit bf54d97a835dfe62d4d29e245e170c63d0089be7 upstream.
+
+The part is a mono speaker amp, but it can do downmix and switch between
+left and right channel, so the right channel range is 1 to 2.
+
+Fixes: 1a476abc723e ("tas2770: add tas2770 smart PA kernel driver")
+Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
+Link: https://lore.kernel.org/r/20220808141246.5749-3-povik+lin@cutebit.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/codecs/tas2770.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/sound/soc/codecs/tas2770.c
++++ b/sound/soc/codecs/tas2770.c
+@@ -507,7 +507,7 @@ static struct snd_soc_dai_driver tas2770
+               .id = 0,
+               .playback = {
+                       .stream_name    = "ASI1 Playback",
+-                      .channels_min   = 2,
++                      .channels_min   = 1,
+                       .channels_max   = 2,
+                       .rates      = TAS2770_RATES,
+                       .formats    = TAS2770_FORMATS,
diff --git a/queue-5.10/asoc-tas2770-drop-conflicting-set_bias_level-power-setting.patch b/queue-5.10/asoc-tas2770-drop-conflicting-set_bias_level-power-setting.patch
new file mode 100644 (file)
index 0000000..e679ea3
--- /dev/null
@@ -0,0 +1,75 @@
+From 482c23fbc7e9bf5a7a74defd0735d5346215db58 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
+Date: Mon, 8 Aug 2022 16:12:45 +0200
+Subject: ASoC: tas2770: Drop conflicting set_bias_level power setting
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Martin Povišer <povik+lin@cutebit.org>
+
+commit 482c23fbc7e9bf5a7a74defd0735d5346215db58 upstream.
+
+The driver is setting the PWR_CTRL field in both the set_bias_level
+callback and on DAPM events of the DAC widget (and also in the
+mute_stream method). Drop the set_bias_level callback altogether as the
+power setting it does is in conflict with the other code paths.
+
+Fixes: 1a476abc723e ("tas2770: add tas2770 smart PA kernel driver")
+Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
+Link: https://lore.kernel.org/r/20220808141246.5749-4-povik+lin@cutebit.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/codecs/tas2770.c |   33 ---------------------------------
+ 1 file changed, 33 deletions(-)
+
+--- a/sound/soc/codecs/tas2770.c
++++ b/sound/soc/codecs/tas2770.c
+@@ -46,38 +46,6 @@ static void tas2770_reset(struct tas2770
+       usleep_range(1000, 2000);
+ }
+-static int tas2770_set_bias_level(struct snd_soc_component *component,
+-                               enum snd_soc_bias_level level)
+-{
+-      struct tas2770_priv *tas2770 =
+-                      snd_soc_component_get_drvdata(component);
+-
+-      switch (level) {
+-      case SND_SOC_BIAS_ON:
+-              snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                            TAS2770_PWR_CTRL_MASK,
+-                                            TAS2770_PWR_CTRL_ACTIVE);
+-              break;
+-      case SND_SOC_BIAS_STANDBY:
+-      case SND_SOC_BIAS_PREPARE:
+-              snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                            TAS2770_PWR_CTRL_MASK,
+-                                            TAS2770_PWR_CTRL_MUTE);
+-              break;
+-      case SND_SOC_BIAS_OFF:
+-              snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                            TAS2770_PWR_CTRL_MASK,
+-                                            TAS2770_PWR_CTRL_SHUTDOWN);
+-              break;
+-
+-      default:
+-              dev_err(tas2770->dev, "wrong power level setting %d\n", level);
+-              return -EINVAL;
+-      }
+-
+-      return 0;
+-}
+-
+ #ifdef CONFIG_PM
+ static int tas2770_codec_suspend(struct snd_soc_component *component)
+ {
+@@ -555,7 +523,6 @@ static const struct snd_soc_component_dr
+       .probe                  = tas2770_codec_probe,
+       .suspend                = tas2770_codec_suspend,
+       .resume                 = tas2770_codec_resume,
+-      .set_bias_level = tas2770_set_bias_level,
+       .controls               = tas2770_snd_controls,
+       .num_controls           = ARRAY_SIZE(tas2770_snd_controls),
+       .dapm_widgets           = tas2770_dapm_widgets,
diff --git a/queue-5.10/asoc-tas2770-fix-handling-of-mute-unmute.patch b/queue-5.10/asoc-tas2770-fix-handling-of-mute-unmute.patch
new file mode 100644 (file)
index 0000000..6464abb
--- /dev/null
@@ -0,0 +1,135 @@
+From 1e5907bcb3a3b569be0a03ebe668bba2ed320a50 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
+Date: Mon, 8 Aug 2022 16:12:46 +0200
+Subject: ASoC: tas2770: Fix handling of mute/unmute
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Martin Povišer <povik+lin@cutebit.org>
+
+commit 1e5907bcb3a3b569be0a03ebe668bba2ed320a50 upstream.
+
+Because the PWR_CTRL field is modeled as the power state of the DAC
+widget, and at the same time it is used to implement mute/unmute, we
+need some additional book-keeping to have the right end result no matter
+the sequence of calls. Without this fix, one can mute an ongoing stream
+by toggling a speaker pin control.
+
+Fixes: 1a476abc723e ("tas2770: add tas2770 smart PA kernel driver")
+Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
+Link: https://lore.kernel.org/r/20220808141246.5749-5-povik+lin@cutebit.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/codecs/tas2770.c |   57 +++++++++++++++++++++++----------------------
+ sound/soc/codecs/tas2770.h |    2 +
+ 2 files changed, 32 insertions(+), 27 deletions(-)
+
+--- a/sound/soc/codecs/tas2770.c
++++ b/sound/soc/codecs/tas2770.c
+@@ -46,6 +46,26 @@ static void tas2770_reset(struct tas2770
+       usleep_range(1000, 2000);
+ }
++static int tas2770_update_pwr_ctrl(struct tas2770_priv *tas2770)
++{
++      struct snd_soc_component *component = tas2770->component;
++      unsigned int val;
++      int ret;
++
++      if (tas2770->dac_powered)
++              val = tas2770->unmuted ?
++                      TAS2770_PWR_CTRL_ACTIVE : TAS2770_PWR_CTRL_MUTE;
++      else
++              val = TAS2770_PWR_CTRL_SHUTDOWN;
++
++      ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
++                                          TAS2770_PWR_CTRL_MASK, val);
++      if (ret < 0)
++              return ret;
++
++      return 0;
++}
++
+ #ifdef CONFIG_PM
+ static int tas2770_codec_suspend(struct snd_soc_component *component)
+ {
+@@ -82,9 +102,7 @@ static int tas2770_codec_resume(struct s
+               gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
+               usleep_range(1000, 2000);
+       } else {
+-              ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                                  TAS2770_PWR_CTRL_MASK,
+-                                                  TAS2770_PWR_CTRL_ACTIVE);
++              ret = tas2770_update_pwr_ctrl(tas2770);
+               if (ret < 0)
+                       return ret;
+       }
+@@ -120,24 +138,19 @@ static int tas2770_dac_event(struct snd_
+       switch (event) {
+       case SND_SOC_DAPM_POST_PMU:
+-              ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                                  TAS2770_PWR_CTRL_MASK,
+-                                                  TAS2770_PWR_CTRL_MUTE);
++              tas2770->dac_powered = 1;
++              ret = tas2770_update_pwr_ctrl(tas2770);
+               break;
+       case SND_SOC_DAPM_PRE_PMD:
+-              ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                                  TAS2770_PWR_CTRL_MASK,
+-                                                  TAS2770_PWR_CTRL_SHUTDOWN);
++              tas2770->dac_powered = 0;
++              ret = tas2770_update_pwr_ctrl(tas2770);
+               break;
+       default:
+               dev_err(tas2770->dev, "Not supported evevt\n");
+               return -EINVAL;
+       }
+-      if (ret < 0)
+-              return ret;
+-
+-      return 0;
++      return ret;
+ }
+ static const struct snd_kcontrol_new isense_switch =
+@@ -171,21 +184,11 @@ static const struct snd_soc_dapm_route t
+ static int tas2770_mute(struct snd_soc_dai *dai, int mute, int direction)
+ {
+       struct snd_soc_component *component = dai->component;
+-      int ret;
+-
+-      if (mute)
+-              ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                                  TAS2770_PWR_CTRL_MASK,
+-                                                  TAS2770_PWR_CTRL_MUTE);
+-      else
+-              ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
+-                                                  TAS2770_PWR_CTRL_MASK,
+-                                                  TAS2770_PWR_CTRL_ACTIVE);
+-
+-      if (ret < 0)
+-              return ret;
++      struct tas2770_priv *tas2770 =
++                      snd_soc_component_get_drvdata(component);
+-      return 0;
++      tas2770->unmuted = !mute;
++      return tas2770_update_pwr_ctrl(tas2770);
+ }
+ static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)
+--- a/sound/soc/codecs/tas2770.h
++++ b/sound/soc/codecs/tas2770.h
+@@ -138,6 +138,8 @@ struct tas2770_priv {
+       struct device *dev;
+       int v_sense_slot;
+       int i_sense_slot;
++      bool dac_powered;
++      bool unmuted;
+ };
+ #endif /* __TAS2770__ */
diff --git a/queue-5.10/asoc-tas2770-set-correct-fsync-polarity.patch b/queue-5.10/asoc-tas2770-set-correct-fsync-polarity.patch
new file mode 100644 (file)
index 0000000..be8f3b2
--- /dev/null
@@ -0,0 +1,99 @@
+From e9ac31f0a5d0e246b046c20348954519f91a297f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
+Date: Mon, 8 Aug 2022 16:12:43 +0200
+Subject: ASoC: tas2770: Set correct FSYNC polarity
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Martin Povišer <povik+lin@cutebit.org>
+
+commit e9ac31f0a5d0e246b046c20348954519f91a297f upstream.
+
+Fix setting of FSYNC polarity for DAI formats other than I2S. Also
+add support for polarity inversion.
+
+Fixes: 1a476abc723e ("tas2770: add tas2770 smart PA kernel driver")
+Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
+Link: https://lore.kernel.org/r/20220808141246.5749-2-povik+lin@cutebit.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/codecs/tas2770.c |   20 +++++++++++++++++++-
+ sound/soc/codecs/tas2770.h |    3 +++
+ 2 files changed, 22 insertions(+), 1 deletion(-)
+
+--- a/sound/soc/codecs/tas2770.c
++++ b/sound/soc/codecs/tas2770.c
+@@ -337,7 +337,7 @@ static int tas2770_set_fmt(struct snd_so
+       struct snd_soc_component *component = dai->component;
+       struct tas2770_priv *tas2770 =
+                       snd_soc_component_get_drvdata(component);
+-      u8 tdm_rx_start_slot = 0, asi_cfg_1 = 0;
++      u8 tdm_rx_start_slot = 0, invert_fpol = 0, fpol_preinv = 0, asi_cfg_1 = 0;
+       int ret;
+       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+@@ -349,9 +349,15 @@ static int tas2770_set_fmt(struct snd_so
+       }
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
++      case SND_SOC_DAIFMT_NB_IF:
++              invert_fpol = 1;
++              fallthrough;
+       case SND_SOC_DAIFMT_NB_NF:
+               asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_RSING;
+               break;
++      case SND_SOC_DAIFMT_IB_IF:
++              invert_fpol = 1;
++              fallthrough;
+       case SND_SOC_DAIFMT_IB_NF:
+               asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_FALING;
+               break;
+@@ -369,15 +375,19 @@ static int tas2770_set_fmt(struct snd_so
+       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+       case SND_SOC_DAIFMT_I2S:
+               tdm_rx_start_slot = 1;
++              fpol_preinv = 0;
+               break;
+       case SND_SOC_DAIFMT_DSP_A:
+               tdm_rx_start_slot = 0;
++              fpol_preinv = 1;
+               break;
+       case SND_SOC_DAIFMT_DSP_B:
+               tdm_rx_start_slot = 1;
++              fpol_preinv = 1;
+               break;
+       case SND_SOC_DAIFMT_LEFT_J:
+               tdm_rx_start_slot = 0;
++              fpol_preinv = 1;
+               break;
+       default:
+               dev_err(tas2770->dev,
+@@ -391,6 +401,14 @@ static int tas2770_set_fmt(struct snd_so
+       if (ret < 0)
+               return ret;
++      ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0,
++                                          TAS2770_TDM_CFG_REG0_FPOL_MASK,
++                                          (fpol_preinv ^ invert_fpol)
++                                           ? TAS2770_TDM_CFG_REG0_FPOL_RSING
++                                           : TAS2770_TDM_CFG_REG0_FPOL_FALING);
++      if (ret < 0)
++              return ret;
++
+       return 0;
+ }
+--- a/sound/soc/codecs/tas2770.h
++++ b/sound/soc/codecs/tas2770.h
+@@ -41,6 +41,9 @@
+ #define TAS2770_TDM_CFG_REG0_31_44_1_48KHZ  0x6
+ #define TAS2770_TDM_CFG_REG0_31_88_2_96KHZ  0x8
+ #define TAS2770_TDM_CFG_REG0_31_176_4_192KHZ  0xa
++#define TAS2770_TDM_CFG_REG0_FPOL_MASK  BIT(0)
++#define TAS2770_TDM_CFG_REG0_FPOL_RSING  0
++#define TAS2770_TDM_CFG_REG0_FPOL_FALING  1
+     /* TDM Configuration Reg1 */
+ #define TAS2770_TDM_CFG_REG1  TAS2770_REG(0X0, 0x0B)
+ #define TAS2770_TDM_CFG_REG1_MASK     GENMASK(5, 1)
diff --git a/queue-5.10/iavf-fix-adminq-error-handling.patch b/queue-5.10/iavf-fix-adminq-error-handling.patch
new file mode 100644 (file)
index 0000000..32f7a33
--- /dev/null
@@ -0,0 +1,82 @@
+From 419831617ed349992c84344dbd9e627f9e68f842 Mon Sep 17 00:00:00 2001
+From: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
+Date: Tue, 19 Jul 2022 11:16:52 +0200
+Subject: iavf: Fix adminq error handling
+
+From: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
+
+commit 419831617ed349992c84344dbd9e627f9e68f842 upstream.
+
+iavf_alloc_asq_bufs/iavf_alloc_arq_bufs allocates with dma_alloc_coherent
+memory for VF mailbox.
+Free DMA regions for both ASQ and ARQ in case error happens during
+configuration of ASQ/ARQ registers.
+Without this change it is possible to see when unloading interface:
+74626.583369: dma_debug_device_change: device driver has pending DMA allocations while released from device [count=32]
+One of leaked entries details: [device address=0x0000000b27ff9000] [size=4096 bytes] [mapped with DMA_BIDIRECTIONAL] [mapped as coherent]
+
+Fixes: d358aa9a7a2d ("i40evf: init code and hardware support")
+Signed-off-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
+Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+Tested-by: Marek Szlosek <marek.szlosek@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/intel/iavf/iavf_adminq.c |   15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/intel/iavf/iavf_adminq.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_adminq.c
+@@ -324,6 +324,7 @@ static enum iavf_status iavf_config_arq_
+ static enum iavf_status iavf_init_asq(struct iavf_hw *hw)
+ {
+       enum iavf_status ret_code = 0;
++      int i;
+       if (hw->aq.asq.count > 0) {
+               /* queue already initialized */
+@@ -354,12 +355,17 @@ static enum iavf_status iavf_init_asq(st
+       /* initialize base registers */
+       ret_code = iavf_config_asq_regs(hw);
+       if (ret_code)
+-              goto init_adminq_free_rings;
++              goto init_free_asq_bufs;
+       /* success! */
+       hw->aq.asq.count = hw->aq.num_asq_entries;
+       goto init_adminq_exit;
++init_free_asq_bufs:
++      for (i = 0; i < hw->aq.num_asq_entries; i++)
++              iavf_free_dma_mem(hw, &hw->aq.asq.r.asq_bi[i]);
++      iavf_free_virt_mem(hw, &hw->aq.asq.dma_head);
++
+ init_adminq_free_rings:
+       iavf_free_adminq_asq(hw);
+@@ -383,6 +389,7 @@ init_adminq_exit:
+ static enum iavf_status iavf_init_arq(struct iavf_hw *hw)
+ {
+       enum iavf_status ret_code = 0;
++      int i;
+       if (hw->aq.arq.count > 0) {
+               /* queue already initialized */
+@@ -413,12 +420,16 @@ static enum iavf_status iavf_init_arq(st
+       /* initialize base registers */
+       ret_code = iavf_config_arq_regs(hw);
+       if (ret_code)
+-              goto init_adminq_free_rings;
++              goto init_free_arq_bufs;
+       /* success! */
+       hw->aq.arq.count = hw->aq.num_arq_entries;
+       goto init_adminq_exit;
++init_free_arq_bufs:
++      for (i = 0; i < hw->aq.num_arq_entries; i++)
++              iavf_free_dma_mem(hw, &hw->aq.arq.r.arq_bi[i]);
++      iavf_free_virt_mem(hw, &hw->aq.arq.dma_head);
+ init_adminq_free_rings:
+       iavf_free_adminq_arq(hw);
diff --git a/queue-5.10/nios2-add-force_successful_syscall_return.patch b/queue-5.10/nios2-add-force_successful_syscall_return.patch
new file mode 100644 (file)
index 0000000..e73fb22
--- /dev/null
@@ -0,0 +1,61 @@
+From fd0c153daad135d0ec1a53c5dbe6936a724d6ae1 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:09:45 +0100
+Subject: nios2: add force_successful_syscall_return()
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit fd0c153daad135d0ec1a53c5dbe6936a724d6ae1 upstream.
+
+If we use the ancient SysV syscall ABI, we'd better have tell the
+kernel how to claim that a negative return value is a success.
+Use ->orig_r2 for that - it's inaccessible via ptrace, so it's
+a fair game for changes and it's normally[*] non-negative on return
+from syscall.  Set to -1; syscall is not going to be restart-worthy
+by definition, so we won't interfere with that use either.
+
+[*] the only exception is rt_sigreturn(), where we skip the entire
+messing with r1/r2 anyway.
+
+Fixes: 82ed08dd1b0e ("nios2: Exception handling")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/include/asm/ptrace.h |    2 ++
+ arch/nios2/kernel/entry.S       |    6 ++++++
+ 2 files changed, 8 insertions(+)
+
+--- a/arch/nios2/include/asm/ptrace.h
++++ b/arch/nios2/include/asm/ptrace.h
+@@ -74,6 +74,8 @@ extern void show_regs(struct pt_regs *);
+       ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE)\
+               - 1)
++#define force_successful_syscall_return() (current_pt_regs()->orig_r2 = -1)
++
+ int do_syscall_trace_enter(void);
+ void do_syscall_trace_exit(void);
+ #endif /* __ASSEMBLY__ */
+--- a/arch/nios2/kernel/entry.S
++++ b/arch/nios2/kernel/entry.S
+@@ -213,6 +213,9 @@ local_restart:
+ translate_rc_and_ret:
+       movi    r1, 0
+       bge     r2, zero, 3f
++      ldw     r1, PT_ORIG_R2(sp)
++      addi    r1, r1, 1
++      beq     r1, zero, 3f
+       sub     r2, zero, r2
+       movi    r1, 1
+ 3:
+@@ -276,6 +279,9 @@ traced_system_call:
+ translate_rc_and_ret2:
+       movi    r1, 0
+       bge     r2, zero, 4f
++      ldw     r1, PT_ORIG_R2(sp)
++      addi    r1, r1, 1
++      beq     r1, zero, 4f
+       sub     r2, zero, r2
+       movi    r1, 1
+ 4:
diff --git a/queue-5.10/nios2-don-t-leave-nulls-in-sys_call_table.patch b/queue-5.10/nios2-don-t-leave-nulls-in-sys_call_table.patch
new file mode 100644 (file)
index 0000000..a83b33b
--- /dev/null
@@ -0,0 +1,39 @@
+From 45ec746c65097c25e77d24eae8fee0def5b6cc5d Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:06:46 +0100
+Subject: nios2: don't leave NULLs in sys_call_table[]
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit 45ec746c65097c25e77d24eae8fee0def5b6cc5d upstream.
+
+fill the gaps in there with sys_ni_syscall, as everyone does...
+
+Fixes: 82ed08dd1b0e ("nios2: Exception handling")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/kernel/entry.S         |    1 -
+ arch/nios2/kernel/syscall_table.c |    1 +
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/nios2/kernel/entry.S
++++ b/arch/nios2/kernel/entry.S
+@@ -193,7 +193,6 @@ local_restart:
+       movhi   r11, %hiadj(sys_call_table)
+       add     r1, r1, r11
+       ldw     r1, %lo(sys_call_table)(r1)
+-      beq     r1, r0, ret_invsyscall
+       /* Check if we are being traced */
+       GET_THREAD_INFO r11
+--- a/arch/nios2/kernel/syscall_table.c
++++ b/arch/nios2/kernel/syscall_table.c
+@@ -13,5 +13,6 @@
+ #define __SYSCALL(nr, call) [nr] = (call),
+ void *sys_call_table[__NR_syscalls] = {
++      [0 ... __NR_syscalls-1] = sys_ni_syscall,
+ #include <asm/unistd.h>
+ };
diff --git a/queue-5.10/nios2-fix-syscall-restart-checks.patch b/queue-5.10/nios2-fix-syscall-restart-checks.patch
new file mode 100644 (file)
index 0000000..7bf7775
--- /dev/null
@@ -0,0 +1,35 @@
+From 2d631bd58fe0ea3e3350212e23c9aba1fb606514 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:08:48 +0100
+Subject: nios2: fix syscall restart checks
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit 2d631bd58fe0ea3e3350212e23c9aba1fb606514 upstream.
+
+sys_foo() returns -512 (aka -ERESTARTSYS) => do_signal() sees
+512 in r2 and 1 in r1.
+
+sys_foo() returns 512 => do_signal() sees 512 in r2 and 0 in r1.
+
+The former is restart-worthy; the latter obviously isn't.
+
+Fixes: b53e906d255d ("nios2: Signal handling support")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/kernel/signal.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/nios2/kernel/signal.c
++++ b/arch/nios2/kernel/signal.c
+@@ -242,7 +242,7 @@ static int do_signal(struct pt_regs *reg
+       /*
+        * If we were from a system call, check for system call restarting...
+        */
+-      if (regs->orig_r2 >= 0) {
++      if (regs->orig_r2 >= 0 && regs->r1) {
+               continue_addr = regs->ea;
+               restart_addr = continue_addr - 4;
+               retval = regs->r2;
diff --git a/queue-5.10/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch b/queue-5.10/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch
new file mode 100644 (file)
index 0000000..fc2926a
--- /dev/null
@@ -0,0 +1,53 @@
+From 8535c239ac674f7ead0f2652932d35c52c4123b2 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:06:04 +0100
+Subject: nios2: page fault et.al. are *not* restartable syscalls...
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit 8535c239ac674f7ead0f2652932d35c52c4123b2 upstream.
+
+make sure that ->orig_r2 is negative for everything except
+the syscalls.
+
+Fixes: 82ed08dd1b0e ("nios2: Exception handling")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/include/asm/entry.h |    3 ++-
+ arch/nios2/kernel/entry.S      |    4 +---
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+--- a/arch/nios2/include/asm/entry.h
++++ b/arch/nios2/include/asm/entry.h
+@@ -50,7 +50,8 @@
+       stw     r13, PT_R13(sp)
+       stw     r14, PT_R14(sp)
+       stw     r15, PT_R15(sp)
+-      stw     r2, PT_ORIG_R2(sp)
++      movi    r24, -1
++      stw     r24, PT_ORIG_R2(sp)
+       stw     r7, PT_ORIG_R7(sp)
+       stw     ra, PT_RA(sp)
+--- a/arch/nios2/kernel/entry.S
++++ b/arch/nios2/kernel/entry.S
+@@ -185,6 +185,7 @@ ENTRY(handle_system_call)
+       ldw     r5, PT_R5(sp)
+ local_restart:
++      stw     r2, PT_ORIG_R2(sp)
+       /* Check that the requested system call is within limits */
+       movui   r1, __NR_syscalls
+       bgeu    r2, r1, ret_invsyscall
+@@ -336,9 +337,6 @@ external_interrupt:
+       /* skip if no interrupt is pending */
+       beq     r12, r0, ret_from_interrupt
+-      movi    r24, -1
+-      stw     r24, PT_ORIG_R2(sp)
+-
+       /*
+        * Process an external hardware interrupt.
+        */
diff --git a/queue-5.10/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch b/queue-5.10/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch
new file mode 100644 (file)
index 0000000..4c06ad1
--- /dev/null
@@ -0,0 +1,27 @@
+From 411a76b7219555c55867466c82d70ce928d6c9e1 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:09:16 +0100
+Subject: nios2: restarts apply only to the first sigframe we build...
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit 411a76b7219555c55867466c82d70ce928d6c9e1 upstream.
+
+Fixes: b53e906d255d ("nios2: Signal handling support")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/kernel/signal.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/nios2/kernel/signal.c
++++ b/arch/nios2/kernel/signal.c
+@@ -264,6 +264,7 @@ static int do_signal(struct pt_regs *reg
+                       regs->ea = restart_addr;
+                       break;
+               }
++              regs->orig_r2 = -1;
+       }
+       if (get_signal(&ksig)) {
diff --git a/queue-5.10/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch b/queue-5.10/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch
new file mode 100644 (file)
index 0000000..8b6a0e8
--- /dev/null
@@ -0,0 +1,47 @@
+From 25ba820ef36bdbaf9884adeac69b6e1821a7df76 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 8 Aug 2022 16:07:21 +0100
+Subject: nios2: traced syscall does need to check the syscall number
+
+From: Al Viro <viro@zeniv.linux.org.uk>
+
+commit 25ba820ef36bdbaf9884adeac69b6e1821a7df76 upstream.
+
+all checks done before letting the tracer modify the register
+state are worthless...
+
+Fixes: 82ed08dd1b0e ("nios2: Exception handling")
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/nios2/kernel/entry.S |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+--- a/arch/nios2/kernel/entry.S
++++ b/arch/nios2/kernel/entry.S
+@@ -255,9 +255,9 @@ traced_system_call:
+       ldw     r6, PT_R6(sp)
+       ldw     r7, PT_R7(sp)
+-      /* Fetch the syscall function, we don't need to check the boundaries
+-       * since this is already done.
+-       */
++      /* Fetch the syscall function. */
++      movui   r1, __NR_syscalls
++      bgeu    r2, r1, traced_invsyscall
+       slli    r1, r2, 2
+       movhi   r11,%hiadj(sys_call_table)
+       add     r1, r1, r11
+@@ -287,6 +287,11 @@ end_translate_rc_and_ret2:
+       RESTORE_SWITCH_STACK
+       br      ret_from_exception
++      /* If the syscall number was invalid return ENOSYS */
++traced_invsyscall:
++      movi    r2, -ENOSYS
++      br      translate_rc_and_ret2
++
+ Luser_return:
+       GET_THREAD_INFO r11                     /* get thread_info pointer */
+       ldw     r10, TI_FLAGS(r11)              /* get thread_info->flags */
index ac8d3d9d4ad2340d56309fec1e97b33af1a519ac..d2b1bd6192e08f6d480c60b005162333a203e8b3 100644 (file)
@@ -61,3 +61,14 @@ atm-idt77252-fix-use-after-free-bugs-caused-by-tst_timer.patch
 geneve-fix-tos-inheriting-for-ipv4.patch
 perf-probe-fix-an-error-handling-path-in-parse_perf_probe_command.patch
 dpaa2-eth-trace-the-allocated-address-instead-of-page-struct.patch
+nios2-page-fault-et.al.-are-not-restartable-syscalls.patch
+nios2-don-t-leave-nulls-in-sys_call_table.patch
+nios2-traced-syscall-does-need-to-check-the-syscall-number.patch
+nios2-fix-syscall-restart-checks.patch
+nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch
+nios2-add-force_successful_syscall_return.patch
+iavf-fix-adminq-error-handling.patch
+asoc-tas2770-set-correct-fsync-polarity.patch
+asoc-tas2770-allow-mono-streams.patch
+asoc-tas2770-drop-conflicting-set_bias_level-power-setting.patch
+asoc-tas2770-fix-handling-of-mute-unmute.patch