plugins: add dllexport and dllimport to api funcs

In qemu-plugin.h, mark all API functions as __declspec(dllexport) when
compiling the executables, and as __declspec(dllimport) when being used
to compile plugins against.

Signed-off-by: Greg Manning <gmanning@rapitasystems.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231102172053.17692-2-gmanning@rapitasystems.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20231106185112.2755262-14-alex.bennee@linaro.org>
This commit is contained in:
Greg Manning 2023-11-06 18:51:03 +00:00 committed by Alex Bennée
parent 09f17983b7
commit fb691b8cba
1 changed files with 47 additions and 3 deletions

View File

@ -22,15 +22,18 @@
* https://gcc.gnu.org/wiki/Visibility * https://gcc.gnu.org/wiki/Visibility
*/ */
#if defined _WIN32 || defined __CYGWIN__ #if defined _WIN32 || defined __CYGWIN__
#ifdef BUILDING_DLL #ifdef CONFIG_PLUGIN
#define QEMU_PLUGIN_EXPORT __declspec(dllexport)
#else
#define QEMU_PLUGIN_EXPORT __declspec(dllimport) #define QEMU_PLUGIN_EXPORT __declspec(dllimport)
#define QEMU_PLUGIN_API __declspec(dllexport)
#else
#define QEMU_PLUGIN_EXPORT __declspec(dllexport)
#define QEMU_PLUGIN_API __declspec(dllimport)
#endif #endif
#define QEMU_PLUGIN_LOCAL #define QEMU_PLUGIN_LOCAL
#else #else
#define QEMU_PLUGIN_EXPORT __attribute__((visibility("default"))) #define QEMU_PLUGIN_EXPORT __attribute__((visibility("default")))
#define QEMU_PLUGIN_LOCAL __attribute__((visibility("hidden"))) #define QEMU_PLUGIN_LOCAL __attribute__((visibility("hidden")))
#define QEMU_PLUGIN_API
#endif #endif
/** /**
@ -147,6 +150,7 @@ typedef void (*qemu_plugin_vcpu_udata_cb_t)(unsigned int vcpu_index,
* *
* Note: Calling this function from qemu_plugin_install() is a bug. * Note: Calling this function from qemu_plugin_install() is a bug.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb); void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
/** /**
@ -160,6 +164,7 @@ void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
* Plugins are reset asynchronously, and therefore the given plugin receives * Plugins are reset asynchronously, and therefore the given plugin receives
* callbacks until @cb is called. * callbacks until @cb is called.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb); void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
/** /**
@ -171,6 +176,7 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
* *
* See also: qemu_plugin_register_vcpu_exit_cb() * See also: qemu_plugin_register_vcpu_exit_cb()
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb); qemu_plugin_vcpu_simple_cb_t cb);
@ -183,6 +189,7 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
* *
* See also: qemu_plugin_register_vcpu_init_cb() * See also: qemu_plugin_register_vcpu_init_cb()
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb); qemu_plugin_vcpu_simple_cb_t cb);
@ -193,6 +200,7 @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
* *
* The @cb function is called every time a vCPU idles. * The @cb function is called every time a vCPU idles.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb); qemu_plugin_vcpu_simple_cb_t cb);
@ -203,6 +211,7 @@ void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
* *
* The @cb function is called every time a vCPU resumes execution. * The @cb function is called every time a vCPU resumes execution.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb); qemu_plugin_vcpu_simple_cb_t cb);
@ -253,6 +262,7 @@ typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(qemu_plugin_id_t id,
* callbacks to be triggered when the block or individual instruction * callbacks to be triggered when the block or individual instruction
* executes. * executes.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_tb_trans_cb_t cb); qemu_plugin_vcpu_tb_trans_cb_t cb);
@ -265,6 +275,7 @@ void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
* *
* The @cb function is called every time a translated unit executes. * The @cb function is called every time a translated unit executes.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb, void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
qemu_plugin_vcpu_udata_cb_t cb, qemu_plugin_vcpu_udata_cb_t cb,
enum qemu_plugin_cb_flags flags, enum qemu_plugin_cb_flags flags,
@ -296,6 +307,7 @@ enum qemu_plugin_op {
* Note: ops are not atomic so in multi-threaded/multi-smp situations * Note: ops are not atomic so in multi-threaded/multi-smp situations
* you will get inexact results. * you will get inexact results.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_tb_exec_inline(struct qemu_plugin_tb *tb, void qemu_plugin_register_vcpu_tb_exec_inline(struct qemu_plugin_tb *tb,
enum qemu_plugin_op op, enum qemu_plugin_op op,
void *ptr, uint64_t imm); void *ptr, uint64_t imm);
@ -309,6 +321,7 @@ void qemu_plugin_register_vcpu_tb_exec_inline(struct qemu_plugin_tb *tb,
* *
* The @cb function is called every time an instruction is executed * The @cb function is called every time an instruction is executed
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn, void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
qemu_plugin_vcpu_udata_cb_t cb, qemu_plugin_vcpu_udata_cb_t cb,
enum qemu_plugin_cb_flags flags, enum qemu_plugin_cb_flags flags,
@ -324,6 +337,7 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
* Insert an inline op to every time an instruction executes. Useful * Insert an inline op to every time an instruction executes. Useful
* if you just want to increment a single counter somewhere in memory. * if you just want to increment a single counter somewhere in memory.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_insn_exec_inline(struct qemu_plugin_insn *insn, void qemu_plugin_register_vcpu_insn_exec_inline(struct qemu_plugin_insn *insn,
enum qemu_plugin_op op, enum qemu_plugin_op op,
void *ptr, uint64_t imm); void *ptr, uint64_t imm);
@ -334,6 +348,7 @@ void qemu_plugin_register_vcpu_insn_exec_inline(struct qemu_plugin_insn *insn,
* *
* Returns: number of instructions in this block * Returns: number of instructions in this block
*/ */
QEMU_PLUGIN_API
size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb); size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb);
/** /**
@ -342,6 +357,7 @@ size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb);
* *
* Returns: virtual address of block start * Returns: virtual address of block start
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb); uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb);
/** /**
@ -355,6 +371,7 @@ uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb);
* *
* Returns: opaque handle to instruction * Returns: opaque handle to instruction
*/ */
QEMU_PLUGIN_API
struct qemu_plugin_insn * struct qemu_plugin_insn *
qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx); qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx);
@ -368,6 +385,7 @@ qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx);
* Returns: pointer to a stream of bytes containing the value of this * Returns: pointer to a stream of bytes containing the value of this
* instructions opcode. * instructions opcode.
*/ */
QEMU_PLUGIN_API
const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn); const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn);
/** /**
@ -376,6 +394,7 @@ const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn);
* *
* Returns: size of instruction in bytes * Returns: size of instruction in bytes
*/ */
QEMU_PLUGIN_API
size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn); size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn);
/** /**
@ -384,6 +403,7 @@ size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn);
* *
* Returns: virtual address of instruction * Returns: virtual address of instruction
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn); uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn);
/** /**
@ -392,6 +412,7 @@ uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn);
* *
* Returns: hardware (physical) target address of instruction * Returns: hardware (physical) target address of instruction
*/ */
QEMU_PLUGIN_API
void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn); void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn);
/** /**
@ -410,6 +431,7 @@ struct qemu_plugin_hwaddr;
* *
* Returns: size of access in ^2 (0=byte, 1=16bit, 2=32bit etc...) * Returns: size of access in ^2 (0=byte, 1=16bit, 2=32bit etc...)
*/ */
QEMU_PLUGIN_API
unsigned int qemu_plugin_mem_size_shift(qemu_plugin_meminfo_t info); unsigned int qemu_plugin_mem_size_shift(qemu_plugin_meminfo_t info);
/** /**
* qemu_plugin_mem_is_sign_extended() - was the access sign extended * qemu_plugin_mem_is_sign_extended() - was the access sign extended
@ -417,6 +439,7 @@ unsigned int qemu_plugin_mem_size_shift(qemu_plugin_meminfo_t info);
* *
* Returns: true if it was, otherwise false * Returns: true if it was, otherwise false
*/ */
QEMU_PLUGIN_API
bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info); bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info);
/** /**
* qemu_plugin_mem_is_big_endian() - was the access big endian * qemu_plugin_mem_is_big_endian() - was the access big endian
@ -424,6 +447,7 @@ bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info);
* *
* Returns: true if it was, otherwise false * Returns: true if it was, otherwise false
*/ */
QEMU_PLUGIN_API
bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info); bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info);
/** /**
* qemu_plugin_mem_is_store() - was the access a store * qemu_plugin_mem_is_store() - was the access a store
@ -431,6 +455,7 @@ bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info);
* *
* Returns: true if it was, otherwise false * Returns: true if it was, otherwise false
*/ */
QEMU_PLUGIN_API
bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info); bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
/** /**
@ -446,6 +471,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
* information about the handle should be recovered before the * information about the handle should be recovered before the
* callback returns. * callback returns.
*/ */
QEMU_PLUGIN_API
struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t info, struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t info,
uint64_t vaddr); uint64_t vaddr);
@ -462,6 +488,7 @@ struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t info,
* Returns true if the handle's memory operation is to memory-mapped IO, or * Returns true if the handle's memory operation is to memory-mapped IO, or
* false if it is to RAM * false if it is to RAM
*/ */
QEMU_PLUGIN_API
bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr); bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr);
/** /**
@ -473,12 +500,14 @@ bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr);
* Note that the returned physical address may not be unique if you are dealing * Note that the returned physical address may not be unique if you are dealing
* with multiple address spaces. * with multiple address spaces.
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr); uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr);
/* /*
* Returns a string representing the device. The string is valid for * Returns a string representing the device. The string is valid for
* the lifetime of the plugin. * the lifetime of the plugin.
*/ */
QEMU_PLUGIN_API
const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h); const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h);
/** /**
@ -513,6 +542,7 @@ typedef void (*qemu_plugin_vcpu_mem_cb_t) (unsigned int vcpu_index,
* callback so the plugin is responsible for ensuring it doesn't get * callback so the plugin is responsible for ensuring it doesn't get
* confused by making appropriate use of locking if required. * confused by making appropriate use of locking if required.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn, void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn,
qemu_plugin_vcpu_mem_cb_t cb, qemu_plugin_vcpu_mem_cb_t cb,
enum qemu_plugin_cb_flags flags, enum qemu_plugin_cb_flags flags,
@ -531,6 +561,7 @@ void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn,
* instruction. This provides for a lightweight but not thread-safe * instruction. This provides for a lightweight but not thread-safe
* way of counting the number of operations done. * way of counting the number of operations done.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn, void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn,
enum qemu_plugin_mem_rw rw, enum qemu_plugin_mem_rw rw,
enum qemu_plugin_op op, void *ptr, enum qemu_plugin_op op, void *ptr,
@ -544,6 +575,7 @@ typedef void
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8); uint64_t a6, uint64_t a7, uint64_t a8);
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id, void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_syscall_cb_t cb); qemu_plugin_vcpu_syscall_cb_t cb);
@ -551,6 +583,7 @@ typedef void
(*qemu_plugin_vcpu_syscall_ret_cb_t)(qemu_plugin_id_t id, unsigned int vcpu_idx, (*qemu_plugin_vcpu_syscall_ret_cb_t)(qemu_plugin_id_t id, unsigned int vcpu_idx,
int64_t num, int64_t ret); int64_t num, int64_t ret);
QEMU_PLUGIN_API
void void
qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id, qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_syscall_ret_cb_t cb); qemu_plugin_vcpu_syscall_ret_cb_t cb);
@ -563,6 +596,7 @@ qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id,
* Returns an allocated string containing the disassembly * Returns an allocated string containing the disassembly
*/ */
QEMU_PLUGIN_API
char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn); char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn);
/** /**
@ -572,6 +606,7 @@ char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn);
* Return a static string referring to the symbol. This is dependent * Return a static string referring to the symbol. This is dependent
* on the binary QEMU is running having provided a symbol table. * on the binary QEMU is running having provided a symbol table.
*/ */
QEMU_PLUGIN_API
const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn); const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn);
/** /**
@ -583,9 +618,11 @@ const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn);
* *
* See also: qemu_plugin_register_vcpu_init_cb() * See also: qemu_plugin_register_vcpu_init_cb()
*/ */
QEMU_PLUGIN_API
void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id, void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb); qemu_plugin_vcpu_simple_cb_t cb);
QEMU_PLUGIN_API
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id, void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
qemu_plugin_simple_cb_t cb); qemu_plugin_simple_cb_t cb);
@ -602,6 +639,7 @@ void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
* In user-mode it is possible a few un-instrumented instructions from * In user-mode it is possible a few un-instrumented instructions from
* child threads may run before the host kernel reaps the threads. * child threads may run before the host kernel reaps the threads.
*/ */
QEMU_PLUGIN_API
void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id, void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id,
qemu_plugin_udata_cb_t cb, void *userdata); qemu_plugin_udata_cb_t cb, void *userdata);
@ -615,6 +653,7 @@ int qemu_plugin_n_max_vcpus(void);
* qemu_plugin_outs() - output string via QEMU's logging system * qemu_plugin_outs() - output string via QEMU's logging system
* @string: a string * @string: a string
*/ */
QEMU_PLUGIN_API
void qemu_plugin_outs(const char *string); void qemu_plugin_outs(const char *string);
/** /**
@ -628,6 +667,7 @@ void qemu_plugin_outs(const char *string);
* returns true if the combination @name=@val parses correctly to a boolean * returns true if the combination @name=@val parses correctly to a boolean
* argument, and false otherwise * argument, and false otherwise
*/ */
QEMU_PLUGIN_API
bool qemu_plugin_bool_parse(const char *name, const char *val, bool *ret); bool qemu_plugin_bool_parse(const char *name, const char *val, bool *ret);
/** /**
@ -638,6 +678,7 @@ bool qemu_plugin_bool_parse(const char *name, const char *val, bool *ret);
* return NULL. The user should g_free() the string once no longer * return NULL. The user should g_free() the string once no longer
* needed. * needed.
*/ */
QEMU_PLUGIN_API
const char *qemu_plugin_path_to_binary(void); const char *qemu_plugin_path_to_binary(void);
/** /**
@ -646,6 +687,7 @@ const char *qemu_plugin_path_to_binary(void);
* Returns the nominal start address of the main text segment in * Returns the nominal start address of the main text segment in
* user-mode. Currently returns 0 for system emulation. * user-mode. Currently returns 0 for system emulation.
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_start_code(void); uint64_t qemu_plugin_start_code(void);
/** /**
@ -654,6 +696,7 @@ uint64_t qemu_plugin_start_code(void);
* Returns the nominal end address of the main text segment in * Returns the nominal end address of the main text segment in
* user-mode. Currently returns 0 for system emulation. * user-mode. Currently returns 0 for system emulation.
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_end_code(void); uint64_t qemu_plugin_end_code(void);
/** /**
@ -662,6 +705,7 @@ uint64_t qemu_plugin_end_code(void);
* Returns the nominal entry address of the main text segment in * Returns the nominal entry address of the main text segment in
* user-mode. Currently returns 0 for system emulation. * user-mode. Currently returns 0 for system emulation.
*/ */
QEMU_PLUGIN_API
uint64_t qemu_plugin_entry_code(void); uint64_t qemu_plugin_entry_code(void);
#endif /* QEMU_QEMU_PLUGIN_H */ #endif /* QEMU_QEMU_PLUGIN_H */