From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:33947) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SD2c7-0004zt-A0 for qemu-devel@nongnu.org; Wed, 28 Mar 2012 19:49:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SD0b1-0004ac-EO for qemu-devel@nongnu.org; Wed, 28 Mar 2012 17:40:05 -0400 From: David Gibson Date: Thu, 29 Mar 2012 08:39:47 +1100 Message-Id: <1332970787-14598-3-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1332970787-14598-1-git-send-email-david@gibson.dropbear.id.au> References: <1332970787-14598-1-git-send-email-david@gibson.dropbear.id.au> Subject: [Qemu-devel] [PATCH 3/3] pseries: Implement RTAS system-reboot call List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: afaerber@suse.de Cc: scottwood@freescale.com, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson This patch adds the PAPR defined RTAS system-reboot call to the pseries machine emulation, providing the guest with a way to trigger a reboot. This exposes a bug in the pseries VIO code which means CRQs are not properly reset on a system reset. This patch also fixes that bug by adding a suitable reset handler. Signed-off-by: David Gibson --- hw/spapr_rtas.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c index 0946585..480a4ae 100644 --- a/hw/spapr_rtas.c +++ b/hw/spapr_rtas.c @@ -112,6 +112,19 @@ static void rtas_power_off(sPAPREnvironment *spapr, rtas_st(rets, 0, 0); } +static void rtas_system_reboot(sPAPREnvironment *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, + uint32_t nret, target_ulong rets) +{ + if (nargs != 0 || nret != 1) { + rtas_st(rets, 0, -3); + return; + } + qemu_system_reset_request(); + rtas_st(rets, 0, 0); +} + static void rtas_query_cpu_stopped_state(sPAPREnvironment *spapr, uint32_t token, uint32_t nargs, target_ulong args, @@ -294,6 +307,7 @@ static void core_rtas_register_types(void) spapr_rtas_register("get-time-of-day", rtas_get_time_of_day); spapr_rtas_register("set-time-of-day", rtas_set_time_of_day); spapr_rtas_register("power-off", rtas_power_off); + spapr_rtas_register("system-reboot", rtas_system_reboot); spapr_rtas_register("query-cpu-stopped-state", rtas_query_cpu_stopped_state); spapr_rtas_register("start-cpu", rtas_start_cpu); -- 1.7.9.1