All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/16] Preliminary patches for subproject split
@ 2022-08-10 12:48 marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 01/16] error-report: misc comment fix marcandre.lureau
                   ` (15 more replies)
  0 siblings, 16 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Hi,

Here is another subset of the large "subproject(qga)" series I intend to send
soon after (https://gitlab.com/marcandre.lureau/qemu/-/commits/qga).

Thanks

v3:
- use overriable qmp_dispatch_exec() stub, instead of extra callback
- qapi-gen "-i file.h" will always generate '#include "file.h"' now
- improve mtest2make.py subproject tests handling
- add r-b tags

v2:
 - drop error_init() callbacks, use static library symbol override instead
 - include a few patches from the rest of the series to introduce qemu-common
   subproject

Marc-André Lureau (16):
  error-report: misc comment fix
  error-report: introduce "detailed" variable
  error-report: simplify print_loc()
  error-report: introduce overridable error_is_detailed()
  stubs: remove needless error_vprintf_unless_qmp()
  qapi: move QEMU-specific dispatch code in monitor
  qapi: remove QEMU-specific monitor dependency from dispatch
  scripts/qapi-gen: add -i option
  scripts/qapi: add required system includes to visitor
  util: move 256-by-128 division helpers to int128
  qemu-common: introduce a common subproject
  qemu-common: move scripts/qapi
  qemu-common: move glib-compat.h
  qemu-common: move error-report
  mtest2make.py: teach suite name that are just "PROJECT"
  qemu-common: add error-report test

 docs/conf.py                                  |   2 +-
 meson.build                                   |  28 +--
 include/qapi/qmp/dispatch.h                   |   6 +-
 include/qemu/host-utils.h                     |   3 -
 include/qemu/int128.h                         |   3 +
 .../qemu-common/include}/glib-compat.h        |   4 +-
 .../qemu-common/include}/qemu/error-report.h  |   4 +
 .../qemu-common/include}/qemu/help-texts.h    |   0
 monitor/qmp.c                                 |  64 +++++++
 qapi/qmp-dispatch.c                           |  62 +-----
 softmmu/vl.c                                  |   5 +
 stubs/qmp-dispatch-exec.c                     |   8 +
 .../qemu-common/src/error-is-detailed.c       |   6 +
 .../qemu-common/src}/error-report.c           |  20 +-
 .../qemu-common/src/error-vprintf.c           |  10 +-
 .../qemu-common/tests/test-error-report.c     | 120 ++++++++++++
 util/host-utils.c                             | 180 ------------------
 util/int128.c                                 | 180 ++++++++++++++++++
 MAINTAINERS                                   |   4 +-
 scripts/mtest2make.py                         |   9 +-
 stubs/meson.build                             |   2 +-
 subprojects/libvduse/meson.build              |   2 +
 subprojects/libvduse/subprojects/qemu-common  |   1 +
 subprojects/libvhost-user/meson.build         |   2 +
 .../libvhost-user/subprojects/qemu-common     |   1 +
 subprojects/qemu-common/meson.build           |  26 +++
 subprojects/qemu-common/scripts/meson.build   |   3 +
 .../qemu-common/scripts}/qapi-gen.py          |   0
 .../qemu-common/scripts}/qapi/.flake8         |   0
 .../qemu-common/scripts}/qapi/.isort.cfg      |   0
 .../qemu-common/scripts}/qapi/__init__.py     |   0
 .../qemu-common/scripts}/qapi/commands.py     |  15 +-
 .../qemu-common/scripts}/qapi/common.py       |   0
 .../qemu-common/scripts}/qapi/error.py        |   0
 .../qemu-common/scripts}/qapi/events.py       |  17 +-
 .../qemu-common/scripts}/qapi/expr.py         |   0
 .../qemu-common/scripts}/qapi/gen.py          |  15 ++
 .../qemu-common/scripts}/qapi/introspect.py   |  11 +-
 .../qemu-common/scripts}/qapi/main.py         |  17 +-
 .../qemu-common/scripts/qapi/meson.build      |  16 ++
 .../qemu-common/scripts}/qapi/mypy.ini        |   0
 .../qemu-common/scripts}/qapi/parser.py       |   0
 .../qemu-common/scripts}/qapi/pylintrc        |   0
 .../qemu-common/scripts}/qapi/schema.py       |   0
 .../qemu-common/scripts}/qapi/source.py       |   0
 .../qemu-common/scripts}/qapi/types.py        |  17 +-
 .../qemu-common/scripts}/qapi/visit.py        |  19 +-
 subprojects/qemu-common/src/meson.build       |   5 +
 subprojects/qemu-common/tests/meson.build     |  12 ++
 tests/qapi-schema/meson.build                 |   2 +-
 util/meson.build                              |   2 +-
 51 files changed, 579 insertions(+), 324 deletions(-)
 rename {include => subprojects/qemu-common/include}/glib-compat.h (97%)
 rename {include => subprojects/qemu-common/include}/qemu/error-report.h (97%)
 rename {include => subprojects/qemu-common/include}/qemu/help-texts.h (100%)
 create mode 100644 stubs/qmp-dispatch-exec.c
 create mode 100644 subprojects/qemu-common/src/error-is-detailed.c
 rename {util => subprojects/qemu-common/src}/error-report.c (96%)
 rename stubs/error-printf.c => subprojects/qemu-common/src/error-vprintf.c (64%)
 create mode 100644 subprojects/qemu-common/tests/test-error-report.c
 create mode 120000 subprojects/libvduse/subprojects/qemu-common
 create mode 120000 subprojects/libvhost-user/subprojects/qemu-common
 create mode 100644 subprojects/qemu-common/meson.build
 create mode 100644 subprojects/qemu-common/scripts/meson.build
 rename {scripts => subprojects/qemu-common/scripts}/qapi-gen.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/.flake8 (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/.isort.cfg (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/__init__.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/commands.py (96%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/common.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/error.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/events.py (95%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/expr.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/gen.py (96%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/introspect.py (97%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/main.py (85%)
 create mode 100644 subprojects/qemu-common/scripts/qapi/meson.build
 rename {scripts => subprojects/qemu-common/scripts}/qapi/mypy.ini (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/parser.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/pylintrc (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/schema.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/source.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/types.py (96%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/visit.py (96%)
 create mode 100644 subprojects/qemu-common/src/meson.build
 create mode 100644 subprojects/qemu-common/tests/meson.build

-- 
2.37.1



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 01/16] error-report: misc comment fix
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 02/16] error-report: introduce "detailed" variable marcandre.lureau
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Missed in commit beeb175c0d "util/qemu-error: Rename error_print_loc()
to be more generic".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 util/error-report.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/util/error-report.c b/util/error-report.c
index 5edb2e6040..98f242b75b 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -390,7 +390,7 @@ void error_init(const char *argv0)
 {
     const char *p = strrchr(argv0, '/');
 
-    /* Set the program name for error_print_loc(). */
+    /* Set the program name for print_loc(). */
     g_set_prgname(p ? p + 1 : argv0);
 
     /*
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 02/16] error-report: introduce "detailed" variable
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 01/16] error-report: misc comment fix marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 03/16] error-report: simplify print_loc() marcandre.lureau
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Let's use a more explicit variable "detailed" instead of calling
monitor_cur() multiple times.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 util/error-report.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/util/error-report.c b/util/error-report.c
index 98f242b75b..893da10f19 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -195,16 +195,17 @@ real_time_iso8601(void)
  */
 static void vreport(report_type type, const char *fmt, va_list ap)
 {
+    bool detailed = !monitor_cur();
     gchar *timestr;
 
-    if (message_with_timestamp && !monitor_cur()) {
+    if (message_with_timestamp && detailed) {
         timestr = real_time_iso8601();
         error_printf("%s ", timestr);
         g_free(timestr);
     }
 
     /* Only prepend guest name if -msg guest-name and -name guest=... are set */
-    if (error_with_guestname && error_guest_name && !monitor_cur()) {
+    if (error_with_guestname && error_guest_name && detailed) {
         error_printf("%s ", error_guest_name);
     }
 
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 03/16] error-report: simplify print_loc()
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 01/16] error-report: misc comment fix marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 02/16] error-report: introduce "detailed" variable marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 04/16] error-report: introduce overridable error_is_detailed() marcandre.lureau
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Pass the program name as "prefix" argument to print_loc() if printing
with "details". This allows to get rid of monitor_cur() call in
print_loc().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 util/error-report.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/util/error-report.c b/util/error-report.c
index 893da10f19..c43227a975 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -138,14 +138,14 @@ void loc_set_file(const char *fname, int lno)
 /*
  * Print current location to current monitor if we have one, else to stderr.
  */
-static void print_loc(void)
+static void print_loc(const char *prefix)
 {
     const char *sep = "";
     int i;
     const char *const *argp;
 
-    if (!monitor_cur() && g_get_prgname()) {
-        error_printf("%s:", g_get_prgname());
+    if (prefix) {
+        error_printf("%s:", prefix);
         sep = " ";
     }
     switch (cur_loc->kind) {
@@ -209,7 +209,7 @@ static void vreport(report_type type, const char *fmt, va_list ap)
         error_printf("%s ", error_guest_name);
     }
 
-    print_loc();
+    print_loc(detailed ? g_get_prgname() : NULL);
 
     switch (type) {
     case REPORT_TYPE_ERROR:
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 04/16] error-report: introduce overridable error_is_detailed()
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (2 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 03/16] error-report: simplify print_loc() marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 05/16] stubs: remove needless error_vprintf_unless_qmp() marcandre.lureau
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Remove the direct dependency from error-report to monitor code.
This will allow to move error-report to a subproject.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 include/qemu/error-report.h | 2 ++
 softmmu/vl.c                | 5 +++++
 stubs/error-is-detailed.c   | 7 +++++++
 util/error-report.c         | 3 +--
 stubs/meson.build           | 1 +
 5 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 stubs/error-is-detailed.c

diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h
index 3ae2357fda..6ab25d4583 100644
--- a/include/qemu/error-report.h
+++ b/include/qemu/error-report.h
@@ -30,6 +30,8 @@ void loc_set_none(void);
 void loc_set_cmdline(char **argv, int idx, int cnt);
 void loc_set_file(const char *fname, int lno);
 
+bool error_is_detailed(void);
+
 int error_vprintf(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0);
 int error_printf(const char *fmt, ...) G_GNUC_PRINTF(1, 2);
 
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 706bd7cff7..069ea50bed 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2603,6 +2603,11 @@ void qmp_x_exit_preconfig(Error **errp)
     }
 }
 
+bool error_is_detailed(void)
+{
+    return !monitor_cur();
+}
+
 void qemu_init(int argc, char **argv, char **envp)
 {
     QemuOpts *opts;
diff --git a/stubs/error-is-detailed.c b/stubs/error-is-detailed.c
new file mode 100644
index 0000000000..c47cd23693
--- /dev/null
+++ b/stubs/error-is-detailed.c
@@ -0,0 +1,7 @@
+#include "qemu/osdep.h"
+#include "qemu/error-report.h"
+
+bool error_is_detailed(void)
+{
+    return TRUE;
+}
diff --git a/util/error-report.c b/util/error-report.c
index c43227a975..4d1d66fc06 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -11,7 +11,6 @@
  */
 
 #include "qemu/osdep.h"
-#include "monitor/monitor.h"
 #include "qemu/error-report.h"
 
 /*
@@ -195,7 +194,7 @@ real_time_iso8601(void)
  */
 static void vreport(report_type type, const char *fmt, va_list ap)
 {
-    bool detailed = !monitor_cur();
+    bool detailed = error_is_detailed();
     gchar *timestr;
 
     if (message_with_timestamp && detailed) {
diff --git a/stubs/meson.build b/stubs/meson.build
index d8f3fd5c44..0f3a782824 100644
--- a/stubs/meson.build
+++ b/stubs/meson.build
@@ -9,6 +9,7 @@ stub_ss.add(files('cpus-get-virtual-clock.c'))
 stub_ss.add(files('qemu-timer-notify-cb.c'))
 stub_ss.add(files('icount.c'))
 stub_ss.add(files('dump.c'))
+stub_ss.add(files('error-is-detailed.c'))
 stub_ss.add(files('error-printf.c'))
 stub_ss.add(files('fdset.c'))
 stub_ss.add(files('gdbstub.c'))
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 05/16] stubs: remove needless error_vprintf_unless_qmp()
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (3 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 04/16] error-report: introduce overridable error_is_detailed() marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 06/16] qapi: move QEMU-specific dispatch code in monitor marcandre.lureau
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 stubs/error-printf.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/stubs/error-printf.c b/stubs/error-printf.c
index 0e326d8010..1afa0f62ca 100644
--- a/stubs/error-printf.c
+++ b/stubs/error-printf.c
@@ -16,8 +16,3 @@ int error_vprintf(const char *fmt, va_list ap)
     }
     return vfprintf(stderr, fmt, ap);
 }
-
-int error_vprintf_unless_qmp(const char *fmt, va_list ap)
-{
-    return error_vprintf(fmt, ap);
-}
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 06/16] qapi: move QEMU-specific dispatch code in monitor
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (4 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 05/16] stubs: remove needless error_vprintf_unless_qmp() marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 07/16] qapi: remove QEMU-specific monitor dependency from dispatch marcandre.lureau
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Make QMP-dispatch code free from QEMU-specific OOB dispatch/async
coroutine handling. This will allow to move the base code to
qemu-common, and clear other users from potential mis-ususe (QGA doesn't
have OOB or coroutines).

Introduce an overridable qmp_dispatch_exec() function, with a default a
stub implementation, while the oob & coroutine dispatch logic is moved
to monitor/qmp.c.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qapi/qmp/dispatch.h |  3 ++
 monitor/qmp.c               | 63 +++++++++++++++++++++++++++++++++++++
 qapi/qmp-dispatch.c         | 60 +----------------------------------
 stubs/qmp-dispatch-exec.c   |  8 +++++
 stubs/meson.build           |  1 +
 5 files changed, 76 insertions(+), 59 deletions(-)
 create mode 100644 stubs/qmp-dispatch-exec.c

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 1e4240fd0d..6941a759a7 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -41,6 +41,9 @@ typedef struct QmpCommand
 
 typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
 
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+                       QDict *args, QObject **ret, Error **err);
+
 void qmp_register_command(QmpCommandList *cmds, const char *name,
                           QmpCommandFunc *fn, QmpCommandOptions options,
                           unsigned special_features);
diff --git a/monitor/qmp.c b/monitor/qmp.c
index 092c527b6f..b9b109a40a 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -132,6 +132,69 @@ static void monitor_qmp_respond(MonitorQMP *mon, QDict *rsp)
     }
 }
 
+typedef struct QmpDispatchBH {
+    const QmpCommand *cmd;
+    Monitor *cur_mon;
+    QDict *args;
+    QObject **ret;
+    Error **errp;
+    Coroutine *co;
+} QmpDispatchBH;
+
+static void do_qmp_dispatch_bh(void *opaque)
+{
+    QmpDispatchBH *data = opaque;
+
+    assert(monitor_cur() == NULL);
+    monitor_set_cur(qemu_coroutine_self(), data->cur_mon);
+    data->cmd->fn(data->args, data->ret, data->errp);
+    monitor_set_cur(qemu_coroutine_self(), NULL);
+    aio_co_wake(data->co);
+}
+
+/*
+ * Runs outside of coroutine context for OOB commands, but in coroutine
+ * context for everything else.
+ */
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+                       QDict *args, QObject **ret, Error **errp)
+{
+    assert(!(oob && qemu_in_coroutine()));
+    assert(monitor_cur() == NULL);
+
+    if (!!(cmd->options & QCO_COROUTINE) == qemu_in_coroutine()) {
+        monitor_set_cur(qemu_coroutine_self(), cur_mon);
+        cmd->fn(args, ret, errp);
+        monitor_set_cur(qemu_coroutine_self(), NULL);
+    } else {
+       /*
+        * Actual context doesn't match the one the command needs.
+        *
+        * Case 1: we are in coroutine context, but command does not
+        * have QCO_COROUTINE.  We need to drop out of coroutine
+        * context for executing it.
+        *
+        * Case 2: we are outside coroutine context, but command has
+        * QCO_COROUTINE.  Can't actually happen, because we get here
+        * outside coroutine context only when executing a command
+        * out of band, and OOB commands never have QCO_COROUTINE.
+        */
+        assert(!oob && qemu_in_coroutine() && !(cmd->options & QCO_COROUTINE));
+
+        QmpDispatchBH data = {
+            .cur_mon    = cur_mon,
+            .cmd        = cmd,
+            .args       = args,
+            .ret        = ret,
+            .errp       = errp,
+            .co         = qemu_coroutine_self(),
+        };
+        aio_bh_schedule_oneshot(qemu_get_aio_context(), do_qmp_dispatch_bh,
+                                &data);
+        qemu_coroutine_yield();
+    }
+}
+
 /*
  * Runs outside of coroutine context for OOB commands, but in
  * coroutine context for everything else.
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 0990873ec8..bec07e4958 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -13,7 +13,6 @@
 
 #include "qemu/osdep.h"
 
-#include "block/aio.h"
 #include "qapi/compat-policy.h"
 #include "qapi/error.h"
 #include "qapi/qmp/dispatch.h"
@@ -22,8 +21,6 @@
 #include "qapi/qobject-input-visitor.h"
 #include "qapi/qobject-output-visitor.h"
 #include "qapi/qmp/qbool.h"
-#include "qemu/coroutine.h"
-#include "qemu/main-loop.h"
 
 Visitor *qobject_input_visitor_new_qmp(QObject *obj)
 {
@@ -110,30 +107,6 @@ bool qmp_is_oob(const QDict *dict)
         && !qdict_haskey(dict, "execute");
 }
 
-typedef struct QmpDispatchBH {
-    const QmpCommand *cmd;
-    Monitor *cur_mon;
-    QDict *args;
-    QObject **ret;
-    Error **errp;
-    Coroutine *co;
-} QmpDispatchBH;
-
-static void do_qmp_dispatch_bh(void *opaque)
-{
-    QmpDispatchBH *data = opaque;
-
-    assert(monitor_cur() == NULL);
-    monitor_set_cur(qemu_coroutine_self(), data->cur_mon);
-    data->cmd->fn(data->args, data->ret, data->errp);
-    monitor_set_cur(qemu_coroutine_self(), NULL);
-    aio_co_wake(data->co);
-}
-
-/*
- * Runs outside of coroutine context for OOB commands, but in coroutine
- * context for everything else.
- */
 QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
                     bool allow_oob, Monitor *cur_mon)
 {
@@ -203,39 +176,8 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
         qobject_ref(args);
     }
 
-    assert(!(oob && qemu_in_coroutine()));
-    assert(monitor_cur() == NULL);
-    if (!!(cmd->options & QCO_COROUTINE) == qemu_in_coroutine()) {
-        monitor_set_cur(qemu_coroutine_self(), cur_mon);
-        cmd->fn(args, &ret, &err);
-        monitor_set_cur(qemu_coroutine_self(), NULL);
-    } else {
-       /*
-        * Actual context doesn't match the one the command needs.
-        *
-        * Case 1: we are in coroutine context, but command does not
-        * have QCO_COROUTINE.  We need to drop out of coroutine
-        * context for executing it.
-        *
-        * Case 2: we are outside coroutine context, but command has
-        * QCO_COROUTINE.  Can't actually happen, because we get here
-        * outside coroutine context only when executing a command
-        * out of band, and OOB commands never have QCO_COROUTINE.
-        */
-        assert(!oob && qemu_in_coroutine() && !(cmd->options & QCO_COROUTINE));
+    qmp_dispatch_exec(cmd, oob, cur_mon, args, &ret, &err);
 
-        QmpDispatchBH data = {
-            .cur_mon    = cur_mon,
-            .cmd        = cmd,
-            .args       = args,
-            .ret        = &ret,
-            .errp       = &err,
-            .co         = qemu_coroutine_self(),
-        };
-        aio_bh_schedule_oneshot(qemu_get_aio_context(), do_qmp_dispatch_bh,
-                                &data);
-        qemu_coroutine_yield();
-    }
     qobject_unref(args);
     if (err) {
         /* or assert(!ret) after reviewing all handlers: */
diff --git a/stubs/qmp-dispatch-exec.c b/stubs/qmp-dispatch-exec.c
new file mode 100644
index 0000000000..4aef28d198
--- /dev/null
+++ b/stubs/qmp-dispatch-exec.c
@@ -0,0 +1,8 @@
+#include "qemu/osdep.h"
+#include "qapi/qmp/dispatch.h"
+
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+                       QDict *args, QObject **ret, Error **err)
+{
+    cmd->fn(args, ret, err);
+}
diff --git a/stubs/meson.build b/stubs/meson.build
index 0f3a782824..14548633b0 100644
--- a/stubs/meson.build
+++ b/stubs/meson.build
@@ -32,6 +32,7 @@ stub_ss.add(files('monitor.c'))
 stub_ss.add(files('monitor-core.c'))
 stub_ss.add(files('qemu-timer-notify-cb.c'))
 stub_ss.add(files('qmp_memory_device.c'))
+stub_ss.add(files('qmp-dispatch-exec.c'))
 stub_ss.add(files('qmp-command-available.c'))
 stub_ss.add(files('qmp-quit.c'))
 stub_ss.add(files('qtest.c'))
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 07/16] qapi: remove QEMU-specific monitor dependency from dispatch
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (5 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 06/16] qapi: move QEMU-specific dispatch code in monitor marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 08/16] scripts/qapi-gen: add -i option marcandre.lureau
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The monitor is specific to QEMU. Instead of passing a Monitor type
argument to the exec handler, use a generic void* pointer. This simplify
also the unit dependency, as now the dispatching code is free from
QEMU-specifics.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qapi/qmp/dispatch.h | 5 ++---
 monitor/qmp.c               | 3 ++-
 qapi/qmp-dispatch.c         | 4 ++--
 stubs/qmp-dispatch-exec.c   | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 6941a759a7..ee8a05015a 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -14,7 +14,6 @@
 #ifndef QAPI_QMP_DISPATCH_H
 #define QAPI_QMP_DISPATCH_H
 
-#include "monitor/monitor.h"
 #include "qemu/queue.h"
 
 typedef void (QmpCommandFunc)(QDict *, QObject **, Error **);
@@ -41,7 +40,7 @@ typedef struct QmpCommand
 
 typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
 
-void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, void *exec_data,
                        QDict *args, QObject **ret, Error **err);
 
 void qmp_register_command(QmpCommandList *cmds, const char *name,
@@ -59,7 +58,7 @@ const char *qmp_command_name(const QmpCommand *cmd);
 bool qmp_has_success_response(const QmpCommand *cmd);
 QDict *qmp_error_response(Error *err);
 QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
-                    bool allow_oob, Monitor *cur_mon);
+                    bool allow_oob, void *exec_data);
 bool qmp_is_oob(const QDict *dict);
 
 typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
diff --git a/monitor/qmp.c b/monitor/qmp.c
index b9b109a40a..4f0eb6e200 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -156,9 +156,10 @@ static void do_qmp_dispatch_bh(void *opaque)
  * Runs outside of coroutine context for OOB commands, but in coroutine
  * context for everything else.
  */
-void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, void *exec_data,
                        QDict *args, QObject **ret, Error **errp)
 {
+    Monitor *cur_mon = exec_data;
     assert(!(oob && qemu_in_coroutine()));
     assert(monitor_cur() == NULL);
 
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index bec07e4958..2fea789fd3 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -108,7 +108,7 @@ bool qmp_is_oob(const QDict *dict)
 }
 
 QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
-                    bool allow_oob, Monitor *cur_mon)
+                    bool allow_oob, void *exec_data)
 {
     Error *err = NULL;
     bool oob;
@@ -176,7 +176,7 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
         qobject_ref(args);
     }
 
-    qmp_dispatch_exec(cmd, oob, cur_mon, args, &ret, &err);
+    qmp_dispatch_exec(cmd, oob, exec_data, args, &ret, &err);
 
     qobject_unref(args);
     if (err) {
diff --git a/stubs/qmp-dispatch-exec.c b/stubs/qmp-dispatch-exec.c
index 4aef28d198..4740f55222 100644
--- a/stubs/qmp-dispatch-exec.c
+++ b/stubs/qmp-dispatch-exec.c
@@ -1,7 +1,7 @@
 #include "qemu/osdep.h"
 #include "qapi/qmp/dispatch.h"
 
-void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, Monitor *cur_mon,
+void qmp_dispatch_exec(const QmpCommand *cmd, bool oob, void *exec_data,
                        QDict *args, QObject **ret, Error **err)
 {
     cmd->fn(args, ret, err);
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 08/16] scripts/qapi-gen: add -i option
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (6 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 07/16] qapi: remove QEMU-specific monitor dependency from dispatch marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 09/16] scripts/qapi: add required system includes to visitor marcandre.lureau
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Replace hard-coded "qemu/osdep.h" include with a qapi-gen option to
specify the headers to include. This will allow to substitute QEMU
osdep.h with glib.h for example, for projects with different
global headers.

For historical reasons, we can keep the default as "qemu/osdep.h".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 scripts/qapi/commands.py   | 15 ++++++++++-----
 scripts/qapi/events.py     | 17 +++++++++++------
 scripts/qapi/gen.py        | 15 +++++++++++++++
 scripts/qapi/introspect.py | 11 +++++++----
 scripts/qapi/main.py       | 17 +++++++++++------
 scripts/qapi/types.py      | 17 +++++++++++------
 scripts/qapi/visit.py      | 17 +++++++++++------
 7 files changed, 76 insertions(+), 33 deletions(-)

diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py
index 38ca38a7b9..781491b639 100644
--- a/scripts/qapi/commands.py
+++ b/scripts/qapi/commands.py
@@ -294,9 +294,9 @@ def gen_register_command(name: str,
 
 
 class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
-    def __init__(self, prefix: str, gen_tracing: bool):
+    def __init__(self, prefix: str, include: List[str], gen_tracing: bool):
         super().__init__(
-            prefix, 'qapi-commands',
+            prefix, include, 'qapi-commands',
             ' * Schema-defined QAPI/QMP commands', None, __doc__,
             gen_tracing=gen_tracing)
         self._visited_ret_types: Dict[QAPIGenC, Set[QAPISchemaType]] = {}
@@ -308,7 +308,8 @@ def _begin_user_module(self, name: str) -> None:
         types = self._module_basename('qapi-types', name)
         visit = self._module_basename('qapi-visit', name)
         self._genc.add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "qapi/compat-policy.h"
 #include "qapi/visitor.h"
 #include "qapi/qmp/qdict.h"
@@ -318,6 +319,7 @@ def _begin_user_module(self, name: str) -> None:
 #include "%(commands)s.h"
 
 ''',
+                             include=self.genc_include(),
                              commands=commands, visit=visit))
 
         if self._gen_tracing and commands != 'qapi-commands':
@@ -344,7 +346,8 @@ def visit_begin(self, schema: QAPISchema) -> None:
 ''',
                              c_prefix=c_name(self._prefix, protect=False)))
         self._genc.add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "%(prefix)sqapi-commands.h"
 #include "%(prefix)sqapi-init-commands.h"
 
@@ -353,6 +356,7 @@ def visit_begin(self, schema: QAPISchema) -> None:
     QTAILQ_INIT(cmds);
 
 ''',
+                             include=self.genc_include(),
                              prefix=self._prefix,
                              c_prefix=c_name(self._prefix, protect=False)))
 
@@ -404,7 +408,8 @@ def visit_command(self,
 def gen_commands(schema: QAPISchema,
                  output_dir: str,
                  prefix: str,
+                 include: List[str],
                  gen_tracing: bool) -> None:
-    vis = QAPISchemaGenCommandVisitor(prefix, gen_tracing)
+    vis = QAPISchemaGenCommandVisitor(prefix, include, gen_tracing)
     schema.visit(vis)
     vis.write(output_dir)
diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
index 27b44c49f5..6e677d11d2 100644
--- a/scripts/qapi/events.py
+++ b/scripts/qapi/events.py
@@ -175,9 +175,9 @@ def gen_event_send(name: str,
 
 class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
 
-    def __init__(self, prefix: str):
+    def __init__(self, prefix: str, include: List[str]):
         super().__init__(
-            prefix, 'qapi-events',
+            prefix, include, 'qapi-events',
             ' * Schema-defined QAPI/QMP events', None, __doc__)
         self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
         self._event_enum_members: List[QAPISchemaEnumMember] = []
@@ -188,7 +188,8 @@ def _begin_user_module(self, name: str) -> None:
         types = self._module_basename('qapi-types', name)
         visit = self._module_basename('qapi-visit', name)
         self._genc.add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "%(prefix)sqapi-emit-events.h"
 #include "%(events)s.h"
 #include "%(visit)s.h"
@@ -198,6 +199,7 @@ def _begin_user_module(self, name: str) -> None:
 #include "qapi/qmp-event.h"
 
 ''',
+                             include=self.genc_include(),
                              events=events, visit=visit,
                              prefix=self._prefix))
         self._genh.add(mcgen('''
@@ -209,9 +211,11 @@ def _begin_user_module(self, name: str) -> None:
     def visit_end(self) -> None:
         self._add_module('./emit', ' * QAPI Events emission')
         self._genc.preamble_add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "%(prefix)sqapi-emit-events.h"
 ''',
+                                      include=self.genc_include(),
                                       prefix=self._prefix))
         self._genh.preamble_add(mcgen('''
 #include "qapi/util.h"
@@ -246,7 +250,8 @@ def visit_event(self,
 
 def gen_events(schema: QAPISchema,
                output_dir: str,
-               prefix: str) -> None:
-    vis = QAPISchemaGenEventVisitor(prefix)
+               prefix: str,
+               include: List[str]) -> None:
+    vis = QAPISchemaGenEventVisitor(prefix, include)
     schema.visit(vis)
     vis.write(output_dir)
diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
index 113b49134d..7db46653de 100644
--- a/scripts/qapi/gen.py
+++ b/scripts/qapi/gen.py
@@ -17,6 +17,7 @@
 from typing import (
     Dict,
     Iterator,
+    List,
     Optional,
     Sequence,
     Tuple,
@@ -45,6 +46,10 @@ def gen_special_features(features: Sequence[QAPISchemaFeature]) -> str:
     return ' | '.join(special_features) or '0'
 
 
+def genc_include(include: List[str]) -> str:
+    return '\n'.join([f'#include "{inc}"' for inc in include])
+
+
 class QAPIGen:
     def __init__(self, fname: str):
         self.fname = fname
@@ -228,16 +233,21 @@ def ifcontext(ifcond: QAPISchemaIfCond, *args: QAPIGenCCode) -> Iterator[None]:
 class QAPISchemaMonolithicCVisitor(QAPISchemaVisitor):
     def __init__(self,
                  prefix: str,
+                 include: List[str],
                  what: str,
                  blurb: str,
                  pydoc: str):
         self._prefix = prefix
+        self._include = include
         self._what = what
         self._genc = QAPIGenC(self._prefix + self._what + '.c',
                               blurb, pydoc)
         self._genh = QAPIGenH(self._prefix + self._what + '.h',
                               blurb, pydoc)
 
+    def genc_include(self) -> str:
+        return genc_include(self._include)
+
     def write(self, output_dir: str) -> None:
         self._genc.write(output_dir)
         self._genh.write(output_dir)
@@ -246,12 +256,14 @@ def write(self, output_dir: str) -> None:
 class QAPISchemaModularCVisitor(QAPISchemaVisitor):
     def __init__(self,
                  prefix: str,
+                 include: List[str],
                  what: str,
                  user_blurb: str,
                  builtin_blurb: Optional[str],
                  pydoc: str,
                  gen_tracing: bool = False):
         self._prefix = prefix
+        self._include = include
         self._what = what
         self._user_blurb = user_blurb
         self._builtin_blurb = builtin_blurb
@@ -262,6 +274,9 @@ def __init__(self,
         self._main_module: Optional[str] = None
         self._gen_tracing = gen_tracing
 
+    def genc_include(self) -> str:
+        return genc_include(self._include)
+
     @property
     def _genc(self) -> QAPIGenC:
         assert self._current_module is not None
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 67c7d89aae..d965d17694 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -170,9 +170,9 @@ def to_c_string(string: str) -> str:
 
 class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor):
 
-    def __init__(self, prefix: str, unmask: bool):
+    def __init__(self, prefix: str, include: List[str], unmask: bool):
         super().__init__(
-            prefix, 'qapi-introspect',
+            prefix, include, 'qapi-introspect',
             ' * QAPI/QMP schema introspection', __doc__)
         self._unmask = unmask
         self._schema: Optional[QAPISchema] = None
@@ -180,10 +180,12 @@ def __init__(self, prefix: str, unmask: bool):
         self._used_types: List[QAPISchemaType] = []
         self._name_map: Dict[str, str] = {}
         self._genc.add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "%(prefix)sqapi-introspect.h"
 
 ''',
+                             include=self.genc_include(),
                              prefix=prefix))
 
     def visit_begin(self, schema: QAPISchema) -> None:
@@ -384,7 +386,8 @@ def visit_event(self, name: str, info: Optional[QAPISourceInfo],
 
 
 def gen_introspect(schema: QAPISchema, output_dir: str, prefix: str,
+                   include: List[str],
                    opt_unmask: bool) -> None:
-    vis = QAPISchemaGenIntrospectVisitor(prefix, opt_unmask)
+    vis = QAPISchemaGenIntrospectVisitor(prefix, include, opt_unmask)
     schema.visit(vis)
     vis.write(output_dir)
diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py
index fc216a53d3..eba98cb9ac 100644
--- a/scripts/qapi/main.py
+++ b/scripts/qapi/main.py
@@ -9,7 +9,7 @@
 
 import argparse
 import sys
-from typing import Optional
+from typing import List, Optional
 
 from .commands import gen_commands
 from .common import must_match
@@ -31,6 +31,7 @@ def invalid_prefix_char(prefix: str) -> Optional[str]:
 def generate(schema_file: str,
              output_dir: str,
              prefix: str,
+             include: List[str],
              unmask: bool = False,
              builtins: bool = False,
              gen_tracing: bool = False) -> None:
@@ -48,11 +49,11 @@ def generate(schema_file: str,
     assert invalid_prefix_char(prefix) is None
 
     schema = QAPISchema(schema_file)
-    gen_types(schema, output_dir, prefix, builtins)
-    gen_visit(schema, output_dir, prefix, builtins)
-    gen_commands(schema, output_dir, prefix, gen_tracing)
-    gen_events(schema, output_dir, prefix)
-    gen_introspect(schema, output_dir, prefix, unmask)
+    gen_types(schema, output_dir, prefix, include, builtins)
+    gen_visit(schema, output_dir, prefix, include, builtins)
+    gen_commands(schema, output_dir, prefix, include, gen_tracing)
+    gen_events(schema, output_dir, prefix, include)
+    gen_introspect(schema, output_dir, prefix, include, unmask)
 
 
 def main() -> int:
@@ -75,6 +76,9 @@ def main() -> int:
     parser.add_argument('-u', '--unmask-non-abi-names', action='store_true',
                         dest='unmask',
                         help="expose non-ABI names in introspection")
+    parser.add_argument('-i', '--include', nargs='*',
+                        default=['qemu/osdep.h'],
+                        help="top-level include headers")
 
     # Option --suppress-tracing exists so we can avoid solving build system
     # problems.  TODO Drop it when we no longer need it.
@@ -94,6 +98,7 @@ def main() -> int:
         generate(args.schema,
                  output_dir=args.output_dir,
                  prefix=args.prefix,
+                 include=args.include,
                  unmask=args.unmask,
                  builtins=args.builtins,
                  gen_tracing=not args.suppress_tracing)
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 477d027001..9617b7d4ed 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -282,18 +282,20 @@ def gen_type_cleanup(name: str) -> str:
 
 class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
 
-    def __init__(self, prefix: str):
+    def __init__(self, prefix: str, include: List[str]):
         super().__init__(
-            prefix, 'qapi-types', ' * Schema-defined QAPI types',
+            prefix, include, 'qapi-types', ' * Schema-defined QAPI types',
             ' * Built-in QAPI types', __doc__)
 
     def _begin_builtin_module(self) -> None:
         self._genc.preamble_add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "qapi/dealloc-visitor.h"
 #include "qapi/qapi-builtin-types.h"
 #include "qapi/qapi-builtin-visit.h"
-'''))
+''',
+                                      include=self.genc_include()))
         self._genh.preamble_add(mcgen('''
 #include "qapi/util.h"
 '''))
@@ -302,11 +304,13 @@ def _begin_user_module(self, name: str) -> None:
         types = self._module_basename('qapi-types', name)
         visit = self._module_basename('qapi-visit', name)
         self._genc.preamble_add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "qapi/dealloc-visitor.h"
 #include "%(types)s.h"
 #include "%(visit)s.h"
 ''',
+                                      include=self.genc_include(),
                                       types=types, visit=visit))
         self._genh.preamble_add(mcgen('''
 #include "qapi/qapi-builtin-types.h"
@@ -381,7 +385,8 @@ def visit_alternate_type(self,
 def gen_types(schema: QAPISchema,
               output_dir: str,
               prefix: str,
+              include: List[str],
               opt_builtins: bool) -> None:
-    vis = QAPISchemaGenTypeVisitor(prefix)
+    vis = QAPISchemaGenTypeVisitor(prefix, include)
     schema.visit(vis)
     vis.write(output_dir, opt_builtins)
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 380fa197f5..1ff464c036 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -318,17 +318,19 @@ def gen_visit_object(name: str) -> str:
 
 class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
 
-    def __init__(self, prefix: str):
+    def __init__(self, prefix: str, include: List[str]):
         super().__init__(
-            prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
+            prefix, include, 'qapi-visit', ' * Schema-defined QAPI visitors',
             ' * Built-in QAPI visitors', __doc__)
 
     def _begin_builtin_module(self) -> None:
         self._genc.preamble_add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "qapi/error.h"
 #include "qapi/qapi-builtin-visit.h"
-'''))
+''',
+                                      include=self.genc_include()))
         self._genh.preamble_add(mcgen('''
 #include "qapi/visitor.h"
 #include "qapi/qapi-builtin-types.h"
@@ -339,11 +341,13 @@ def _begin_user_module(self, name: str) -> None:
         types = self._module_basename('qapi-types', name)
         visit = self._module_basename('qapi-visit', name)
         self._genc.preamble_add(mcgen('''
-#include "qemu/osdep.h"
+%(include)s
+
 #include "qapi/error.h"
 #include "qapi/qmp/qerror.h"
 #include "%(visit)s.h"
 ''',
+                                      include=self.genc_include(),
                                       visit=visit))
         self._genh.preamble_add(mcgen('''
 #include "qapi/qapi-builtin-visit.h"
@@ -408,7 +412,8 @@ def visit_alternate_type(self,
 def gen_visit(schema: QAPISchema,
               output_dir: str,
               prefix: str,
+              include: List[str],
               opt_builtins: bool) -> None:
-    vis = QAPISchemaGenVisitVisitor(prefix)
+    vis = QAPISchemaGenVisitVisitor(prefix, include)
     schema.visit(vis)
     vis.write(output_dir, opt_builtins)
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 09/16] scripts/qapi: add required system includes to visitor
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (7 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 08/16] scripts/qapi-gen: add -i option marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 10/16] util: move 256-by-128 division helpers to int128 marcandre.lureau
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The generated visitor code includes abort() & assert(), we shouldn't
rely on the global "-i" headers to include the necessary system headers.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 scripts/qapi/visit.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 1ff464c036..4aba5ddd8a 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -342,6 +342,8 @@ def _begin_user_module(self, name: str) -> None:
         visit = self._module_basename('qapi-visit', name)
         self._genc.preamble_add(mcgen('''
 %(include)s
+#include <assert.h>
+#include <stdlib.h>
 
 #include "qapi/error.h"
 #include "qapi/qmp/qerror.h"
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 10/16] util: move 256-by-128 division helpers to int128
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (8 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 09/16] scripts/qapi: add required system includes to visitor marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 11/16] qemu-common: introduce a common subproject marcandre.lureau
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Break a cyclic dependency between int128 and host-utils.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Lucas Mateus Castro <lucas.araujo@eldorado.org.br>
---
 include/qemu/host-utils.h |   3 -
 include/qemu/int128.h     |   3 +
 util/host-utils.c         | 180 --------------------------------------
 util/int128.c             | 180 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 183 insertions(+), 183 deletions(-)

diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
index 88d476161c..e8162fb6b0 100644
--- a/include/qemu/host-utils.h
+++ b/include/qemu/host-utils.h
@@ -32,7 +32,6 @@
 
 #include "qemu/compiler.h"
 #include "qemu/bswap.h"
-#include "qemu/int128.h"
 
 #ifdef CONFIG_INT128
 static inline void mulu64(uint64_t *plow, uint64_t *phigh,
@@ -784,6 +783,4 @@ static inline uint64_t udiv_qrnnd(uint64_t *r, uint64_t n1,
 #endif
 }
 
-Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor);
-Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor);
 #endif
diff --git a/include/qemu/int128.h b/include/qemu/int128.h
index d2b76ca6ac..823c61edb0 100644
--- a/include/qemu/int128.h
+++ b/include/qemu/int128.h
@@ -472,4 +472,7 @@ static inline void bswap128s(Int128 *s)
 #define INT128_MAX int128_make128(UINT64_MAX, INT64_MAX)
 #define INT128_MIN int128_make128(0, INT64_MIN)
 
+Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor);
+Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor);
+
 #endif /* INT128_H */
diff --git a/util/host-utils.c b/util/host-utils.c
index fb91bcba82..96d5dc0bed 100644
--- a/util/host-utils.c
+++ b/util/host-utils.c
@@ -266,183 +266,3 @@ void ulshift(uint64_t *plow, uint64_t *phigh, int32_t shift, bool *overflow)
         *plow = *plow << shift;
     }
 }
-
-/*
- * Unsigned 256-by-128 division.
- * Returns the remainder via r.
- * Returns lower 128 bit of quotient.
- * Needs a normalized divisor (most significant bit set to 1).
- *
- * Adapted from include/qemu/host-utils.h udiv_qrnnd,
- * from the GNU Multi Precision Library - longlong.h __udiv_qrnnd
- * (https://gmplib.org/repo/gmp/file/tip/longlong.h)
- *
- * Licensed under the GPLv2/LGPLv3
- */
-static Int128 udiv256_qrnnd(Int128 *r, Int128 n1, Int128 n0, Int128 d)
-{
-    Int128 d0, d1, q0, q1, r1, r0, m;
-    uint64_t mp0, mp1;
-
-    d0 = int128_make64(int128_getlo(d));
-    d1 = int128_make64(int128_gethi(d));
-
-    r1 = int128_remu(n1, d1);
-    q1 = int128_divu(n1, d1);
-    mp0 = int128_getlo(q1);
-    mp1 = int128_gethi(q1);
-    mulu128(&mp0, &mp1, int128_getlo(d0));
-    m = int128_make128(mp0, mp1);
-    r1 = int128_make128(int128_gethi(n0), int128_getlo(r1));
-    if (int128_ult(r1, m)) {
-        q1 = int128_sub(q1, int128_one());
-        r1 = int128_add(r1, d);
-        if (int128_uge(r1, d)) {
-            if (int128_ult(r1, m)) {
-                q1 = int128_sub(q1, int128_one());
-                r1 = int128_add(r1, d);
-            }
-        }
-    }
-    r1 = int128_sub(r1, m);
-
-    r0 = int128_remu(r1, d1);
-    q0 = int128_divu(r1, d1);
-    mp0 = int128_getlo(q0);
-    mp1 = int128_gethi(q0);
-    mulu128(&mp0, &mp1, int128_getlo(d0));
-    m = int128_make128(mp0, mp1);
-    r0 = int128_make128(int128_getlo(n0), int128_getlo(r0));
-    if (int128_ult(r0, m)) {
-        q0 = int128_sub(q0, int128_one());
-        r0 = int128_add(r0, d);
-        if (int128_uge(r0, d)) {
-            if (int128_ult(r0, m)) {
-                q0 = int128_sub(q0, int128_one());
-                r0 = int128_add(r0, d);
-            }
-        }
-    }
-    r0 = int128_sub(r0, m);
-
-    *r = r0;
-    return int128_or(int128_lshift(q1, 64), q0);
-}
-
-/*
- * Unsigned 256-by-128 division.
- * Returns the remainder.
- * Returns quotient via plow and phigh.
- * Also returns the remainder via the function return value.
- */
-Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor)
-{
-    Int128 dhi = *phigh;
-    Int128 dlo = *plow;
-    Int128 rem, dhighest;
-    int sh;
-
-    if (!int128_nz(divisor) || !int128_nz(dhi)) {
-        *plow  = int128_divu(dlo, divisor);
-        *phigh = int128_zero();
-        return int128_remu(dlo, divisor);
-    } else {
-        sh = clz128(divisor);
-
-        if (int128_ult(dhi, divisor)) {
-            if (sh != 0) {
-                /* normalize the divisor, shifting the dividend accordingly */
-                divisor = int128_lshift(divisor, sh);
-                dhi = int128_or(int128_lshift(dhi, sh),
-                                int128_urshift(dlo, (128 - sh)));
-                dlo = int128_lshift(dlo, sh);
-            }
-
-            *phigh = int128_zero();
-            *plow = udiv256_qrnnd(&rem, dhi, dlo, divisor);
-        } else {
-            if (sh != 0) {
-                /* normalize the divisor, shifting the dividend accordingly */
-                divisor = int128_lshift(divisor, sh);
-                dhighest = int128_rshift(dhi, (128 - sh));
-                dhi = int128_or(int128_lshift(dhi, sh),
-                                int128_urshift(dlo, (128 - sh)));
-                dlo = int128_lshift(dlo, sh);
-
-                *phigh = udiv256_qrnnd(&dhi, dhighest, dhi, divisor);
-            } else {
-                /*
-                 * dhi >= divisor
-                 * Since the MSB of divisor is set (sh == 0),
-                 * (dhi - divisor) < divisor
-                 *
-                 * Thus, the high part of the quotient is 1, and we can
-                 * calculate the low part with a single call to udiv_qrnnd
-                 * after subtracting divisor from dhi
-                 */
-                dhi = int128_sub(dhi, divisor);
-                *phigh = int128_one();
-            }
-
-            *plow = udiv256_qrnnd(&rem, dhi, dlo, divisor);
-        }
-
-        /*
-         * since the dividend/divisor might have been normalized,
-         * the remainder might also have to be shifted back
-         */
-        rem = int128_urshift(rem, sh);
-        return rem;
-    }
-}
-
-/*
- * Signed 256-by-128 division.
- * Returns quotient via plow and phigh.
- * Also returns the remainder via the function return value.
- */
-Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor)
-{
-    bool neg_quotient = false, neg_remainder = false;
-    Int128 unsig_hi = *phigh, unsig_lo = *plow;
-    Int128 rem;
-
-    if (!int128_nonneg(*phigh)) {
-        neg_quotient = !neg_quotient;
-        neg_remainder = !neg_remainder;
-
-        if (!int128_nz(unsig_lo)) {
-            unsig_hi = int128_neg(unsig_hi);
-        } else {
-            unsig_hi = int128_not(unsig_hi);
-            unsig_lo = int128_neg(unsig_lo);
-        }
-    }
-
-    if (!int128_nonneg(divisor)) {
-        neg_quotient = !neg_quotient;
-
-        divisor = int128_neg(divisor);
-    }
-
-    rem = divu256(&unsig_lo, &unsig_hi, divisor);
-
-    if (neg_quotient) {
-        if (!int128_nz(unsig_lo)) {
-            *phigh = int128_neg(unsig_hi);
-            *plow = int128_zero();
-        } else {
-            *phigh = int128_not(unsig_hi);
-            *plow = int128_neg(unsig_lo);
-        }
-    } else {
-        *phigh = unsig_hi;
-        *plow = unsig_lo;
-    }
-
-    if (neg_remainder) {
-        return int128_neg(rem);
-    } else {
-        return rem;
-    }
-}
diff --git a/util/int128.c b/util/int128.c
index ed8f25fef1..482c63b655 100644
--- a/util/int128.c
+++ b/util/int128.c
@@ -145,3 +145,183 @@ Int128 int128_rems(Int128 a, Int128 b)
 }
 
 #endif
+
+/*
+ * Unsigned 256-by-128 division.
+ * Returns the remainder via r.
+ * Returns lower 128 bit of quotient.
+ * Needs a normalized divisor (most significant bit set to 1).
+ *
+ * Adapted from include/qemu/host-utils.h udiv_qrnnd,
+ * from the GNU Multi Precision Library - longlong.h __udiv_qrnnd
+ * (https://gmplib.org/repo/gmp/file/tip/longlong.h)
+ *
+ * Licensed under the GPLv2/LGPLv3
+ */
+static Int128 udiv256_qrnnd(Int128 *r, Int128 n1, Int128 n0, Int128 d)
+{
+    Int128 d0, d1, q0, q1, r1, r0, m;
+    uint64_t mp0, mp1;
+
+    d0 = int128_make64(int128_getlo(d));
+    d1 = int128_make64(int128_gethi(d));
+
+    r1 = int128_remu(n1, d1);
+    q1 = int128_divu(n1, d1);
+    mp0 = int128_getlo(q1);
+    mp1 = int128_gethi(q1);
+    mulu128(&mp0, &mp1, int128_getlo(d0));
+    m = int128_make128(mp0, mp1);
+    r1 = int128_make128(int128_gethi(n0), int128_getlo(r1));
+    if (int128_ult(r1, m)) {
+        q1 = int128_sub(q1, int128_one());
+        r1 = int128_add(r1, d);
+        if (int128_uge(r1, d)) {
+            if (int128_ult(r1, m)) {
+                q1 = int128_sub(q1, int128_one());
+                r1 = int128_add(r1, d);
+            }
+        }
+    }
+    r1 = int128_sub(r1, m);
+
+    r0 = int128_remu(r1, d1);
+    q0 = int128_divu(r1, d1);
+    mp0 = int128_getlo(q0);
+    mp1 = int128_gethi(q0);
+    mulu128(&mp0, &mp1, int128_getlo(d0));
+    m = int128_make128(mp0, mp1);
+    r0 = int128_make128(int128_getlo(n0), int128_getlo(r0));
+    if (int128_ult(r0, m)) {
+        q0 = int128_sub(q0, int128_one());
+        r0 = int128_add(r0, d);
+        if (int128_uge(r0, d)) {
+            if (int128_ult(r0, m)) {
+                q0 = int128_sub(q0, int128_one());
+                r0 = int128_add(r0, d);
+            }
+        }
+    }
+    r0 = int128_sub(r0, m);
+
+    *r = r0;
+    return int128_or(int128_lshift(q1, 64), q0);
+}
+
+/*
+ * Unsigned 256-by-128 division.
+ * Returns the remainder.
+ * Returns quotient via plow and phigh.
+ * Also returns the remainder via the function return value.
+ */
+Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor)
+{
+    Int128 dhi = *phigh;
+    Int128 dlo = *plow;
+    Int128 rem, dhighest;
+    int sh;
+
+    if (!int128_nz(divisor) || !int128_nz(dhi)) {
+        *plow  = int128_divu(dlo, divisor);
+        *phigh = int128_zero();
+        return int128_remu(dlo, divisor);
+    } else {
+        sh = clz128(divisor);
+
+        if (int128_ult(dhi, divisor)) {
+            if (sh != 0) {
+                /* normalize the divisor, shifting the dividend accordingly */
+                divisor = int128_lshift(divisor, sh);
+                dhi = int128_or(int128_lshift(dhi, sh),
+                                int128_urshift(dlo, (128 - sh)));
+                dlo = int128_lshift(dlo, sh);
+            }
+
+            *phigh = int128_zero();
+            *plow = udiv256_qrnnd(&rem, dhi, dlo, divisor);
+        } else {
+            if (sh != 0) {
+                /* normalize the divisor, shifting the dividend accordingly */
+                divisor = int128_lshift(divisor, sh);
+                dhighest = int128_rshift(dhi, (128 - sh));
+                dhi = int128_or(int128_lshift(dhi, sh),
+                                int128_urshift(dlo, (128 - sh)));
+                dlo = int128_lshift(dlo, sh);
+
+                *phigh = udiv256_qrnnd(&dhi, dhighest, dhi, divisor);
+            } else {
+                /*
+                 * dhi >= divisor
+                 * Since the MSB of divisor is set (sh == 0),
+                 * (dhi - divisor) < divisor
+                 *
+                 * Thus, the high part of the quotient is 1, and we can
+                 * calculate the low part with a single call to udiv_qrnnd
+                 * after subtracting divisor from dhi
+                 */
+                dhi = int128_sub(dhi, divisor);
+                *phigh = int128_one();
+            }
+
+            *plow = udiv256_qrnnd(&rem, dhi, dlo, divisor);
+        }
+
+        /*
+         * since the dividend/divisor might have been normalized,
+         * the remainder might also have to be shifted back
+         */
+        rem = int128_urshift(rem, sh);
+        return rem;
+    }
+}
+
+/*
+ * Signed 256-by-128 division.
+ * Returns quotient via plow and phigh.
+ * Also returns the remainder via the function return value.
+ */
+Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor)
+{
+    bool neg_quotient = false, neg_remainder = false;
+    Int128 unsig_hi = *phigh, unsig_lo = *plow;
+    Int128 rem;
+
+    if (!int128_nonneg(*phigh)) {
+        neg_quotient = !neg_quotient;
+        neg_remainder = !neg_remainder;
+
+        if (!int128_nz(unsig_lo)) {
+            unsig_hi = int128_neg(unsig_hi);
+        } else {
+            unsig_hi = int128_not(unsig_hi);
+            unsig_lo = int128_neg(unsig_lo);
+        }
+    }
+
+    if (!int128_nonneg(divisor)) {
+        neg_quotient = !neg_quotient;
+
+        divisor = int128_neg(divisor);
+    }
+
+    rem = divu256(&unsig_lo, &unsig_hi, divisor);
+
+    if (neg_quotient) {
+        if (!int128_nz(unsig_lo)) {
+            *phigh = int128_neg(unsig_hi);
+            *plow = int128_zero();
+        } else {
+            *phigh = int128_not(unsig_hi);
+            *plow = int128_neg(unsig_lo);
+        }
+    } else {
+        *phigh = unsig_hi;
+        *plow = unsig_lo;
+    }
+
+    if (neg_remainder) {
+        return int128_neg(rem);
+    } else {
+        return rem;
+    }
+}
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 11/16] qemu-common: introduce a common subproject
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (9 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 10/16] util: move 256-by-128 division helpers to int128 marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 12/16] qemu-common: move scripts/qapi marcandre.lureau
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Add a new meson subproject to provide common code and scripts for QEMU
and tools. Initially, it will offer QAPI/QMP code generation and
common utilities.

libvhost-user & libvduse will make use of the subproject to avoid having
include/ links to common headers.

The other targeted user is qemu-ga, which will also be converted to a
subproject (so it can be built, moved, released etc independent from QEMU).

Other projects such as qemu-storage-daemon could be built standalone
eventually in the future.

Note that with meson subprojects are "global". Projects will share
subprojects (https://mesonbuild.com/Subprojects.html#subprojects-depending-on-other-subprojects).
We will add extra subprojects/ links to allow standalone subproject
compilation though.

This initial commit simply set the stage to build and link against it.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 meson.build                                              | 9 ++++++++-
 .../qemu-common/include}/qemu/help-texts.h               | 0
 subprojects/libvduse/meson.build                         | 2 ++
 subprojects/libvduse/subprojects/qemu-common             | 1 +
 subprojects/libvhost-user/meson.build                    | 2 ++
 subprojects/libvhost-user/subprojects/qemu-common        | 1 +
 subprojects/qemu-common/meson.build                      | 8 ++++++++
 7 files changed, 22 insertions(+), 1 deletion(-)
 rename {include => subprojects/qemu-common/include}/qemu/help-texts.h (100%)
 create mode 120000 subprojects/libvduse/subprojects/qemu-common
 create mode 120000 subprojects/libvhost-user/subprojects/qemu-common
 create mode 100644 subprojects/qemu-common/meson.build

diff --git a/meson.build b/meson.build
index 294e9a8f32..a47ce88c84 100644
--- a/meson.build
+++ b/meson.build
@@ -169,6 +169,10 @@ if 'dtrace' in get_option('trace_backends')
   endif
 endif
 
+add_project_arguments('-I' + meson.current_source_dir() / 'subprojects/qemu-common/include',
+  language: ['c', 'cpp', 'objc'],
+)
+
 if get_option('iasl') == ''
   iasl = find_program('iasl', required: false)
 else
@@ -1583,6 +1587,9 @@ if libbpf.found() and not cc.links('''
   endif
 endif
 
+qemu_common = subproject('qemu-common')
+qemu_common = qemu_common.get_variable('qemu_common_dep')
+
 #################
 # config-host.h #
 #################
@@ -3057,7 +3064,7 @@ util_ss.add_all(trace_ss)
 util_ss = util_ss.apply(config_all, strict: false)
 libqemuutil = static_library('qemuutil',
                              sources: util_ss.sources() + stub_ss.sources() + genh,
-                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
+                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman, qemu_common])
 qemuutil = declare_dependency(link_with: libqemuutil,
                               sources: genh + version_res,
                               dependencies: [event_loop_base])
diff --git a/include/qemu/help-texts.h b/subprojects/qemu-common/include/qemu/help-texts.h
similarity index 100%
rename from include/qemu/help-texts.h
rename to subprojects/qemu-common/include/qemu/help-texts.h
diff --git a/subprojects/libvduse/meson.build b/subprojects/libvduse/meson.build
index ba08f5ee1a..841509ecb9 100644
--- a/subprojects/libvduse/meson.build
+++ b/subprojects/libvduse/meson.build
@@ -2,6 +2,8 @@ project('libvduse', 'c',
         license: 'GPL-2.0-or-later',
         default_options: ['c_std=gnu99'])
 
+qemu_common = subproject('qemu-common')
+
 libvduse = static_library('vduse',
                           files('libvduse.c'),
                           c_args: '-D_GNU_SOURCE')
diff --git a/subprojects/libvduse/subprojects/qemu-common b/subprojects/libvduse/subprojects/qemu-common
new file mode 120000
index 0000000000..4c1c87018a
--- /dev/null
+++ b/subprojects/libvduse/subprojects/qemu-common
@@ -0,0 +1 @@
+../../qemu-common
\ No newline at end of file
diff --git a/subprojects/libvhost-user/meson.build b/subprojects/libvhost-user/meson.build
index 39825d9404..73355908e0 100644
--- a/subprojects/libvhost-user/meson.build
+++ b/subprojects/libvhost-user/meson.build
@@ -5,6 +5,8 @@ project('libvhost-user', 'c',
 threads = dependency('threads')
 glib = dependency('glib-2.0')
 
+qemu_common = subproject('qemu-common')
+
 vhost_user = static_library('vhost-user',
                             files('libvhost-user.c'),
                             dependencies: threads,
diff --git a/subprojects/libvhost-user/subprojects/qemu-common b/subprojects/libvhost-user/subprojects/qemu-common
new file mode 120000
index 0000000000..4c1c87018a
--- /dev/null
+++ b/subprojects/libvhost-user/subprojects/qemu-common
@@ -0,0 +1 @@
+../../qemu-common
\ No newline at end of file
diff --git a/subprojects/qemu-common/meson.build b/subprojects/qemu-common/meson.build
new file mode 100644
index 0000000000..8969b08473
--- /dev/null
+++ b/subprojects/qemu-common/meson.build
@@ -0,0 +1,8 @@
+project('qemu-common', 'c',
+  license: 'GPL-2.0-or-later',
+  default_options: ['c_std=gnu11']
+)
+
+qemu_common_dep = declare_dependency(
+  include_directories: include_directories('include'),
+)
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 12/16] qemu-common: move scripts/qapi
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (10 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 11/16] qemu-common: introduce a common subproject marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 13/16] qemu-common: move glib-compat.h marcandre.lureau
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This is just moving qapi-gen.py and related subdir to qemu-common, to
ease review and proceed step by step. The following patches will move
related necessary code, tests etc.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 docs/conf.py                                  |  2 +-
 meson.build                                   | 19 ++-----------------
 MAINTAINERS                                   |  4 ++--
 subprojects/qemu-common/meson.build           |  2 ++
 subprojects/qemu-common/scripts/meson.build   |  3 +++
 .../qemu-common/scripts}/qapi-gen.py          |  0
 .../qemu-common/scripts}/qapi/.flake8         |  0
 .../qemu-common/scripts}/qapi/.isort.cfg      |  0
 .../qemu-common/scripts}/qapi/__init__.py     |  0
 .../qemu-common/scripts}/qapi/commands.py     |  0
 .../qemu-common/scripts}/qapi/common.py       |  0
 .../qemu-common/scripts}/qapi/error.py        |  0
 .../qemu-common/scripts}/qapi/events.py       |  0
 .../qemu-common/scripts}/qapi/expr.py         |  0
 .../qemu-common/scripts}/qapi/gen.py          |  0
 .../qemu-common/scripts}/qapi/introspect.py   |  0
 .../qemu-common/scripts}/qapi/main.py         |  0
 .../qemu-common/scripts/qapi/meson.build      | 16 ++++++++++++++++
 .../qemu-common/scripts}/qapi/mypy.ini        |  0
 .../qemu-common/scripts}/qapi/parser.py       |  0
 .../qemu-common/scripts}/qapi/pylintrc        |  0
 .../qemu-common/scripts}/qapi/schema.py       |  0
 .../qemu-common/scripts}/qapi/source.py       |  0
 .../qemu-common/scripts}/qapi/types.py        |  0
 .../qemu-common/scripts}/qapi/visit.py        |  0
 tests/qapi-schema/meson.build                 |  2 +-
 26 files changed, 27 insertions(+), 21 deletions(-)
 create mode 100644 subprojects/qemu-common/scripts/meson.build
 rename {scripts => subprojects/qemu-common/scripts}/qapi-gen.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/.flake8 (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/.isort.cfg (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/__init__.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/commands.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/common.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/error.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/events.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/expr.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/gen.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/introspect.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/main.py (100%)
 create mode 100644 subprojects/qemu-common/scripts/qapi/meson.build
 rename {scripts => subprojects/qemu-common/scripts}/qapi/mypy.ini (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/parser.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/pylintrc (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/schema.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/source.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/types.py (100%)
 rename {scripts => subprojects/qemu-common/scripts}/qapi/visit.py (100%)

diff --git a/docs/conf.py b/docs/conf.py
index e33cf3d381..02dcd987b4 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -56,7 +56,7 @@
 # Our extensions are in docs/sphinx; the qapidoc extension requires
 # the QAPI modules from scripts/.
 sys.path.insert(0, os.path.join(qemu_docdir, "sphinx"))
-sys.path.insert(0, os.path.join(qemu_docdir, "../scripts"))
+sys.path.insert(0, os.path.join(qemu_docdir, "../subprojects/qemu-common/scripts"))
 
 
 # -- General configuration ------------------------------------------------
diff --git a/meson.build b/meson.build
index a47ce88c84..e8ba4361df 100644
--- a/meson.build
+++ b/meson.build
@@ -1588,6 +1588,8 @@ if libbpf.found() and not cc.links('''
 endif
 
 qemu_common = subproject('qemu-common')
+qapi_gen = qemu_common.get_variable('qapi_gen')
+qapi_gen_depends = qemu_common.get_variable('qapi_gen_depends')
 qemu_common = qemu_common.get_variable('qemu_common_dep')
 
 #################
@@ -2795,23 +2797,6 @@ genh += configure_file(output: 'config-host.h', configuration: config_host_data)
 
 hxtool = find_program('scripts/hxtool')
 shaderinclude = find_program('scripts/shaderinclude.pl')
-qapi_gen = find_program('scripts/qapi-gen.py')
-qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
-                     meson.current_source_dir() / 'scripts/qapi/commands.py',
-                     meson.current_source_dir() / 'scripts/qapi/common.py',
-                     meson.current_source_dir() / 'scripts/qapi/error.py',
-                     meson.current_source_dir() / 'scripts/qapi/events.py',
-                     meson.current_source_dir() / 'scripts/qapi/expr.py',
-                     meson.current_source_dir() / 'scripts/qapi/gen.py',
-                     meson.current_source_dir() / 'scripts/qapi/introspect.py',
-                     meson.current_source_dir() / 'scripts/qapi/parser.py',
-                     meson.current_source_dir() / 'scripts/qapi/schema.py',
-                     meson.current_source_dir() / 'scripts/qapi/source.py',
-                     meson.current_source_dir() / 'scripts/qapi/types.py',
-                     meson.current_source_dir() / 'scripts/qapi/visit.py',
-                     meson.current_source_dir() / 'scripts/qapi/common.py',
-                     meson.current_source_dir() / 'scripts/qapi-gen.py'
-]
 
 tracetool = [
   python, files('scripts/tracetool.py'),
diff --git a/MAINTAINERS b/MAINTAINERS
index 5ce4227ff6..abb75008fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2848,8 +2848,8 @@ F: tests/unit/test-*-visitor.c
 F: tests/unit/test-qapi-*.c
 F: tests/unit/test-qmp-*.c
 F: tests/unit/test-visitor-serialization.c
-F: scripts/qapi-gen.py
-F: scripts/qapi/*
+F: subprojects/qemu-common/scripts/qapi-gen.py
+F: subprojects/qemu-common/scripts/qapi/*
 F: docs/sphinx/qapidoc.py
 F: docs/devel/qapi*
 T: git https://repo.or.cz/qemu/armbru.git qapi-next
diff --git a/subprojects/qemu-common/meson.build b/subprojects/qemu-common/meson.build
index 8969b08473..207e539910 100644
--- a/subprojects/qemu-common/meson.build
+++ b/subprojects/qemu-common/meson.build
@@ -6,3 +6,5 @@ project('qemu-common', 'c',
 qemu_common_dep = declare_dependency(
   include_directories: include_directories('include'),
 )
+
+subdir('scripts')
diff --git a/subprojects/qemu-common/scripts/meson.build b/subprojects/qemu-common/scripts/meson.build
new file mode 100644
index 0000000000..626bed6dcd
--- /dev/null
+++ b/subprojects/qemu-common/scripts/meson.build
@@ -0,0 +1,3 @@
+qapi_gen = find_program('qapi-gen.py')
+
+subdir('qapi')
diff --git a/scripts/qapi-gen.py b/subprojects/qemu-common/scripts/qapi-gen.py
similarity index 100%
rename from scripts/qapi-gen.py
rename to subprojects/qemu-common/scripts/qapi-gen.py
diff --git a/scripts/qapi/.flake8 b/subprojects/qemu-common/scripts/qapi/.flake8
similarity index 100%
rename from scripts/qapi/.flake8
rename to subprojects/qemu-common/scripts/qapi/.flake8
diff --git a/scripts/qapi/.isort.cfg b/subprojects/qemu-common/scripts/qapi/.isort.cfg
similarity index 100%
rename from scripts/qapi/.isort.cfg
rename to subprojects/qemu-common/scripts/qapi/.isort.cfg
diff --git a/scripts/qapi/__init__.py b/subprojects/qemu-common/scripts/qapi/__init__.py
similarity index 100%
rename from scripts/qapi/__init__.py
rename to subprojects/qemu-common/scripts/qapi/__init__.py
diff --git a/scripts/qapi/commands.py b/subprojects/qemu-common/scripts/qapi/commands.py
similarity index 100%
rename from scripts/qapi/commands.py
rename to subprojects/qemu-common/scripts/qapi/commands.py
diff --git a/scripts/qapi/common.py b/subprojects/qemu-common/scripts/qapi/common.py
similarity index 100%
rename from scripts/qapi/common.py
rename to subprojects/qemu-common/scripts/qapi/common.py
diff --git a/scripts/qapi/error.py b/subprojects/qemu-common/scripts/qapi/error.py
similarity index 100%
rename from scripts/qapi/error.py
rename to subprojects/qemu-common/scripts/qapi/error.py
diff --git a/scripts/qapi/events.py b/subprojects/qemu-common/scripts/qapi/events.py
similarity index 100%
rename from scripts/qapi/events.py
rename to subprojects/qemu-common/scripts/qapi/events.py
diff --git a/scripts/qapi/expr.py b/subprojects/qemu-common/scripts/qapi/expr.py
similarity index 100%
rename from scripts/qapi/expr.py
rename to subprojects/qemu-common/scripts/qapi/expr.py
diff --git a/scripts/qapi/gen.py b/subprojects/qemu-common/scripts/qapi/gen.py
similarity index 100%
rename from scripts/qapi/gen.py
rename to subprojects/qemu-common/scripts/qapi/gen.py
diff --git a/scripts/qapi/introspect.py b/subprojects/qemu-common/scripts/qapi/introspect.py
similarity index 100%
rename from scripts/qapi/introspect.py
rename to subprojects/qemu-common/scripts/qapi/introspect.py
diff --git a/scripts/qapi/main.py b/subprojects/qemu-common/scripts/qapi/main.py
similarity index 100%
rename from scripts/qapi/main.py
rename to subprojects/qemu-common/scripts/qapi/main.py
diff --git a/subprojects/qemu-common/scripts/qapi/meson.build b/subprojects/qemu-common/scripts/qapi/meson.build
new file mode 100644
index 0000000000..5f73a966f3
--- /dev/null
+++ b/subprojects/qemu-common/scripts/qapi/meson.build
@@ -0,0 +1,16 @@
+qapi_gen_depends = files(
+  '__init__.py',
+  'commands.py',
+  'common.py',
+  'error.py',
+  'events.py',
+  'expr.py',
+  'gen.py',
+  'introspect.py',
+  'parser.py',
+  'schema.py',
+  'source.py',
+  'types.py',
+  'visit.py',
+  'common.py',
+)
diff --git a/scripts/qapi/mypy.ini b/subprojects/qemu-common/scripts/qapi/mypy.ini
similarity index 100%
rename from scripts/qapi/mypy.ini
rename to subprojects/qemu-common/scripts/qapi/mypy.ini
diff --git a/scripts/qapi/parser.py b/subprojects/qemu-common/scripts/qapi/parser.py
similarity index 100%
rename from scripts/qapi/parser.py
rename to subprojects/qemu-common/scripts/qapi/parser.py
diff --git a/scripts/qapi/pylintrc b/subprojects/qemu-common/scripts/qapi/pylintrc
similarity index 100%
rename from scripts/qapi/pylintrc
rename to subprojects/qemu-common/scripts/qapi/pylintrc
diff --git a/scripts/qapi/schema.py b/subprojects/qemu-common/scripts/qapi/schema.py
similarity index 100%
rename from scripts/qapi/schema.py
rename to subprojects/qemu-common/scripts/qapi/schema.py
diff --git a/scripts/qapi/source.py b/subprojects/qemu-common/scripts/qapi/source.py
similarity index 100%
rename from scripts/qapi/source.py
rename to subprojects/qemu-common/scripts/qapi/source.py
diff --git a/scripts/qapi/types.py b/subprojects/qemu-common/scripts/qapi/types.py
similarity index 100%
rename from scripts/qapi/types.py
rename to subprojects/qemu-common/scripts/qapi/types.py
diff --git a/scripts/qapi/visit.py b/subprojects/qemu-common/scripts/qapi/visit.py
similarity index 100%
rename from scripts/qapi/visit.py
rename to subprojects/qemu-common/scripts/qapi/visit.py
diff --git a/tests/qapi-schema/meson.build b/tests/qapi-schema/meson.build
index c18dd7d02f..2c67636004 100644
--- a/tests/qapi-schema/meson.build
+++ b/tests/qapi-schema/meson.build
@@ -1,5 +1,5 @@
 test_env = environment()
-test_env.set('PYTHONPATH', meson.project_source_root() / 'scripts')
+test_env.set('PYTHONPATH', meson.project_source_root() / 'subprojects/qemu-common/scripts')
 test_env.set('PYTHONIOENCODING', 'utf-8')
 
 schemas = [
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 13/16] qemu-common: move glib-compat.h
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (11 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 12/16] qemu-common: move scripts/qapi marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 14/16] qemu-common: move error-report marcandre.lureau
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

qemu-common will have compatible dependency requirements with QEMU.

Since qemu-common won't have a toplevel qemu/osdep.h which would include
various system headers, include stdbool.h (bool is used for some
declarations here).

Replace getenv() with g_getenv() to avoid extra header inclusion.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 {include => subprojects/qemu-common/include}/glib-compat.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
 rename {include => subprojects/qemu-common/include}/glib-compat.h (97%)

diff --git a/include/glib-compat.h b/subprojects/qemu-common/include/glib-compat.h
similarity index 97%
rename from include/glib-compat.h
rename to subprojects/qemu-common/include/glib-compat.h
index 43a562974d..2b0f2962f3 100644
--- a/include/glib-compat.h
+++ b/subprojects/qemu-common/include/glib-compat.h
@@ -30,6 +30,8 @@
 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 #include <glib.h>
+#include <stdbool.h>
+
 #if defined(G_OS_UNIX)
 #include <glib-unix.h>
 #include <sys/types.h>
@@ -133,7 +135,7 @@ qemu_g_test_slow(void)
 {
     static int cached = -1;
     if (cached == -1) {
-        cached = g_test_slow() || getenv("G_TEST_SLOW") != NULL;
+        cached = g_test_slow() || g_getenv("G_TEST_SLOW") != NULL;
     }
     return cached;
 }
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 14/16] qemu-common: move error-report
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (12 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 13/16] qemu-common: move glib-compat.h marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 15/16] mtest2make.py: teach suite name that are just "PROJECT" marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 16/16] qemu-common: add error-report test marcandre.lureau
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 .../qemu-common/include}/qemu/error-report.h  |  2 ++
 .../qemu-common/src}/error-is-detailed.c      |  1 -
 .../qemu-common/src}/error-report.c           |  4 +++-
 .../qemu-common/src/error-vprintf.c           |  5 ++---
 stubs/meson.build                             |  2 --
 subprojects/qemu-common/meson.build           | 20 ++++++++++++++++---
 subprojects/qemu-common/src/meson.build       |  5 +++++
 util/meson.build                              |  2 +-
 8 files changed, 30 insertions(+), 11 deletions(-)
 rename {include => subprojects/qemu-common/include}/qemu/error-report.h (98%)
 rename {stubs => subprojects/qemu-common/src}/error-is-detailed.c (77%)
 rename {util => subprojects/qemu-common/src}/error-report.c (99%)
 rename stubs/error-printf.c => subprojects/qemu-common/src/error-vprintf.c (78%)
 create mode 100644 subprojects/qemu-common/src/meson.build

diff --git a/include/qemu/error-report.h b/subprojects/qemu-common/include/qemu/error-report.h
similarity index 98%
rename from include/qemu/error-report.h
rename to subprojects/qemu-common/include/qemu/error-report.h
index 6ab25d4583..c62dd1a633 100644
--- a/include/qemu/error-report.h
+++ b/subprojects/qemu-common/include/qemu/error-report.h
@@ -13,6 +13,8 @@
 #ifndef QEMU_ERROR_REPORT_H
 #define QEMU_ERROR_REPORT_H
 
+#include "glib-compat.h"
+
 typedef struct Location {
     /* all members are private to qemu-error.c */
     enum { LOC_NONE, LOC_CMDLINE, LOC_FILE } kind;
diff --git a/stubs/error-is-detailed.c b/subprojects/qemu-common/src/error-is-detailed.c
similarity index 77%
rename from stubs/error-is-detailed.c
rename to subprojects/qemu-common/src/error-is-detailed.c
index c47cd23693..c3d9c3454d 100644
--- a/stubs/error-is-detailed.c
+++ b/subprojects/qemu-common/src/error-is-detailed.c
@@ -1,4 +1,3 @@
-#include "qemu/osdep.h"
 #include "qemu/error-report.h"
 
 bool error_is_detailed(void)
diff --git a/util/error-report.c b/subprojects/qemu-common/src/error-report.c
similarity index 99%
rename from util/error-report.c
rename to subprojects/qemu-common/src/error-report.c
index 4d1d66fc06..616428fe95 100644
--- a/util/error-report.c
+++ b/subprojects/qemu-common/src/error-report.c
@@ -10,7 +10,9 @@
  * See the COPYING file in the top-level directory.
  */
 
-#include "qemu/osdep.h"
+#include <stdio.h>
+#include <assert.h>
+
 #include "qemu/error-report.h"
 
 /*
diff --git a/stubs/error-printf.c b/subprojects/qemu-common/src/error-vprintf.c
similarity index 78%
rename from stubs/error-printf.c
rename to subprojects/qemu-common/src/error-vprintf.c
index 1afa0f62ca..b815d88dfe 100644
--- a/stubs/error-printf.c
+++ b/subprojects/qemu-common/src/error-vprintf.c
@@ -1,13 +1,12 @@
-#include "qemu/osdep.h"
+#include <stdio.h>
 #include "qemu/error-report.h"
-#include "monitor/monitor.h"
 
 int error_vprintf(const char *fmt, va_list ap)
 {
     int ret;
 
     if (g_test_initialized() && !g_test_subprocess() &&
-        getenv("QTEST_SILENT_ERRORS")) {
+        g_getenv("QTEST_SILENT_ERRORS")) {
         char *msg = g_strdup_vprintf(fmt, ap);
         g_test_message("%s", msg);
         ret = strlen(msg);
diff --git a/stubs/meson.build b/stubs/meson.build
index 14548633b0..865b677f2a 100644
--- a/stubs/meson.build
+++ b/stubs/meson.build
@@ -9,8 +9,6 @@ stub_ss.add(files('cpus-get-virtual-clock.c'))
 stub_ss.add(files('qemu-timer-notify-cb.c'))
 stub_ss.add(files('icount.c'))
 stub_ss.add(files('dump.c'))
-stub_ss.add(files('error-is-detailed.c'))
-stub_ss.add(files('error-printf.c'))
 stub_ss.add(files('fdset.c'))
 stub_ss.add(files('gdbstub.c'))
 stub_ss.add(files('get-vm-name.c'))
diff --git a/subprojects/qemu-common/meson.build b/subprojects/qemu-common/meson.build
index 207e539910..05bca6d30d 100644
--- a/subprojects/qemu-common/meson.build
+++ b/subprojects/qemu-common/meson.build
@@ -3,8 +3,22 @@ project('qemu-common', 'c',
   default_options: ['c_std=gnu11']
 )
 
-qemu_common_dep = declare_dependency(
-  include_directories: include_directories('include'),
-)
+glib_dep = dependency('glib-2.0')
+inc = include_directories('include')
+
+sources = []
 
 subdir('scripts')
+subdir('src')
+
+lib = static_library(
+  'qemu-common', sources,
+  dependencies: [glib_dep],
+  include_directories: inc,
+)
+
+qemu_common_dep = declare_dependency(
+  link_with: lib,
+  include_directories: inc,
+  dependencies: [glib_dep],
+)
diff --git a/subprojects/qemu-common/src/meson.build b/subprojects/qemu-common/src/meson.build
new file mode 100644
index 0000000000..d85a314065
--- /dev/null
+++ b/subprojects/qemu-common/src/meson.build
@@ -0,0 +1,5 @@
+sources += files(
+  'error-is-detailed.c',
+  'error-report.c',
+  'error-vprintf.c',
+)
diff --git a/util/meson.build b/util/meson.build
index 5e282130df..38bb08675b 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -29,7 +29,7 @@ util_ss.add(files('host-utils.c'))
 util_ss.add(files('bitmap.c', 'bitops.c'))
 util_ss.add(files('fifo8.c'))
 util_ss.add(files('cacheflush.c'))
-util_ss.add(files('error.c', 'error-report.c'))
+util_ss.add(files('error.c'))
 util_ss.add(files('qemu-print.c'))
 util_ss.add(files('id.c'))
 util_ss.add(files('qemu-config.c', 'notify.c'))
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 15/16] mtest2make.py: teach suite name that are just "PROJECT"
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (13 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 14/16] qemu-common: move error-report marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  2022-08-10 12:48 ` [PATCH v3 16/16] qemu-common: add error-report test marcandre.lureau
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

A subproject test may be simply in the "PROJECT" suite (such as
"qemu-common" with the following patches)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 scripts/mtest2make.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py
index 0fe81efbbc..179dd54871 100644
--- a/scripts/mtest2make.py
+++ b/scripts/mtest2make.py
@@ -51,10 +51,11 @@ def process_tests(test, targets, suites):
 
     test_suites = test['suite'] or ['default']
     for s in test_suites:
-        # The suite name in the introspection info is "PROJECT:SUITE"
-        s = s.split(':')[1]
-        if s == 'slow' or s == 'thorough':
-            continue
+        # The suite name in the introspection info is "PROJECT" or "PROJECT:SUITE"
+        if ':' in s:
+            s = s.split(':')[1]
+            if s == 'slow' or s == 'thorough':
+                continue
         if s.endswith('-slow'):
             s = s[:-5]
             suites[s].speeds.append('slow')
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 16/16] qemu-common: add error-report test
  2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
                   ` (14 preceding siblings ...)
  2022-08-10 12:48 ` [PATCH v3 15/16] mtest2make.py: teach suite name that are just "PROJECT" marcandre.lureau
@ 2022-08-10 12:48 ` marcandre.lureau
  15 siblings, 0 replies; 17+ messages in thread
From: marcandre.lureau @ 2022-08-10 12:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Markus Armbruster, Peter Maydell, Cleber Rosa, Michael Roth,
	John Snow, Xie Yongji, Paolo Bonzini, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Add new tests to check the behaviour of error reporting functions.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 .../qemu-common/tests/test-error-report.c     | 120 ++++++++++++++++++
 subprojects/qemu-common/meson.build           |   2 +
 subprojects/qemu-common/tests/meson.build     |  12 ++
 3 files changed, 134 insertions(+)
 create mode 100644 subprojects/qemu-common/tests/test-error-report.c
 create mode 100644 subprojects/qemu-common/tests/meson.build

diff --git a/subprojects/qemu-common/tests/test-error-report.c b/subprojects/qemu-common/tests/test-error-report.c
new file mode 100644
index 0000000000..09a2d122a0
--- /dev/null
+++ b/subprojects/qemu-common/tests/test-error-report.c
@@ -0,0 +1,120 @@
+/*
+ * Error reporting test
+ *
+ * Copyright (C) 2022 Red Hat Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "glib-compat.h"
+#include <locale.h>
+
+#include "qemu/error-report.h"
+
+static void
+test_error_report_simple(void)
+{
+    if (g_test_subprocess()) {
+        error_report("%s", "test error");
+        warn_report("%s", "test warn");
+        info_report("%s", "test info");
+        return;
+    }
+
+    g_test_trap_subprocess(NULL, 0, 0);
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stderr("\
+test-error-report: test error*\
+test-error-report: warning: test warn*\
+test-error-report: info: test info*\
+");
+}
+
+static void
+test_error_report_loc(void)
+{
+    if (g_test_subprocess()) {
+        loc_set_file("some-file.c", 7717);
+        error_report("%s", "test error1");
+        loc_set_none();
+        error_report("%s", "test error2");
+        return;
+    }
+
+    g_test_trap_subprocess(NULL, 0, 0);
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stderr("\
+test-error-report:some-file.c:7717: test error1*\
+test-error-report: test error2*\
+");
+}
+
+static void
+test_error_report_glog(void)
+{
+    if (g_test_subprocess()) {
+        g_message("gmessage");
+        return;
+    }
+
+    g_test_trap_subprocess(NULL, 0, 0);
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stderr("test-error-report: info: gmessage*");
+}
+
+static void
+test_error_report_once(void)
+{
+    int i;
+
+    if (g_test_subprocess()) {
+        for (i = 0; i < 3; i++) {
+            warn_report_once("warn");
+            error_report_once("err");
+        }
+        return;
+    }
+
+    g_test_trap_subprocess(NULL, 0, 0);
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stderr("\
+test-error-report: warning: warn*\
+test-error-report: err*\
+");
+}
+
+static void
+test_error_report_timestamp(void)
+{
+    if (g_test_subprocess()) {
+        message_with_timestamp = true;
+        warn_report("warn");
+        error_report("err");
+        return;
+    }
+
+    g_test_trap_subprocess(NULL, 0, 0);
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stderr("\
+*-*-*:*:* test-error-report: warning: warn*\
+*-*-*:*:* test-error-report: err*\
+");
+}
+
+int
+main(int argc, char *argv[])
+{
+    setlocale(LC_ALL, "");
+
+    g_test_init(&argc, &argv, NULL);
+    error_init("test-error-report");
+
+    g_test_add_func("/error-report/simple", test_error_report_simple);
+    g_test_add_func("/error-report/loc", test_error_report_loc);
+    g_test_add_func("/error-report/glog", test_error_report_glog);
+    g_test_add_func("/error-report/once", test_error_report_once);
+    g_test_add_func("/error-report/timestamp", test_error_report_timestamp);
+
+    return g_test_run();
+}
diff --git a/subprojects/qemu-common/meson.build b/subprojects/qemu-common/meson.build
index 05bca6d30d..991aaac520 100644
--- a/subprojects/qemu-common/meson.build
+++ b/subprojects/qemu-common/meson.build
@@ -22,3 +22,5 @@ qemu_common_dep = declare_dependency(
   include_directories: inc,
   dependencies: [glib_dep],
 )
+
+subdir('tests')
diff --git a/subprojects/qemu-common/tests/meson.build b/subprojects/qemu-common/tests/meson.build
new file mode 100644
index 0000000000..3dd10c180b
--- /dev/null
+++ b/subprojects/qemu-common/tests/meson.build
@@ -0,0 +1,12 @@
+env = [
+  'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()),
+  'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()),
+]
+
+test('error-report',
+  executable('test-error-report',
+    sources: files('test-error-report.c'),
+    dependencies: qemu_common_dep,
+  ),
+  env: env,
+)
-- 
2.37.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2022-08-10 13:17 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-10 12:48 [PATCH v3 00/16] Preliminary patches for subproject split marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 01/16] error-report: misc comment fix marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 02/16] error-report: introduce "detailed" variable marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 03/16] error-report: simplify print_loc() marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 04/16] error-report: introduce overridable error_is_detailed() marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 05/16] stubs: remove needless error_vprintf_unless_qmp() marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 06/16] qapi: move QEMU-specific dispatch code in monitor marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 07/16] qapi: remove QEMU-specific monitor dependency from dispatch marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 08/16] scripts/qapi-gen: add -i option marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 09/16] scripts/qapi: add required system includes to visitor marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 10/16] util: move 256-by-128 division helpers to int128 marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 11/16] qemu-common: introduce a common subproject marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 12/16] qemu-common: move scripts/qapi marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 13/16] qemu-common: move glib-compat.h marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 14/16] qemu-common: move error-report marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 15/16] mtest2make.py: teach suite name that are just "PROJECT" marcandre.lureau
2022-08-10 12:48 ` [PATCH v3 16/16] qemu-common: add error-report test marcandre.lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.