Patchwork [RFC,v3,02/21] qom: Add QOM support to user emulators

login
register
mail settings
Submitter Andreas Färber
Date Feb. 3, 2012, 2:59 a.m.
Message ID <1328237992-14953-3-git-send-email-afaerber@suse.de>
Download mbox | patch
Permalink /patch/139271/
State New
Headers show

Comments

Andreas Färber - Feb. 3, 2012, 2:59 a.m.
Link the Object base class and the module infrastructure for class
registration. Call QOM module init.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Cc: Anthony Liguori <anthony@codemonkey.ws>
---
 Makefile.objs      |    6 ++++++
 Makefile.user      |    1 +
 bsd-user/main.c    |    2 ++
 configure          |    2 ++
 darwin-user/main.c |    3 +++
 linux-user/main.c  |    2 ++
 qemu-user.c        |   37 +++++++++++++++++++++++++++++++++++++
 7 files changed, 53 insertions(+), 0 deletions(-)
 create mode 100644 qemu-user.c
Anthony Liguori - Feb. 6, 2012, 7:16 p.m.
On 02/02/2012 08:59 PM, Andreas Färber wrote:
> Link the Object base class and the module infrastructure for class
> registration. Call QOM module init.
>
> Signed-off-by: Andreas Färber<afaerber@suse.de>
> Cc: Anthony Liguori<anthony@codemonkey.ws>

If we're going to go down this road, then I have a hard requirement.  We need to 
build the common infrastructure only once.

Otherwise build times are going to explode and we'll end up with 
CONFIG_USER_ONLY #defines all over the place.

Regards,

Anthony Liguori

> ---
>   Makefile.objs      |    6 ++++++
>   Makefile.user      |    1 +
>   bsd-user/main.c    |    2 ++
>   configure          |    2 ++
>   darwin-user/main.c |    3 +++
>   linux-user/main.c  |    2 ++
>   qemu-user.c        |   37 +++++++++++++++++++++++++++++++++++++
>   7 files changed, 53 insertions(+), 0 deletions(-)
>   create mode 100644 qemu-user.c
>
> diff --git a/Makefile.objs b/Makefile.objs
> index ec35320..1155cc0 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -182,7 +182,11 @@ user-obj-y =
>   user-obj-y += envlist.o path.o
>   user-obj-y += tcg-runtime.o host-utils.o
>   user-obj-y += cutils.o cache-utils.o
> +user-obj-y += module.o
> +user-obj-y += qemu-user.o
>   user-obj-y += $(trace-obj-y)
> +user-obj-y += $(qobject-obj-y)
> +user-obj-y += $(addprefix qom/, $(qom-y))
>
>   ######################################################################
>   # libhw
> @@ -421,6 +425,8 @@ qapi-obj-y = $(addprefix qapi/, $(qapi-nested-y))
>   common-obj-y += qmp-marshal.o qapi-visit.o qapi-types.o $(qapi-obj-y)
>   common-obj-y += qmp.o hmp.o
>
> +user-obj-y += $(qapi-obj-y)
> +
>   ######################################################################
>   # guest agent
>
> diff --git a/Makefile.user b/Makefile.user
> index 2b1e4d1..72d01c1 100644
> --- a/Makefile.user
> +++ b/Makefile.user
> @@ -9,6 +9,7 @@ include $(SRC_PATH)/rules.mak
>   $(call set-vpath, $(SRC_PATH))
>
>   QEMU_CFLAGS+=-I..
> +QEMU_CFLAGS+=-I$(SRC_PATH)/include
>
>   include $(SRC_PATH)/Makefile.objs
>
> diff --git a/bsd-user/main.c b/bsd-user/main.c
> index cc7d4a3..cdb0d0a 100644
> --- a/bsd-user/main.c
> +++ b/bsd-user/main.c
> @@ -748,6 +748,8 @@ int main(int argc, char **argv)
>       if (argc<= 1)
>           usage();
>
> +    module_call_init(MODULE_INIT_QOM);
> +
>       if ((envlist = envlist_create()) == NULL) {
>           (void) fprintf(stderr, "Unable to allocate envlist\n");
>           exit(1);
> diff --git a/configure b/configure
> index 3b0b300..ee1140e 100755
> --- a/configure
> +++ b/configure
> @@ -3849,6 +3849,8 @@ fi
>   d=libuser
>   mkdir -p $d
>   mkdir -p $d/trace
> +mkdir -p $d/qapi
> +mkdir -p $d/qom
>   symlink $source_path/Makefile.user $d/Makefile
>
>   if test "$docs" = "yes" ; then
> diff --git a/darwin-user/main.c b/darwin-user/main.c
> index 9b57c20..e1519c7 100644
> --- a/darwin-user/main.c
> +++ b/darwin-user/main.c
> @@ -28,6 +28,7 @@
>   #include<sys/mman.h>
>
>   #include "qemu.h"
> +#include "qemu-common.h"
>
>   #define DEBUG_LOGFILE "/tmp/qemu.log"
>
> @@ -749,6 +750,8 @@ int main(int argc, char **argv)
>       if (argc<= 1)
>           usage();
>
> +    module_call_init(MODULE_INIT_QOM);
> +
>       optind = 1;
>       for(;;) {
>           if (optind>= argc)
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 64d2208..f55109c 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -3278,6 +3278,8 @@ int main(int argc, char **argv, char **envp)
>       int i;
>       int ret;
>
> +    module_call_init(MODULE_INIT_QOM);
> +
>       qemu_cache_utils_init(envp);
>
>       if ((envlist = envlist_create()) == NULL) {
> diff --git a/qemu-user.c b/qemu-user.c
> new file mode 100644
> index 0000000..51b2649
> --- /dev/null
> +++ b/qemu-user.c
> @@ -0,0 +1,37 @@
> +/*
> + * Stubs for QEMU user emulation
> + *
> + * Copyright (c) 2012 SUSE LINUX Products GmbH
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, see
> + *<http://www.gnu.org/licenses/old-licenses/gpl-2.0>
> + */
> +
> +#include "qemu-common.h"
> +#include "monitor.h"
> +
> +Monitor *cur_mon;
> +
> +int monitor_cur_is_qmp(void)
> +{
> +    return 0;
> +}
> +
> +void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
> +{
> +}
> +
> +void monitor_set_error(Monitor *mon, QError *qerror)
> +{
> +}
Andreas Färber - Feb. 6, 2012, 11:23 p.m.
Am 06.02.2012 20:16, schrieb Anthony Liguori:
> On 02/02/2012 08:59 PM, Andreas Färber wrote:
>> Link the Object base class and the module infrastructure for class
>> registration. Call QOM module init.
>>
>> Signed-off-by: Andreas Färber<afaerber@suse.de>
>> Cc: Anthony Liguori<anthony@codemonkey.ws>
> 
> If we're going to go down this road, then I have a hard requirement.  We
> need to build the common infrastructure only once.
> 
> Otherwise build times are going to explode and we'll end up with
> CONFIG_USER_ONLY #defines all over the place.

v3 builds it once as before plus once for the user emulators. If that is
really too much already, please advise where to move the objects to.

Andreas
Peter Maydell - Feb. 7, 2012, 5:25 p.m.
On 6 February 2012 19:16, Anthony Liguori <anthony@codemonkey.ws> wrote:
> If we're going to go down this road, then I have a hard requirement.  We
> need to build the common infrastructure only once.
>
> Otherwise build times are going to explode and we'll end up with
> CONFIG_USER_ONLY #defines all over the place.

You already have to build twice, because you can't say "build the
user emulators with --static and the system emulators without", so
one of the standard use cases requires doing two configure-and-build
runs anyhow.

-- PMM
Anthony Liguori - Feb. 7, 2012, 5:51 p.m.
On 02/07/2012 11:25 AM, Peter Maydell wrote:
> On 6 February 2012 19:16, Anthony Liguori<anthony@codemonkey.ws>  wrote:
>> If we're going to go down this road, then I have a hard requirement.  We
>> need to build the common infrastructure only once.
>>
>> Otherwise build times are going to explode and we'll end up with
>> CONFIG_USER_ONLY #defines all over the place.
>
> You already have to build twice, because you can't say "build the
> user emulators with --static and the system emulators without", so
> one of the standard use cases requires doing two configure-and-build
> runs anyhow.

So does it make sense to build both user and system emulators by default?

QOM has a lot of dependencies.  Rebuilding it for user means that we're goign to 
end up rebuilding a lot of user code which sucks.

Regards,

Anthony Liguori

>
> -- PMM
>

Patch

diff --git a/Makefile.objs b/Makefile.objs
index ec35320..1155cc0 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -182,7 +182,11 @@  user-obj-y =
 user-obj-y += envlist.o path.o
 user-obj-y += tcg-runtime.o host-utils.o
 user-obj-y += cutils.o cache-utils.o
+user-obj-y += module.o
+user-obj-y += qemu-user.o
 user-obj-y += $(trace-obj-y)
+user-obj-y += $(qobject-obj-y)
+user-obj-y += $(addprefix qom/, $(qom-y))
 
 ######################################################################
 # libhw
@@ -421,6 +425,8 @@  qapi-obj-y = $(addprefix qapi/, $(qapi-nested-y))
 common-obj-y += qmp-marshal.o qapi-visit.o qapi-types.o $(qapi-obj-y)
 common-obj-y += qmp.o hmp.o
 
+user-obj-y += $(qapi-obj-y)
+
 ######################################################################
 # guest agent
 
diff --git a/Makefile.user b/Makefile.user
index 2b1e4d1..72d01c1 100644
--- a/Makefile.user
+++ b/Makefile.user
@@ -9,6 +9,7 @@  include $(SRC_PATH)/rules.mak
 $(call set-vpath, $(SRC_PATH))
 
 QEMU_CFLAGS+=-I..
+QEMU_CFLAGS+=-I$(SRC_PATH)/include
 
 include $(SRC_PATH)/Makefile.objs
 
diff --git a/bsd-user/main.c b/bsd-user/main.c
index cc7d4a3..cdb0d0a 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -748,6 +748,8 @@  int main(int argc, char **argv)
     if (argc <= 1)
         usage();
 
+    module_call_init(MODULE_INIT_QOM);
+
     if ((envlist = envlist_create()) == NULL) {
         (void) fprintf(stderr, "Unable to allocate envlist\n");
         exit(1);
diff --git a/configure b/configure
index 3b0b300..ee1140e 100755
--- a/configure
+++ b/configure
@@ -3849,6 +3849,8 @@  fi
 d=libuser
 mkdir -p $d
 mkdir -p $d/trace
+mkdir -p $d/qapi
+mkdir -p $d/qom
 symlink $source_path/Makefile.user $d/Makefile
 
 if test "$docs" = "yes" ; then
diff --git a/darwin-user/main.c b/darwin-user/main.c
index 9b57c20..e1519c7 100644
--- a/darwin-user/main.c
+++ b/darwin-user/main.c
@@ -28,6 +28,7 @@ 
 #include <sys/mman.h>
 
 #include "qemu.h"
+#include "qemu-common.h"
 
 #define DEBUG_LOGFILE "/tmp/qemu.log"
 
@@ -749,6 +750,8 @@  int main(int argc, char **argv)
     if (argc <= 1)
         usage();
 
+    module_call_init(MODULE_INIT_QOM);
+
     optind = 1;
     for(;;) {
         if (optind >= argc)
diff --git a/linux-user/main.c b/linux-user/main.c
index 64d2208..f55109c 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -3278,6 +3278,8 @@  int main(int argc, char **argv, char **envp)
     int i;
     int ret;
 
+    module_call_init(MODULE_INIT_QOM);
+
     qemu_cache_utils_init(envp);
 
     if ((envlist = envlist_create()) == NULL) {
diff --git a/qemu-user.c b/qemu-user.c
new file mode 100644
index 0000000..51b2649
--- /dev/null
+++ b/qemu-user.c
@@ -0,0 +1,37 @@ 
+/*
+ * Stubs for QEMU user emulation
+ *
+ * Copyright (c) 2012 SUSE LINUX Products GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see
+ * <http://www.gnu.org/licenses/old-licenses/gpl-2.0>
+ */
+
+#include "qemu-common.h"
+#include "monitor.h"
+
+Monitor *cur_mon;
+
+int monitor_cur_is_qmp(void)
+{
+    return 0;
+}
+
+void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
+{
+}
+
+void monitor_set_error(Monitor *mon, QError *qerror)
+{
+}