Patchwork [RFC] Wire up disabled wait a panicked event on s390

login
register
mail settings
Submitter Christian Borntraeger
Date April 5, 2013, 8:42 a.m.
Message ID <515E8E7E.8060504@de.ibm.com>
Download mbox | patch
Permalink /patch/234066/
State New
Headers show

Comments

Christian Borntraeger - April 5, 2013, 8:42 a.m.
On s390 the disabled wait state indicates a state of attention.
For example Linux uses that state after a panic. Lets
put the system into panicked state.

An alternative implementation would be to state
disabled-wait <address> instead of pause in the action field.
(e.g. z/OS, z/VM and other classic OSes use the address of the
disabled wait to indicate an error code).

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 target-s390x/kvm.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
Luiz Capitulino - April 5, 2013, 1:15 p.m.
On Fri, 05 Apr 2013 10:42:38 +0200
Christian Borntraeger <borntraeger@de.ibm.com> wrote:

> On s390 the disabled wait state indicates a state of attention.
> For example Linux uses that state after a panic. Lets
> put the system into panicked state.
> 
> An alternative implementation would be to state
> disabled-wait <address> instead of pause in the action field.
> (e.g. z/OS, z/VM and other classic OSes use the address of the
> disabled wait to indicate an error code).
> 
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  target-s390x/kvm.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index 644f484..0c111f0 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -34,6 +34,8 @@
>  #include "sysemu/kvm.h"
>  #include "cpu.h"
>  #include "sysemu/device_tree.h"
> +#include "qapi/qmp/qjson.h"
> +#include "monitor/monitor.h"
>  
>  /* #define DEBUG_KVM */
>  
> @@ -705,9 +707,18 @@ static int handle_intercept(S390CPU *cpu)
>              r = handle_instruction(cpu, run);
>              break;
>          case ICPT_WAITPSW:
> -            if (s390_del_running_cpu(cpu) == 0 &&
> -                is_special_wait_psw(cs)) {
> -                qemu_system_shutdown_request();
> +            /* disabled wait, since enabled wait is handled in kernel */
> +            if (s390_del_running_cpu(cpu) == 0) {
> +                if (is_special_wait_psw(cs)) {
> +                    qemu_system_shutdown_request();
> +                } else {
> +                    QObject *data;
> +
> +                    data = qobject_from_jsonf("{ 'action': %s }", "pause");
> +                    monitor_protocol_event(QEVENT_GUEST_PANICKED, data);
> +                    qobject_decref(data);
> +                    vm_stop(RUN_STATE_GUEST_PANICKED);

This is on top of the pvpanic device, right?

Seems good to me, although I don't remember the exact semantics of the
new event. Also, I think you could move this code to a function and
share it with the pvpanic device.

> +                }
>              }
>              r = EXCP_HALTED;
>              break;
>

Patch

diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 644f484..0c111f0 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -34,6 +34,8 @@ 
 #include "sysemu/kvm.h"
 #include "cpu.h"
 #include "sysemu/device_tree.h"
+#include "qapi/qmp/qjson.h"
+#include "monitor/monitor.h"
 
 /* #define DEBUG_KVM */
 
@@ -705,9 +707,18 @@  static int handle_intercept(S390CPU *cpu)
             r = handle_instruction(cpu, run);
             break;
         case ICPT_WAITPSW:
-            if (s390_del_running_cpu(cpu) == 0 &&
-                is_special_wait_psw(cs)) {
-                qemu_system_shutdown_request();
+            /* disabled wait, since enabled wait is handled in kernel */
+            if (s390_del_running_cpu(cpu) == 0) {
+                if (is_special_wait_psw(cs)) {
+                    qemu_system_shutdown_request();
+                } else {
+                    QObject *data;
+
+                    data = qobject_from_jsonf("{ 'action': %s }", "pause");
+                    monitor_protocol_event(QEVENT_GUEST_PANICKED, data);
+                    qobject_decref(data);
+                    vm_stop(RUN_STATE_GUEST_PANICKED);
+                }
             }
             r = EXCP_HALTED;
             break;