diff mbox series

[21/25] plugins/api: split out binary path/start/end/entry code

Message ID 20250226140343.3907080-22-alex.bennee@linaro.org
State New
Headers show
Series maintainer updates for 10.0 softfreeze (gpu/tcg tests, plugins, MAINTAINERS) | expand

Commit Message

Alex Bennée Feb. 26, 2025, 2:03 p.m. UTC
To move the main api.c to a single build compilation object we need to
start splitting out user and system specific code. As we need to grob
around host headers we move these particular helpers into the *-user
mode directories.

The binary/start/end/entry helpers are all NOPs for system mode.

While using the plugin-api.c.inc trick means we build for both
linux-user and bsd-user the BSD user-mode command line is still
missing -plugin. This can be enabled once we have reliable check-tcg
tests working for the BSDs.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20250225110844.3296991-8-alex.bennee@linaro.org>

---
v2
  - use common-user/plugin-api.c.inc instead
  - add commentary about state of plugins for BSD user
---
 bsd-user/plugin-api.c        | 15 +++++++++++++
 linux-user/plugin-api.c      | 14 ++++++++++++
 plugins/api-system.c         | 39 ++++++++++++++++++++++++++++++++
 plugins/api.c                | 43 ------------------------------------
 common-user/plugin-api.c.inc | 43 ++++++++++++++++++++++++++++++++++++
 bsd-user/meson.build         |  1 +
 linux-user/meson.build       |  1 +
 plugins/meson.build          |  2 +-
 8 files changed, 114 insertions(+), 44 deletions(-)
 create mode 100644 bsd-user/plugin-api.c
 create mode 100644 linux-user/plugin-api.c
 create mode 100644 plugins/api-system.c
 create mode 100644 common-user/plugin-api.c.inc

Comments

Warner Losh Feb. 26, 2025, 3:28 p.m. UTC | #1
On Wed, Feb 26, 2025 at 7:11 AM Alex Bennée <alex.bennee@linaro.org> wrote:

> To move the main api.c to a single build compilation object we need to
> start splitting out user and system specific code. As we need to grob
> around host headers we move these particular helpers into the *-user
> mode directories.
>
> The binary/start/end/entry helpers are all NOPs for system mode.
>
> While using the plugin-api.c.inc trick means we build for both
> linux-user and bsd-user the BSD user-mode command line is still
> missing -plugin. This can be enabled once we have reliable check-tcg
> tests working for the BSDs.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Message-Id: <20250225110844.3296991-8-alex.bennee@linaro.org>
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

I'd love to see the check-tcg working well for bsd, but I'm swamped with
other commitments.

Warner


> ---
> v2
>   - use common-user/plugin-api.c.inc instead
>   - add commentary about state of plugins for BSD user
> ---
>  bsd-user/plugin-api.c        | 15 +++++++++++++
>  linux-user/plugin-api.c      | 14 ++++++++++++
>  plugins/api-system.c         | 39 ++++++++++++++++++++++++++++++++
>  plugins/api.c                | 43 ------------------------------------
>  common-user/plugin-api.c.inc | 43 ++++++++++++++++++++++++++++++++++++
>  bsd-user/meson.build         |  1 +
>  linux-user/meson.build       |  1 +
>  plugins/meson.build          |  2 +-
>  8 files changed, 114 insertions(+), 44 deletions(-)
>  create mode 100644 bsd-user/plugin-api.c
>  create mode 100644 linux-user/plugin-api.c
>  create mode 100644 plugins/api-system.c
>  create mode 100644 common-user/plugin-api.c.inc
>
> diff --git a/bsd-user/plugin-api.c b/bsd-user/plugin-api.c
> new file mode 100644
> index 0000000000..6ccef7eaa0
> --- /dev/null
> +++ b/bsd-user/plugin-api.c
> @@ -0,0 +1,15 @@
> +/*
> + * QEMU Plugin API - bsd-user-mode only implementations
> + *
> + * Common user-mode only APIs are in plugins/api-user. These helpers
> + * are only specific to bsd-user.
> + *
> + * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
> + * Copyright (C) 2019-2025, Linaro
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu.h"
> +#include "common-user/plugin-api.c.inc"
> diff --git a/linux-user/plugin-api.c b/linux-user/plugin-api.c
> new file mode 100644
> index 0000000000..e4f796d926
> --- /dev/null
> +++ b/linux-user/plugin-api.c
> @@ -0,0 +1,14 @@
> +/*
> + * QEMU Plugin API - linux-user-mode only implementations
> + *
> + * Common user-mode only APIs are in plugins/api-user. These helpers
> + * are only specific to linux-user.
> + *
> + * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
> + * Copyright (C) 2019-2025, Linaro
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu.h"
> +#include "common-user/plugin-api.c.inc"
> diff --git a/plugins/api-system.c b/plugins/api-system.c
> new file mode 100644
> index 0000000000..cb0dd8f730
> --- /dev/null
> +++ b/plugins/api-system.c
> @@ -0,0 +1,39 @@
> +/*
> + * QEMU Plugin API - System specific implementations
> + *
> + * This provides the APIs that have a specific system implementation
> + * or are only relevant to system-mode.
> + *
> + * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
> + * Copyright (C) 2019-2025, Linaro
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/main-loop.h"
> +#include "qemu/plugin.h"
> +
> +/*
> + * In system mode we cannot trace the binary being executed so the
> + * helpers all return NULL/0.
> + */
> +const char *qemu_plugin_path_to_binary(void)
> +{
> +    return NULL;
> +}
> +
> +uint64_t qemu_plugin_start_code(void)
> +{
> +    return 0;
> +}
> +
> +uint64_t qemu_plugin_end_code(void)
> +{
> +    return 0;
> +}
> +
> +uint64_t qemu_plugin_entry_code(void)
> +{
> +    return 0;
> +}
> diff --git a/plugins/api.c b/plugins/api.c
> index c3ba1e98e8..ffccd71e4b 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -471,49 +471,6 @@ bool qemu_plugin_bool_parse(const char *name, const
> char *value, bool *ret)
>      return name && value && qapi_bool_parse(name, value, ret, NULL);
>  }
>
> -/*
> - * Binary path, start and end locations
> - */
> -const char *qemu_plugin_path_to_binary(void)
> -{
> -    char *path = NULL;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = get_task_state(current_cpu);
> -    path = g_strdup(ts->bprm->filename);
> -#endif
> -    return path;
> -}
> -
> -uint64_t qemu_plugin_start_code(void)
> -{
> -    uint64_t start = 0;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = get_task_state(current_cpu);
> -    start = ts->info->start_code;
> -#endif
> -    return start;
> -}
> -
> -uint64_t qemu_plugin_end_code(void)
> -{
> -    uint64_t end = 0;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = get_task_state(current_cpu);
> -    end = ts->info->end_code;
> -#endif
> -    return end;
> -}
> -
> -uint64_t qemu_plugin_entry_code(void)
> -{
> -    uint64_t entry = 0;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = get_task_state(current_cpu);
> -    entry = ts->info->entry;
> -#endif
> -    return entry;
> -}
> -
>  /*
>   * Create register handles.
>   *
> diff --git a/common-user/plugin-api.c.inc b/common-user/plugin-api.c.inc
> new file mode 100644
> index 0000000000..5b8a1396b6
> --- /dev/null
> +++ b/common-user/plugin-api.c.inc
> @@ -0,0 +1,43 @@
> +/*
> + * QEMU Plugin API - *-user-mode only implementations
> + *
> + * Common user-mode only APIs are in plugins/api-user. These helpers
> + * are only specific to the *-user frontends.
> + *
> + * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
> + * Copyright (C) 2019-2025, Linaro
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/main-loop.h"
> +#include "qemu/plugin.h"
> +#include "qemu.h"
> +
> +/*
> + * Binary path, start and end locations. Host specific due to TaskState.
> + */
> +const char *qemu_plugin_path_to_binary(void)
> +{
> +    TaskState *ts = get_task_state(current_cpu);
> +    return g_strdup(ts->bprm->filename);
> +}
> +
> +uint64_t qemu_plugin_start_code(void)
> +{
> +    TaskState *ts = get_task_state(current_cpu);
> +    return ts->info->start_code;
> +}
> +
> +uint64_t qemu_plugin_end_code(void)
> +{
> +    TaskState *ts = get_task_state(current_cpu);
> +    return ts->info->end_code;
> +}
> +
> +uint64_t qemu_plugin_entry_code(void)
> +{
> +    TaskState *ts = get_task_state(current_cpu);
> +    return ts->info->entry;
> +}
> diff --git a/bsd-user/meson.build b/bsd-user/meson.build
> index 39bad0ae33..37b7cd6de8 100644
> --- a/bsd-user/meson.build
> +++ b/bsd-user/meson.build
> @@ -13,6 +13,7 @@ bsd_user_ss.add(files(
>    'elfload.c',
>    'main.c',
>    'mmap.c',
> +  'plugin-api.c',
>    'signal.c',
>    'strace.c',
>    'uaccess.c',
> diff --git a/linux-user/meson.build b/linux-user/meson.build
> index f75b4fe0e3..f47a213ca3 100644
> --- a/linux-user/meson.build
> +++ b/linux-user/meson.build
> @@ -27,6 +27,7 @@ linux_user_ss.add(libdw)
>  linux_user_ss.add(when: 'TARGET_HAS_BFLT', if_true: files('flatload.c'))
>  linux_user_ss.add(when: 'TARGET_I386', if_true: files('vm86.c'))
>  linux_user_ss.add(when: 'CONFIG_ARM_COMPATIBLE_SEMIHOSTING', if_true:
> files('semihost.c'))
> +linux_user_ss.add(when: 'CONFIG_TCG_PLUGINS', if_true:
> files('plugin-api.c'))
>
>  syscall_nr_generators = {}
>
> diff --git a/plugins/meson.build b/plugins/meson.build
> index f7820806d3..9c9bc9e5bb 100644
> --- a/plugins/meson.build
> +++ b/plugins/meson.build
> @@ -59,7 +59,7 @@ if host_os == 'windows'
>  endif
>
>  user_ss.add(files('user.c'))
> -system_ss.add(files('system.c'))
> +system_ss.add(files('system.c', 'api-system.c'))
>
>  common_ss.add(files('loader.c'))
>
> --
> 2.39.5
>
>
Richard Henderson Feb. 26, 2025, 5:29 p.m. UTC | #2
On 2/26/25 06:03, Alex Bennée wrote:
> +++ b/linux-user/plugin-api.c
> @@ -0,0 +1,14 @@
> +/*
> + * QEMU Plugin API - linux-user-mode only implementations
> + *
> + * Common user-mode only APIs are in plugins/api-user. These helpers
> + * are only specific to linux-user.
> + *
> + * Copyright (C) 2017, Emilio G. Cota<cota@braap.org>
> + * Copyright (C) 2019-2025, Linaro
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu.h"
> +#include "common-user/plugin-api.c.inc"

Missing osdep.h here -- checkpatch should have complained.

Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
diff mbox series

Patch

diff --git a/bsd-user/plugin-api.c b/bsd-user/plugin-api.c
new file mode 100644
index 0000000000..6ccef7eaa0
--- /dev/null
+++ b/bsd-user/plugin-api.c
@@ -0,0 +1,15 @@ 
+/*
+ * QEMU Plugin API - bsd-user-mode only implementations
+ *
+ * Common user-mode only APIs are in plugins/api-user. These helpers
+ * are only specific to bsd-user.
+ *
+ * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
+ * Copyright (C) 2019-2025, Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu.h"
+#include "common-user/plugin-api.c.inc"
diff --git a/linux-user/plugin-api.c b/linux-user/plugin-api.c
new file mode 100644
index 0000000000..e4f796d926
--- /dev/null
+++ b/linux-user/plugin-api.c
@@ -0,0 +1,14 @@ 
+/*
+ * QEMU Plugin API - linux-user-mode only implementations
+ *
+ * Common user-mode only APIs are in plugins/api-user. These helpers
+ * are only specific to linux-user.
+ *
+ * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
+ * Copyright (C) 2019-2025, Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu.h"
+#include "common-user/plugin-api.c.inc"
diff --git a/plugins/api-system.c b/plugins/api-system.c
new file mode 100644
index 0000000000..cb0dd8f730
--- /dev/null
+++ b/plugins/api-system.c
@@ -0,0 +1,39 @@ 
+/*
+ * QEMU Plugin API - System specific implementations
+ *
+ * This provides the APIs that have a specific system implementation
+ * or are only relevant to system-mode.
+ *
+ * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
+ * Copyright (C) 2019-2025, Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/main-loop.h"
+#include "qemu/plugin.h"
+
+/*
+ * In system mode we cannot trace the binary being executed so the
+ * helpers all return NULL/0.
+ */
+const char *qemu_plugin_path_to_binary(void)
+{
+    return NULL;
+}
+
+uint64_t qemu_plugin_start_code(void)
+{
+    return 0;
+}
+
+uint64_t qemu_plugin_end_code(void)
+{
+    return 0;
+}
+
+uint64_t qemu_plugin_entry_code(void)
+{
+    return 0;
+}
diff --git a/plugins/api.c b/plugins/api.c
index c3ba1e98e8..ffccd71e4b 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -471,49 +471,6 @@  bool qemu_plugin_bool_parse(const char *name, const char *value, bool *ret)
     return name && value && qapi_bool_parse(name, value, ret, NULL);
 }
 
-/*
- * Binary path, start and end locations
- */
-const char *qemu_plugin_path_to_binary(void)
-{
-    char *path = NULL;
-#ifdef CONFIG_USER_ONLY
-    TaskState *ts = get_task_state(current_cpu);
-    path = g_strdup(ts->bprm->filename);
-#endif
-    return path;
-}
-
-uint64_t qemu_plugin_start_code(void)
-{
-    uint64_t start = 0;
-#ifdef CONFIG_USER_ONLY
-    TaskState *ts = get_task_state(current_cpu);
-    start = ts->info->start_code;
-#endif
-    return start;
-}
-
-uint64_t qemu_plugin_end_code(void)
-{
-    uint64_t end = 0;
-#ifdef CONFIG_USER_ONLY
-    TaskState *ts = get_task_state(current_cpu);
-    end = ts->info->end_code;
-#endif
-    return end;
-}
-
-uint64_t qemu_plugin_entry_code(void)
-{
-    uint64_t entry = 0;
-#ifdef CONFIG_USER_ONLY
-    TaskState *ts = get_task_state(current_cpu);
-    entry = ts->info->entry;
-#endif
-    return entry;
-}
-
 /*
  * Create register handles.
  *
diff --git a/common-user/plugin-api.c.inc b/common-user/plugin-api.c.inc
new file mode 100644
index 0000000000..5b8a1396b6
--- /dev/null
+++ b/common-user/plugin-api.c.inc
@@ -0,0 +1,43 @@ 
+/*
+ * QEMU Plugin API - *-user-mode only implementations
+ *
+ * Common user-mode only APIs are in plugins/api-user. These helpers
+ * are only specific to the *-user frontends.
+ *
+ * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
+ * Copyright (C) 2019-2025, Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/main-loop.h"
+#include "qemu/plugin.h"
+#include "qemu.h"
+
+/*
+ * Binary path, start and end locations. Host specific due to TaskState.
+ */
+const char *qemu_plugin_path_to_binary(void)
+{
+    TaskState *ts = get_task_state(current_cpu);
+    return g_strdup(ts->bprm->filename);
+}
+
+uint64_t qemu_plugin_start_code(void)
+{
+    TaskState *ts = get_task_state(current_cpu);
+    return ts->info->start_code;
+}
+
+uint64_t qemu_plugin_end_code(void)
+{
+    TaskState *ts = get_task_state(current_cpu);
+    return ts->info->end_code;
+}
+
+uint64_t qemu_plugin_entry_code(void)
+{
+    TaskState *ts = get_task_state(current_cpu);
+    return ts->info->entry;
+}
diff --git a/bsd-user/meson.build b/bsd-user/meson.build
index 39bad0ae33..37b7cd6de8 100644
--- a/bsd-user/meson.build
+++ b/bsd-user/meson.build
@@ -13,6 +13,7 @@  bsd_user_ss.add(files(
   'elfload.c',
   'main.c',
   'mmap.c',
+  'plugin-api.c',
   'signal.c',
   'strace.c',
   'uaccess.c',
diff --git a/linux-user/meson.build b/linux-user/meson.build
index f75b4fe0e3..f47a213ca3 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -27,6 +27,7 @@  linux_user_ss.add(libdw)
 linux_user_ss.add(when: 'TARGET_HAS_BFLT', if_true: files('flatload.c'))
 linux_user_ss.add(when: 'TARGET_I386', if_true: files('vm86.c'))
 linux_user_ss.add(when: 'CONFIG_ARM_COMPATIBLE_SEMIHOSTING', if_true: files('semihost.c'))
+linux_user_ss.add(when: 'CONFIG_TCG_PLUGINS', if_true: files('plugin-api.c'))
 
 syscall_nr_generators = {}
 
diff --git a/plugins/meson.build b/plugins/meson.build
index f7820806d3..9c9bc9e5bb 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -59,7 +59,7 @@  if host_os == 'windows'
 endif
 
 user_ss.add(files('user.c'))
-system_ss.add(files('system.c'))
+system_ss.add(files('system.c', 'api-system.c'))
 
 common_ss.add(files('loader.c'))