1
2
3
4
5
6
7
8
9
10
11
12 #ifndef OPAL_MCA_PATCHER_PATCHER_H
13 #define OPAL_MCA_PATCHER_PATCHER_H
14
15 #include "opal_config.h"
16
17 #include "opal/mca/mca.h"
18 #include "opal/mca/base/base.h"
19 #include "opal/class/opal_list.h"
20
21
22
23
24 #if (OPAL_ASSEMBLY_ARCH == OPAL_POWERPC64)
25
26
27
28 #define OPAL_PATCHER_BEGIN \
29 unsigned long toc_save; \
30 asm volatile ("std 2, %0" : "=m" (toc_save)); \
31 asm volatile ("nop; nop; nop; nop; nop");
32 #define OPAL_PATCHER_END \
33 asm volatile ("ld 2, %0" : : "m" (toc_save));
34
35 #else
36
37 #define OPAL_PATCHER_BEGIN
38 #define OPAL_PATCHER_END
39
40 #endif
41
42
43
44
45
46
47
48
49
50
51
52
53
54 typedef int (*mca_patcher_base_patch_symbol_fn_t)(const char *func_symbol_name, uintptr_t func_new_addr,
55 uintptr_t *func_old_addr);
56
57
58
59
60
61
62
63
64
65
66
67 typedef int (*mca_patcher_base_patch_address_fn_t)(uintptr_t func_addr, uintptr_t func_new_addr);
68
69
70
71
72 typedef int (*mca_patcher_base_init_fn_t) (void);
73
74
75
76
77 typedef int (*mca_patcher_base_fini_fn_t) (void);
78
79
80
81
82 typedef struct mca_patcher_base_module_t {
83 mca_base_module_t super;
84
85 opal_list_t patch_list;
86
87 opal_mutex_t patch_list_mutex;
88
89
90 mca_patcher_base_init_fn_t patch_init;
91
92
93 mca_patcher_base_fini_fn_t patch_fini;
94
95 mca_patcher_base_patch_symbol_fn_t patch_symbol;
96
97 mca_patcher_base_patch_address_fn_t patch_address;
98 } mca_patcher_base_module_t;
99
100
101 OPAL_DECLSPEC extern mca_patcher_base_module_t *opal_patcher;
102
103
104
105
106 typedef struct mca_patcher_base_component_1_0_0_t {
107
108 mca_base_component_t patcherc_version;
109
110 mca_base_component_data_t patcherc_data;
111 } mca_patcher_base_component_1_0_0_t;
112
113 typedef mca_patcher_base_component_1_0_0_t mca_patcher_base_component_t;
114
115
116
117
118 #define OPAL_PATCHER_BASE_VERSION_1_0_0 \
119 OPAL_MCA_BASE_VERSION_2_1_0("patcher", 1, 0, 0)
120
121 #endif