00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "converse.h"
00018 #include "cklists.h"
00019 #include <string.h>
00020 #include <stdio.h>
00021 #include <stdlib.h>
00022 #include <strings.h>
00023 #include <errno.h>
00024 #include <assert.h>
00025
00026 #include "converse.h"
00027 #include "pup.h"
00028
00029
00030 #if CMK_HAS_MACHO_GETSECT_H
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <mach-o/getsect.h>
00040
00041
00042
00043 long magic_num_machoassert = 0x0123456;
00044 #define CHECK_MAGIC_NUM {assert(magic_num_machoassert == 0x0123456);printf("_origCtg=%p\n", _origCtg);}
00045
00046
00047
00048 CpvStaticDeclare(CtgGlobals,_curCtg);
00049 CtgGlobals _origCtg;
00050
00051 struct CtgGlobalStruct {
00052 public:
00053 bool installed;
00054
00055 void *data_seg;
00056 size_t seg_size;
00057
00058 void allocate(size_t size) {
00059 printf("CtgGlobalStruct::allocate()\n");
00060 CHECK_MAGIC_NUM;
00061 assert(!data_seg);
00062 seg_size=size;
00063 data_seg=malloc(seg_size);
00064 CHECK_MAGIC_NUM;
00065 }
00066
00067 CtgGlobalStruct(void) {
00068 printf("CtgGlobalStruct::constructor\n");
00069 CHECK_MAGIC_NUM;
00070 installed=false;
00071 data_seg=0;
00072 CHECK_MAGIC_NUM;
00073 }
00074 ~CtgGlobalStruct() {
00075 printf("CtgGlobalStruct::destructor\n");
00076 if (data_seg) {
00077 CHECK_MAGIC_NUM;
00078 free(data_seg);
00079 CHECK_MAGIC_NUM;
00080 }
00081 }
00082
00083 void pup(PUP::er &p);
00084 };
00085
00086 void CtgGlobalStruct::pup(PUP::er &p) {
00087 assert(0);
00088
00089
00090
00091 }
00092
00093
00095 void CtgInit(void) {
00096 CHECK_MAGIC_NUM;
00097
00098 CmiPrintf("CtgInit()\n");
00099
00100 if (CmiMyNode()==0) {
00101 CmiPrintf("CHARM> -swapglobals enabled, but not yet finished for Mach-O\n");
00102 }
00103
00104 const struct segment_command *seg = getsegbyname("__DATA");
00105 _origCtg = new CtgGlobalStruct;
00106 _origCtg->allocate(seg->vmsize);
00107 CHECK_MAGIC_NUM;
00108 assert(_origCtg->data_seg);
00109 memcpy(_origCtg->data_seg, (void *)seg->vmaddr, seg->vmsize);
00110 CHECK_MAGIC_NUM;
00111 CmiPrintf("_origCtg initialized\n");
00112 assert(_origCtg);
00113 CHECK_MAGIC_NUM;
00114
00115 CtgGlobals cur = new CtgGlobalStruct;
00116 cur->allocate(seg->vmsize);
00117 CHECK_MAGIC_NUM;
00118 assert(cur);
00119 assert(cur->data_seg);
00120 memcpy(cur->data_seg, (void *)seg->vmaddr, seg->vmsize);
00121 CHECK_MAGIC_NUM;
00122 CpvAccess(_curCtg) = cur;
00123 assert(CpvAccess(_curCtg));
00124 assert(CpvAccess(_curCtg)->data_seg);
00125 assert(CpvAccess(_curCtg)->data_seg == cur->data_seg);
00126
00127 CmiPrintf("_curCtg initialized\n");
00128
00129 }
00130
00132 CtgGlobals CtgCreate(CthThread tid) {
00133 CtgGlobalStruct *g=new CtgGlobalStruct;
00134 const struct segment_command *seg = getsegbyname("__DATA");
00135 CHECK_MAGIC_NUM;
00136 printf("CtgCreate()\n");
00137 assert(seg);
00138 g->allocate(seg->vmsize);
00139 CHECK_MAGIC_NUM;
00140 memcpy(g->data_seg, (void *)seg->vmaddr, seg->vmsize);
00141 CHECK_MAGIC_NUM;
00142 return g;
00143 }
00144
00146 CtgGlobals CtgPup(pup_er pv, CtgGlobals g) {
00147 assert(0);
00148
00149
00150
00151
00152
00153
00154
00155
00156 return g;
00157 }
00158
00160 void CtgInstall(CtgGlobals g) {
00161 CtgGlobals g_install;
00162 printf("CtgInstall()\n");
00163 CHECK_MAGIC_NUM;
00164
00165 if(g){
00166 g_install = g;
00167 printf("installing g=%p\n", g_install);
00168 }
00169 else{
00170 g_install = _origCtg;
00171 printf("installing original g=%p\n", g_install);
00172 }
00173
00174 assert(g_install);
00175
00176 CtgGlobals g_old = CtgCurrentGlobals();
00177 const struct segment_command *seg = getsegbyname("__DATA");
00178 assert(seg);
00179 CHECK_MAGIC_NUM;
00180
00181
00182 if(g_old){
00183 memcpy(g_old->data_seg, (void *)seg->vmaddr, seg->vmsize);
00184 }
00185 else {
00186 printf("no current data segment to copy out into\n");
00187 }
00188
00189
00190 memcpy((void *)seg->vmaddr, g_install->data_seg, seg->vmsize);
00191 CpvAccess(_curCtg) = g_install;
00192 CHECK_MAGIC_NUM;
00193
00194 }
00195
00196
00198 void CtgFree(CtgGlobals g) {
00199 if (g->installed) CmiAbort("CtgFree called on currently installed globals!\n");
00200 delete g;
00201 CHECK_MAGIC_NUM;
00202 }
00203
00204
00205 CtgGlobals CtgCurrentGlobals(void){
00206 CHECK_MAGIC_NUM;
00207 return CpvAccess(_curCtg);
00208 }
00209
00210 #else
00211
00212 #include "global-nop.C"
00213
00214 #endif
00215