diff mbox series

[v3,05/11] s390x/misc_helper.c: wrap IO instructions in BQL

Message ID 20170307155054.5833-6-alex.bennee@linaro.org
State Superseded
Headers show
Series MTTCG fix-ups for 2.9 | expand

Commit Message

Alex Bennée March 7, 2017, 3:50 p.m. UTC
Helpers that can trigger IO events (including interrupts) need to be
protected by the BQL. I've updated all the helpers that call into an
ioinst_handle_* functions.

Reported-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
 target/s390x/misc_helper.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

-- 
2.11.0

Comments

Philippe Mathieu-Daudé March 7, 2017, 5:46 p.m. UTC | #1
On 03/07/2017 12:50 PM, Alex Bennée wrote:
> Helpers that can trigger IO events (including interrupts) need to be

> protected by the BQL. I've updated all the helpers that call into an

> ioinst_handle_* functions.

>

> Reported-by: Thomas Huth <thuth@redhat.com>

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>


Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


> ---

>  target/s390x/misc_helper.c | 21 +++++++++++++++++++++

>  1 file changed, 21 insertions(+)

>

> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c

> index 3cb942e8bb..93b0e61366 100644

> --- a/target/s390x/misc_helper.c

> +++ b/target/s390x/misc_helper.c

> @@ -19,6 +19,7 @@

>   */

>

>  #include "qemu/osdep.h"

> +#include "qemu/main-loop.h"

>  #include "cpu.h"

>  #include "exec/memory.h"

>  #include "qemu/host-utils.h"

> @@ -551,61 +552,81 @@ uint32_t HELPER(sigp)(CPUS390XState *env, uint64_t order_code, uint32_t r1,

>  void HELPER(xsch)(CPUS390XState *env, uint64_t r1)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_xsch(cpu, r1);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(csch)(CPUS390XState *env, uint64_t r1)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_csch(cpu, r1);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(hsch)(CPUS390XState *env, uint64_t r1)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_hsch(cpu, r1);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(msch)(CPUS390XState *env, uint64_t r1, uint64_t inst)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_msch(cpu, r1, inst >> 16);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(rchp)(CPUS390XState *env, uint64_t r1)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_rchp(cpu, r1);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(rsch)(CPUS390XState *env, uint64_t r1)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_rsch(cpu, r1);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(ssch)(CPUS390XState *env, uint64_t r1, uint64_t inst)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_ssch(cpu, r1, inst >> 16);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(stsch)(CPUS390XState *env, uint64_t r1, uint64_t inst)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_stsch(cpu, r1, inst >> 16);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(tsch)(CPUS390XState *env, uint64_t r1, uint64_t inst)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_tsch(cpu, r1, inst >> 16);

> +    qemu_mutex_unlock_iothread();

>  }

>

>  void HELPER(chsc)(CPUS390XState *env, uint64_t inst)

>  {

>      S390CPU *cpu = s390_env_get_cpu(env);

> +    qemu_mutex_lock_iothread();

>      ioinst_handle_chsc(cpu, inst >> 16);

> +    qemu_mutex_unlock_iothread();

>  }

>  #endif

>

>
diff mbox series

Patch

diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 3cb942e8bb..93b0e61366 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -19,6 +19,7 @@ 
  */
 
 #include "qemu/osdep.h"
+#include "qemu/main-loop.h"
 #include "cpu.h"
 #include "exec/memory.h"
 #include "qemu/host-utils.h"
@@ -551,61 +552,81 @@  uint32_t HELPER(sigp)(CPUS390XState *env, uint64_t order_code, uint32_t r1,
 void HELPER(xsch)(CPUS390XState *env, uint64_t r1)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_xsch(cpu, r1);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(csch)(CPUS390XState *env, uint64_t r1)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_csch(cpu, r1);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(hsch)(CPUS390XState *env, uint64_t r1)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_hsch(cpu, r1);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(msch)(CPUS390XState *env, uint64_t r1, uint64_t inst)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_msch(cpu, r1, inst >> 16);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(rchp)(CPUS390XState *env, uint64_t r1)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_rchp(cpu, r1);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(rsch)(CPUS390XState *env, uint64_t r1)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_rsch(cpu, r1);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(ssch)(CPUS390XState *env, uint64_t r1, uint64_t inst)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_ssch(cpu, r1, inst >> 16);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(stsch)(CPUS390XState *env, uint64_t r1, uint64_t inst)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_stsch(cpu, r1, inst >> 16);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(tsch)(CPUS390XState *env, uint64_t r1, uint64_t inst)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_tsch(cpu, r1, inst >> 16);
+    qemu_mutex_unlock_iothread();
 }
 
 void HELPER(chsc)(CPUS390XState *env, uint64_t inst)
 {
     S390CPU *cpu = s390_env_get_cpu(env);
+    qemu_mutex_lock_iothread();
     ioinst_handle_chsc(cpu, inst >> 16);
+    qemu_mutex_unlock_iothread();
 }
 #endif