qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: qemu-devel@nongnu.org
Cc: Markus Armbruster <armbru@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Daniel Berrange <berrange@redhat.com>,
	Laurent Vivier <laurent@vivier.eu>,
	Max Filippov <jcmvbkbc@gmail.com>,
	Alistair Francis <alistair.francis@xilinx.com>
Subject: [Qemu-devel] [PATCH v2] hw/core/null-machine: Add the possibility to instantiate a CPU, RAM and kernel
Date: Tue, 17 Jan 2017 13:03:11 +0100	[thread overview]
Message-ID: <1484654591-11108-1-git-send-email-thuth@redhat.com> (raw)

Sometimes it is useful to have just a machine with CPU and RAM, without
any further hardware in it, e.g. if you just want to do some instruction
debugging for TCG with a remote GDB attached to QEMU, or run some embedded
code with the "-semihosting" QEMU parameter. qemu-system-m68k already
features a "dummy" machine, and xtensa a "sim" machine for exactly this
purpose.
All target architectures have nowadays also a "none" machine, which would
be a perfect match for this, too - but it currently does not allow to add
CPU, RAM or a kernel yet. Thus let's add these possibilities in a generic
way to the "none" machine, too, so that we hopefully do not need additional
"dummy" machines in the future anymore (and maybe can also get rid of the
already existing "dummy"/"sim" machines one day).
Note that the default behaviour of the "none" machine is not changed, i.e.
no CPU and no RAM is instantiated by default. You've explicitely got to
specify the CPU model with "-cpu" and the amount of RAM with "-m" to get
these new features.
We also introduce a wrapper called cpu_init_def() for the target-specific
macro cpu_init() in cpus.c here, so we can continue to compile the file
null-machine.c independently from the target.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 v2:
 - Use the generic-loader device for providing the functionality of
   the "-kernel" parameter
 - Explicitely set mc->max_cpus = 1
 - Make sure that null-machine.c can be compiled independent from the
   target (by introducing a wrapper function for cpu_init())

 cpus.c                 |  5 +++++
 hw/core/null-machine.c | 40 ++++++++++++++++++++++++++++++++++++++--
 include/qom/cpu.h      | 11 +++++++++++
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/cpus.c b/cpus.c
index 5213351..7c4dc38 100644
--- a/cpus.c
+++ b/cpus.c
@@ -80,6 +80,11 @@ static unsigned int throttle_percentage;
 #define CPU_THROTTLE_PCT_MAX 99
 #define CPU_THROTTLE_TIMESLICE_NS 10000000
 
+CPUState *cpu_init_def(const char *cpu_model)
+{
+    return cpu_init(cpu_model);
+}
+
 bool cpu_is_stopped(CPUState *cpu)
 {
     return cpu->stopped || !runstate_is_running();
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 0351ba7..eab5133 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -13,18 +13,54 @@
 
 #include "qemu/osdep.h"
 #include "qemu-common.h"
+#include "qemu/error-report.h"
 #include "hw/hw.h"
 #include "hw/boards.h"
+#include "hw/core/generic-loader.h"
+#include "sysemu/sysemu.h"
+#include "exec/address-spaces.h"
+#include "qom/cpu.h"
 
-static void machine_none_init(MachineState *machine)
+static void machine_none_init(MachineState *mch)
 {
+    CPUState *cpu = NULL;
+
+    /* Initialize CPU (if a model has been specified) */
+    if (mch->cpu_model) {
+        cpu = cpu_init_def(mch->cpu_model);
+        if (!cpu) {
+            error_report("Unable to initialize CPU");
+            exit(1);
+        }
+    }
+
+    /* RAM at address zero */
+    if (mch->ram_size) {
+        MemoryRegion *ram = g_new(MemoryRegion, 1);
+
+        memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
+        memory_region_add_subregion(get_system_memory(), 0, ram);
+    }
+
+    /* Load kernel */
+    if (mch->kernel_filename) {
+        DeviceState *loader;
+
+        loader = qdev_create(sysbus_get_default(), TYPE_GENERIC_LOADER);
+        qdev_prop_set_string(loader, "file", mch->kernel_filename);
+        if (cpu) {
+            qdev_prop_set_uint32(loader, "cpu-num", cpu->cpu_index);
+        }
+        qdev_init_nofail(loader);
+    }
 }
 
 static void machine_none_machine_init(MachineClass *mc)
 {
     mc->desc = "empty machine";
     mc->init = machine_none_init;
-    mc->max_cpus = 0;
+    mc->max_cpus = 1;
+    mc->default_ram_size = 0;
 }
 
 DEFINE_MACHINE("none", machine_none_machine_init)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 3f79a8e..c20da71 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -636,6 +636,17 @@ bool qemu_cpu_is_self(CPUState *cpu);
 void qemu_cpu_kick(CPUState *cpu);
 
 /**
+ * cpu_init_def:
+ * @cpu_model: Specifies the CPU model which should be created.
+ *
+ * A wrapper around the cpu_init() macro which can be used in target
+ * independent code, too.
+ *
+ * Returns: The CPUState of the created CPU.
+ */
+CPUState *cpu_init_def(const char *cpu_model);
+
+/**
  * cpu_is_stopped:
  * @cpu: The CPU to check.
  *
-- 
1.8.3.1

             reply	other threads:[~2017-01-17 12:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-17 12:03 Thomas Huth [this message]
2017-01-17 12:32 ` [Qemu-devel] [PATCH v2] hw/core/null-machine: Add the possibility to instantiate a CPU, RAM and kernel Eduardo Habkost
2017-01-17 13:10   ` Thomas Huth
2017-01-17 14:15     ` Eduardo Habkost

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1484654591-11108-1-git-send-email-thuth@redhat.com \
    --to=thuth@redhat.com \
    --cc=alistair.francis@xilinx.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jcmvbkbc@gmail.com \
    --cc=laurent@vivier.eu \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).