[SLOF] [RFC PATCH qemu] spapr: Receive device tree blob from SLOF

Alexey Kardashevskiy aik at ozlabs.ru
Fri Sep 29 19:11:10 AEST 2017


This is a debug patch for those who want to test:
"[PATCH slof] fdt: Pass the resulting device tree to QEMU"

Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
---
 include/hw/ppc/spapr.h |  3 ++-
 hw/ppc/spapr_hcall.c   | 25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index a805b817a5..15e865be38 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -400,7 +400,8 @@ struct sPAPRMachineState {
 #define KVMPPC_H_LOGICAL_MEMOP  (KVMPPC_HCALL_BASE + 0x1)
 /* Client Architecture support */
 #define KVMPPC_H_CAS            (KVMPPC_HCALL_BASE + 0x2)
-#define KVMPPC_HCALL_MAX        KVMPPC_H_CAS
+#define KVMPPC_H_UPDATE_DT      (KVMPPC_HCALL_BASE + 0x5)
+#define KVMPPC_HCALL_MAX        KVMPPC_H_UPDATE_DT
 
 typedef struct sPAPRDeviceTreeUpdateHeader {
     uint32_t version_id;
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 57bb411394..599cbb99f7 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1635,6 +1635,29 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
     return H_SUCCESS;
 }
 
+static target_ulong h_update_dt(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+                                target_ulong opcode, target_ulong *args)
+{
+    target_ulong dt = ppc64_phys_to_real(args[0]);
+    struct fdt_header hdr;
+    void *dtb;
+    FILE *f;
+    uint32_t cb;
+
+    cpu_physical_memory_read(dt, &hdr, sizeof(hdr));
+    cb =  be32_to_cpu(hdr.totalsize);
+    dtb = g_malloc0(cb);
+    cpu_physical_memory_read(dt, dtb, cb);
+
+    f = fopen("dbg.dtb", "wb");
+    fwrite(dtb, cb, 1, f);
+    fclose(f);
+    printf("+++Q+++ (%u) %s %u: DT at %lx (%lx) %d bytes\n", getpid(), __func__, __LINE__,
+                dt, args[0], cb);
+
+    return H_SUCCESS;
+}
+
 static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
 static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1];
 
@@ -1732,6 +1755,8 @@ static void hypercall_register_types(void)
 
     /* ibm,client-architecture-support support */
     spapr_register_hypercall(KVMPPC_H_CAS, h_client_architecture_support);
+
+    spapr_register_hypercall(KVMPPC_H_UPDATE_DT, h_update_dt);
 }
 
 type_init(hypercall_register_types)
-- 
2.11.0



More information about the SLOF mailing list