From nobody Tue Nov 11 14:22:54 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1563586224; cv=none; d=zoho.com; s=zohoarc; b=NtV60MZALqWZK/N7ymWVP4Lv4eR0cOr6Le2YZMdDfVhzysJlLKKPZBA2VxkbeftEIW8/LTlzJM9visxravygNzK9t6tNocu9uD/7s0tl+a7zlSIALflN9WPEDhzOmP/zt9lWzcMe6OvYo/UZ5YNF7n7AkATg5707QRUQixlFeZs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1563586224; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=6TpkIkNh0DTv+dm84yewllY1gTqasu2GUD4Tk1nYLrU=; b=I+1inLRN0eLl1p3reCZWTLcM1qQBZR3drkCSugLcams0YZ/mhJ3IZkdVwcC629h4sFa6V4zFkBqhEZ2wWvvskEro33KR+55bnbcWcuA3dK9ssxo7kCycOHluzGe+NMY1EB9urtmGSAjsT7LLMymXZgQBI9G4kq8Lc89zX4tCD8I= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156358622413456.358578975522846; Fri, 19 Jul 2019 18:30:24 -0700 (PDT) Received: from localhost ([::1]:49136 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hoeCd-0004O5-2u for importer@patchew.org; Fri, 19 Jul 2019 21:30:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44029) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hoeBv-0001WL-1Z for qemu-devel@nongnu.org; Fri, 19 Jul 2019 21:29:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hoeBt-0003ay-Nv for qemu-devel@nongnu.org; Fri, 19 Jul 2019 21:29:38 -0400 Received: from ozlabs.ru ([107.173.13.209]:59146) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hoeBt-0003ar-FS; Fri, 19 Jul 2019 21:29:37 -0400 Received: from fstn1-p1.ozlabs.ibm.com (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id 0A804AE807F4; Fri, 19 Jul 2019 21:28:59 -0400 (EDT) From: Alexey Kardashevskiy To: qemu-devel@nongnu.org Date: Sat, 20 Jul 2019 11:28:50 +1000 Message-Id: <20190720012850.14369-5-aik@ozlabs.ru> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190720012850.14369-1-aik@ozlabs.ru> References: <20190720012850.14369-1-aik@ozlabs.ru> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 107.173.13.209 Subject: [Qemu-devel] [PATCH qemu RFC 4/4] spapr: Implement SLOF-less client_architecture_support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paul Mackerras , Michael Ellerman , qemu-ppc@nongnu.org, Alexey Kardashevskiy , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" QEMU already implements H_CAS called by SLOF. The existing handler prepares a diff FDT and SLOF applies it on top of its current tree. In SLOF-less setup when the user explicitly selected "bios=3Dno", this updates the FDT from the OS, updates it and writes back to the OS. The new behavior is advertised to the OS via "/chosen/qemu,h_cas". Signed-off-by: Alexey Kardashevskiy --- include/hw/ppc/spapr.h | 5 +++++ hw/ppc/spapr.c | 24 ++++++++++++++++----- hw/ppc/spapr_hcall.c | 49 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 7f5d7a70d27e..73cd9cf25b83 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -766,9 +766,14 @@ struct SpaprEventLogEntry { =20 void spapr_events_init(SpaprMachineState *sm); void spapr_dt_events(SpaprMachineState *sm, void *fdt); +int spapr_h_cas_do_compose_response(SpaprMachineState *spapr, void *fdt, + SpaprOptionVector *ov5_updates); int spapr_h_cas_compose_response(SpaprMachineState *sm, target_ulong addr, target_ulong size, SpaprOptionVector *ov5_updates); +#define FDT_MAX_SIZE 0x100000 +void *spapr_build_fdt(SpaprMachineState *spapr); + void close_htab_fd(SpaprMachineState *spapr); void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr); void spapr_free_hpt(SpaprMachineState *spapr); diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b097a99951f1..f84895f4a8b4 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -978,6 +978,19 @@ static bool spapr_hotplugged_dev_before_cas(void) return false; } =20 +int spapr_h_cas_do_compose_response(SpaprMachineState *spapr, void *fdt, + SpaprOptionVector *ov5_updates) +{ + /* Fixup cpu nodes */ + _FDT((spapr_fixup_cpu_dt(fdt, spapr))); + + if (spapr_dt_cas_updates(spapr, fdt, ov5_updates)) { + return -1; + } + + return 0; +} + int spapr_h_cas_compose_response(SpaprMachineState *spapr, target_ulong addr, target_ulong size, SpaprOptionVector *ov5_updates) @@ -1009,10 +1022,7 @@ int spapr_h_cas_compose_response(SpaprMachineState *= spapr, _FDT((fdt_open_into(fdt_skel, fdt, size))); g_free(fdt_skel); =20 - /* Fixup cpu nodes */ - _FDT((spapr_fixup_cpu_dt(fdt, spapr))); - - if (spapr_dt_cas_updates(spapr, fdt, ov5_updates)) { + if (spapr_h_cas_do_compose_response(spapr, fdt, ov5_updates)) { return -1; } =20 @@ -1232,6 +1242,10 @@ static void spapr_dt_chosen(SpaprMachineState *spapr= , void *fdt) =20 /* We always implemented RTAS as hcall, tell guests to call it directl= y */ _FDT(fdt_setprop_cell(fdt, chosen, "qemu,h_rtas", 1)); + /* Tell the guest that H_CAS will return the entire FDT now, not the d= iff */ + if (!spapr->bios_enabled) { + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,h_cas", 1)); + } =20 spapr_dt_ov5_platform_support(spapr, fdt, chosen); =20 @@ -1262,7 +1276,7 @@ static void spapr_dt_hypervisor(SpaprMachineState *sp= apr, void *fdt) } } =20 -static void *spapr_build_fdt(SpaprMachineState *spapr) +void *spapr_build_fdt(SpaprMachineState *spapr) { MachineState *machine =3D MACHINE(spapr); MachineClass *mc =3D MACHINE_GET_CLASS(machine); diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index b964d94f330b..c5cb06c9d507 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -17,6 +17,7 @@ #include "hw/ppc/spapr_ovec.h" #include "mmu-book3s-v3.h" #include "hw/mem/memory-device.h" +#include "sysemu/device_tree.h" =20 static bool has_spr(PowerPCCPU *cpu, int spr) { @@ -1774,9 +1775,51 @@ static target_ulong h_client_architecture_support(Po= werPCCPU *cpu, /* legacy hash or new hash: */ spapr_setup_hpt_and_vrma(spapr); } - spapr->cas_reboot =3D - (spapr_h_cas_compose_response(spapr, args[1], args[2], - ov5_updates) !=3D 0); + + if (spapr->bios_enabled) { + spapr->cas_reboot =3D + (spapr_h_cas_compose_response(spapr, args[1], args[2], + ov5_updates) !=3D 0); + } else { + int size; + void *fdt, *fdt_skel; + struct fdt_header hdr =3D { 0 }; + + cpu_physical_memory_read(args[1], &hdr, sizeof(hdr)); + size =3D fdt32_to_cpu(hdr.totalsize); + if (size > FDT_MAX_SIZE) { + return H_NOT_AVAILABLE; + } + + fdt_skel =3D g_malloc0(size); + cpu_physical_memory_read(args[1], fdt_skel, size); + + fdt =3D g_malloc0(FDT_MAX_SIZE); + fdt_open_into(fdt_skel, fdt, FDT_MAX_SIZE); + g_free(fdt_skel); + + if (spapr_h_cas_do_compose_response(spapr, fdt, ov5_updates)) { + g_free(fdt); + return H_NOT_AVAILABLE; + } + fdt_pack(fdt); + if (fdt_totalsize(fdt) > FDT_MAX_SIZE) { + error_report("FDT too big ! 0x%x bytes (max is 0x%x)", + fdt_totalsize(fdt), FDT_MAX_SIZE); + g_free(fdt); + return H_NOT_AVAILABLE; + } + + /* Load the fdt */ + cpu_physical_memory_write(args[1], fdt, fdt_totalsize(fdt)); + + g_free(spapr->fdt_blob); + spapr->fdt_size =3D fdt_totalsize(fdt); + spapr->fdt_initial_size =3D spapr->fdt_size; + spapr->fdt_blob =3D fdt; + + qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); + } } =20 /* --=20 2.17.1