Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add user data context to base callbacks #1105

Merged
merged 5 commits into from
Oct 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
952 changes: 952 additions & 0 deletions panda/include/panda/callbacks/cb-defs.h

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions panda/include/panda/callbacks/cb-helper-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ void HELPER(panda_insn_exec)(target_ulong pc) {
// PANDA instrumentation: before basic block
panda_cb_list *plist;
for(plist = panda_cbs[PANDA_CB_INSN_EXEC]; plist != NULL; plist = panda_cb_list_next(plist)) {
plist->entry.insn_exec(first_cpu, pc);
plist->entry.insn_exec(plist->context, first_cpu, pc);
}
}

void HELPER(panda_after_insn_exec)(target_ulong pc) {
// PANDA instrumentation: after basic block
panda_cb_list *plist;
for(plist = panda_cbs[PANDA_CB_AFTER_INSN_EXEC]; plist != NULL; plist = panda_cb_list_next(plist)) {
plist->entry.after_insn_exec(first_cpu, pc);
plist->entry.after_insn_exec(plist->context, first_cpu, pc);
}
}

Expand Down
65 changes: 62 additions & 3 deletions panda/include/panda/callbacks/cb-macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,26 @@
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
plist->entry. ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
plist->entry. ENTRY_NAME(name, plist->context, EVERY_SECOND(__VA_ARGS__)); \
} \
} \
void panda_cb_trampoline_ ## name(void* context, COMBINE_TYPES(__VA_ARGS__)) {\
(*(panda_cb*)context) . ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
}

#define MAKE_CALLBACK_int(name_upper, name, ...) \
int panda_callbacks_ ## name(COMBINE_TYPES(__VA_ARGS__)) { \
panda_cb_list *plist; \
for (plist = panda_cbs[PANDA_CB_ ## name_upper]; \
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
plist->entry. ENTRY_NAME(name, plist->context, EVERY_SECOND(__VA_ARGS__)); \
} \
return 0; \
} \
int panda_cb_trampoline_ ## name(void* context, COMBINE_TYPES(__VA_ARGS__)) {\
return (*(panda_cb*)context) . ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
}

// Call all enabled & registered functions for this callback. Return
Expand All @@ -70,9 +88,12 @@
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
any_true |= plist->entry. ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
any_true |= plist->entry. ENTRY_NAME(name, plist->context, EVERY_SECOND(__VA_ARGS__)); \
} \
return any_true; \
} \
bool panda_cb_trampoline_ ## name(void* context, COMBINE_TYPES(__VA_ARGS__)) {\
return (*(panda_cb*)context) . ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
}

// XXX: gcc/clang both stringify 'void' -> 'void' but 'bool' -> '_Bool'
Expand All @@ -94,7 +115,45 @@
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
plist->entry. ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
plist->entry. ENTRY_NAME(name, plist->context, EVERY_SECOND(__VA_ARGS__)); \
} \
} \
} \
void panda_cb_trampoline_ ## name(void* context, COMBINE_TYPES(__VA_ARGS__)) {\
(*(panda_cb*)context) . ENTRY_NAME(name, EVERY_SECOND(__VA_ARGS__)); \
}

#define MAKE_CALLBACK_NO_ARGS_void(name_upper, name) \
void panda_callbacks_ ## name(void) { \
panda_cb_list *plist; \
for (plist = panda_cbs[PANDA_CB_ ## name_upper]; \
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
plist->entry. ENTRY_NAME(name, plist->context); \
} \
} \
void panda_cb_trampoline_ ## name(void* context) {\
(*(panda_cb*)context) . ENTRY_NAME(name); \
}

#define MAKE_CALLBACK_NO_ARGS__Bool(name_upper, name) \
bool panda_callbacks_ ## name(void) { \
panda_cb_list *plist; \
bool any_true = false; \
for (plist = panda_cbs[PANDA_CB_ ## name_upper]; \
plist != NULL; \
plist = panda_cb_list_next(plist)) { \
if (plist->enabled) \
any_true |= plist->entry. ENTRY_NAME(name, plist->context); \
} \
return any_true; \
} \
bool panda_cb_trampoline_ ## name(void* context) {\
return (*(panda_cb*)context) . ENTRY_NAME(name); \
}

#define _GET_CB_NAME_NO_ARGS(rettype) \
MAKE_CALLBACK_NO_ARGS_ ## rettype

#define MAKE_CALLBACK_NO_ARGS(rettype, ...) _GET_CB_NAME_NO_ARGS(rettype)(__VA_ARGS__)
2 changes: 1 addition & 1 deletion panda/include/panda/callbacks/cb-support.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,4 @@ void panda_callbacks_before_tcg_codegen(CPUState *env, TranslationBlock *tb);
void panda_callbacks_start_block_exec(CPUState *env, TranslationBlock *tb);
void panda_callbacks_end_block_exec(CPUState *env, TranslationBlock *tb);

void panda_install_block_callbacks(CPUState* cpu, TranslationBlock* tb);
void panda_install_block_callbacks(CPUState* cpu, TranslationBlock* tb);
83 changes: 83 additions & 0 deletions panda/include/panda/callbacks/cb-trampolines.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#ifndef EXEC_ALL_H
// If this file is included from a file that doesn't define TranslationBlock (e.g., memory.c), we still need to be valid
typedef struct {} TranslationBlock;
#endif

/***************************************************************************
* CALLBACK TRAMPOLINES *
***************************************************************************/

void panda_cb_trampoline_virt_mem_before_read(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size);
void panda_cb_trampoline_virt_mem_after_read(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);
void panda_cb_trampoline_virt_mem_before_write(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);
void panda_cb_trampoline_virt_mem_after_write(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);
void panda_cb_trampoline_phys_mem_before_read(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size);
void panda_cb_trampoline_phys_mem_after_read(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);
void panda_cb_trampoline_phys_mem_before_write(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);
void panda_cb_trampoline_phys_mem_after_write(void* context, CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t size, uint8_t *buf);

int panda_cb_trampoline_insn_exec(void* context, CPUState *env, target_ptr_t pc);
int panda_cb_trampoline_after_insn_exec(void* context, CPUState *env, target_ptr_t pc);
int panda_cb_trampoline_monitor(void* context, Monitor *mon, const char *cmd);
//int panda_cb_trampoline_before_loadvm(void* context);
void panda_cb_trampoline_replay_hd_transfer(void* context, CPUState *env, uint32_t type, target_ptr_t src_addr, target_ptr_t dest_addr, size_t num_bytes);
void panda_cb_trampoline_after_machine_init(void* context, CPUState *env);
void panda_cb_trampoline_after_loadvm(void* context, CPUState *env);

/* invoked from cpu-exec.c */
void panda_cb_trampoline_before_block_exec(void* context, CPUState *env, TranslationBlock *tb);
void panda_cb_trampoline_after_block_exec(void* context, CPUState *env, TranslationBlock *tb, uint8_t exitCode);
void panda_cb_trampoline_before_block_translate(void* context, CPUState *env, target_ptr_t pc);
void panda_cb_trampoline_after_block_translate(void* context, CPUState *env, TranslationBlock *tb);
void panda_cb_trampoline_after_cpu_exec_enter(void* context, CPUState *env);
void panda_cb_trampoline_before_cpu_exec_exit(void* context, CPUState *env, bool ranBlock);

/* invoked from cpu-exec.c (indirectly) */
bool panda_cb_trampoline_before_block_exec_invalidate_opt(void* context, CPUState *env, TranslationBlock *tb);

/* invoked from cpus.c */
void panda_cb_trampoline_top_loop(void* context, CPUState *env);
void panda_cb_trampoline_during_machine_init(void* context, MachineState *machine);
void panda_cb_trampoline_main_loop_wait(void* context);
void panda_cb_trampoline_pre_shutdown(void* context);
bool panda_cb_trampoline_unassigned_io_read(void* context, CPUState *env, target_ptr_t pc, hwaddr addr, size_t size, uint64_t *val);
bool panda_cb_trampoline_unassigned_io_write(void* context, CPUState *env, target_ptr_t pc, hwaddr addr, size_t size, uint64_t val);
int32_t panda_cb_trampoline_before_handle_exception(void* context, CPUState *cpu, int32_t exception_index);
int32_t panda_cb_trampoline_before_handle_interrupt(void* context, CPUState *cpu, int32_t exception_index);
void panda_cb_trampoline_cbaddr(void* context);

/* invoked from cputlb.c */
void panda_cb_trampoline_mmio_after_read(void* context, CPUState *env, target_ptr_t physaddr, target_ptr_t vaddr, size_t size, uint64_t *val);
void panda_cb_trampoline_mmio_before_write(void* context, CPUState *env, target_ptr_t physaddr, target_ptr_t vaddr, size_t size, uint64_t *val);
void panda_cb_trampoline_hd_read(void* context, CPUState *env);
void panda_cb_trampoline_hd_write(void* context, CPUState *env);

/* invoked from exec.c */
void panda_cb_trampoline_replay_before_dma(void* context, CPUState *env, const uint8_t *buf, hwaddr addr, size_t size, bool is_write);
void panda_cb_trampoline_replay_after_dma(void* context, CPUState *env, const uint8_t *buf, hwaddr addr, size_t size, bool is_write);

/* invoked from panda/src/rr/rr_log.c */
void panda_cb_trampoline_replay_handle_packet(void* context, CPUState *env, uint8_t *buf, size_t size, uint8_t direction, uint64_t buf_addr_rec);
void panda_cb_trampoline_replay_net_transfer(void* context, CPUState *env, uint32_t type, uint64_t src_addr, uint64_t dest_addr, size_t num_bytes);
void panda_cb_trampoline_replay_serial_receive(void* context, CPUState *env, target_ptr_t fifo_addr, uint8_t value);
void panda_cb_trampoline_replay_serial_read(void* context, CPUState *env, target_ptr_t fifo_addr, uint32_t port_addr, uint8_t value);
void panda_cb_trampoline_replay_serial_send(void* context, CPUState *env, target_ptr_t fifo_addr, uint8_t value);
void panda_cb_trampoline_replay_serial_write(void* context, CPUState *env, target_ptr_t fifo_addr, uint32_t port_addr, uint8_t value);

/* invoked from panda/target/ARCH/translate.c */
bool panda_cb_trampoline_insn_translate(void* context, CPUState *env, target_ptr_t pc);
bool panda_cb_trampoline_after_insn_translate(void* context, CPUState *env, target_ptr_t pc);

/* invoked from target/i386/helper.c */
bool panda_cb_trampoline_asid_changed(void* context, CPUState *env, target_ptr_t oldval, target_ptr_t newval);

/* invoked from target/i386/misc_helper.c */
bool panda_cb_trampoline_guest_hypercall(void* context, CPUState *env);

/* invoked from translate-all.c */
void panda_cb_trampoline_cpu_restore_state(void* context, CPUState *env, TranslationBlock *tb);


void panda_cb_trampoline_before_tcg_codegen(void* context, CPUState *env, TranslationBlock *tb);
void panda_cb_trampoline_start_block_exec(void* context, CPUState *env, TranslationBlock *tb);
void panda_cb_trampoline_end_block_exec(void* context, CPUState *env, TranslationBlock *tb);
7 changes: 6 additions & 1 deletion panda/include/panda/plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,12 @@ extern "C" {
// Doubly linked list that stores a callback, along with its owner
typedef struct _panda_cb_list panda_cb_list;
struct _panda_cb_list {
panda_cb entry;
panda_cb_with_context entry;
void *owner;
panda_cb_list *next;
panda_cb_list *prev;
bool enabled;
void* context;
};
panda_cb_list *panda_cb_list_next(panda_cb_list *plist);
void panda_enable_plugin(void *plugin);
Expand All @@ -53,9 +54,13 @@ typedef struct panda_plugin {
void *plugin; // Handle to the plugin (for use with dlsym())
} panda_plugin;

panda_cb_with_context panda_get_cb_trampoline(panda_cb_type type);
void panda_register_callback(void *plugin, panda_cb_type type, panda_cb cb);
void panda_register_callback_with_context(void *plugin, panda_cb_type type, panda_cb_with_context cb, void* context);
void panda_disable_callback(void *plugin, panda_cb_type type, panda_cb cb);
void panda_enable_callback(void *plugin, panda_cb_type type, panda_cb cb);
void panda_disable_callback_with_context(void *plugin, panda_cb_type type, panda_cb_with_context cb, void* context);
void panda_enable_callback_with_context(void *plugin, panda_cb_type type, panda_cb_with_context cb, void* context);
void panda_unregister_callbacks(void *plugin);
bool panda_load_plugin(const char *filename, const char *plugin_name);
bool _panda_load_plugin(const char *filename, const char *plugin_name, bool library_mode);
Expand Down
Loading