4 #include "multicoreruntime.h"
5 #include "methodheaders.h"
7 extern int classsize[];
8 extern int typearray[];
9 extern int typearray2[];
10 extern int* supertypes[];
13 extern struct genhashtable * activetasks;
21 int instanceofif(int otype, int type) {
28 int num = supertypes[otype][0];
29 for(int i = 1; i < num + 1; i++) {
30 int t = supertypes[otype][i];
31 if(instanceofif(t, type) == 1) {
38 int instanceof(struct ___Object___ *ptr, int type) {
43 if(instanceofif(i, type) == 1) {
50 i=typearray2[i-NUMCLASSES];
56 void initializeexithandler() {
59 /* This function inject failures */
60 void injectinstructionfailure() {
61 // not supported in MULTICORE version
65 #ifdef D___Double______nativeparsedouble____L___String___
66 double CALL01(___Double______nativeparsedouble____L___String___,
67 struct ___String___ * ___str___) {
68 int length=VAR(___str___)->___count___;
69 int maxlength=(length>60) ? 60 : length;
70 char str[maxlength+1];
71 struct ArrayObject * chararray=VAR(___str___)->___value___;
73 int offset=VAR(___str___)->___offset___;
74 for(i=0; i<maxlength; i++) {
76 ((short *)(((char *)&chararray->___length___)+sizeof(int)))[i+offset];
79 double d=0.0; //atof(str); TODO Unimplemented nativeparsedoulbe
84 #ifdef D___Double______nativeparsedouble_____AR_B_I_I
85 double CALL23(___Double______nativeparsedouble_____AR_B_I_I,
90 struct ArrayObject * ___str___) {
91 int maxlength=(length>60)?60:length;
92 char str[maxlength+1];
93 struct ArrayObject * bytearray=VAR(___str___);
95 for(i=0; i<maxlength; i++) {
96 str[i]=(((char *)&bytearray->___length___)+sizeof(int))[i+start];
99 double d=0.0; //atof(str); TODO Unimplemented nativeparsedouble
104 typedef union jvalue {
114 #ifdef D___Double______doubleToRawLongBits____D
115 long long CALL11(___Double______doubleToRawLongBits____D,
117 double ___value___) {
121 #if defined(__IEEE_BYTES_LITTLE_ENDIAN)
122 /* On little endian ARM processors when using FPA, word order of
123 doubles is still big endian. So take that into account here. When
124 using VFP, word order of doubles follows byte order. */
125 #define SWAP_DOUBLE(a) (((a) << 32) | (((a) >> 32) & 0x00000000ffffffff))
126 val.j = SWAP_DOUBLE(val.j);
133 #ifdef D___Double______longBitsToDouble____J
134 double CALL11(___Double______longBitsToDouble____J,
135 long long ___bits___,
136 long long ___bits___) {
140 #if defined(__IEEE_BYTES_LITTLE_ENDIAN)
142 #define SWAP_DOUBLE(a) (((a) << 32) | (((a) >> 32) & 0x00000000ffffffff))
144 val.j = SWAP_DOUBLE(val.j);
151 #ifdef D___String______convertdoubletochar____D__AR_C
152 int CALL12(___String______convertdoubletochar____D__AR_C,
155 struct ArrayObject * ___chararray___) {
156 int length=VAR(___chararray___)->___length___;
159 int num=snprintf(str, length, "%f",___val___);
162 for(i=0; i<length; i++) {
163 ((short *)(((char *)&VAR(___chararray___)->___length___)+sizeof(int)))[i]=
169 int CALL12(___String______convertdoubletochar____D__AR_C,
172 struct ArrayObject ___chararray___) {
177 #ifdef D___System______deepArrayCopy____L___Object____L___Object___
178 void deepArrayCopy(struct ___Object___ * dst,
179 struct ___Object___ * src) {
180 int dsttype=((int *)dst)[0];
181 int srctype=((int *)src)[0];
182 if (dsttype<NUMCLASSES||srctype<NUMCLASSES||srctype!=dsttype)
184 struct ArrayObject *aodst=(struct ArrayObject *)dst;
185 struct ArrayObject *aosrc=(struct ArrayObject *)src;
186 int dstlength=aodst->___length___;
187 int srclength=aosrc->___length___;
188 if (dstlength!=srclength)
190 unsigned INTPTR *pointer=pointerarray[srctype];
192 int elementsize=classsize[srctype];
193 int size=srclength*elementsize;
195 memcpy(((char *)&aodst->___length___)+sizeof(int) ,
196 ((char *)&aosrc->___length___)+sizeof(int), size);
200 for(i=0;i<srclength;i++) {
201 struct ___Object___ * ptr=
202 ((struct ___Object___**)(((char*)&aosrc->___length___)+sizeof(int)))[i];
203 int ptrtype=((int *)ptr)[0];
204 if (ptrtype>=NUMCLASSES) {
205 struct ___Object___ * dstptr=((struct ___Object___**)
206 (((char*)&aodst->___length___)+sizeof(int)))[i];
207 deepArrayCopy(dstptr,ptr);
210 ((struct ___Object___ **)
211 (((char*) &aodst->___length___)+sizeof(int)))[i]=ptr;
217 void CALL02(___System______deepArrayCopy____L___Object____L___Object___,
218 struct ___Object___ * ___dst___,
219 struct ___Object___ * ___src___) {
220 deepArrayCopy(VAR(___dst___), VAR(___src___));
224 #ifdef D___System______arraycopy____L___Object____I_L___Object____I_I
225 void arraycopy(struct ___Object___ *src,
227 struct ___Object___ *dst,
230 int dsttype=((int *)dst)[0];
231 int srctype=((int *)src)[0];
233 //not an array or type mismatch
234 if (dsttype<NUMCLASSES||srctype<NUMCLASSES/*||srctype!=dsttype*/)
237 struct ArrayObject *aodst=(struct ArrayObject *)dst;
238 struct ArrayObject *aosrc=(struct ArrayObject *)src;
239 int dstlength=aodst->___length___;
240 int srclength=aosrc->___length___;
244 if (srcPos+length>srclength)
246 if (destPos+length>dstlength)
249 unsigned INTPTR *pointer=pointerarray[srctype];
251 int elementsize=classsize[srctype];
252 int size=length*elementsize;
254 memcpy(((char *)&aodst->___length___)+sizeof(int)+destPos*elementsize,
255 ((char *)&aosrc->___length___)+sizeof(int)+srcPos*elementsize, size);
259 for(i=0;i<length;i++) {
260 struct ___Object___ * ptr=((struct ___Object___**)
261 (((char*)&aosrc->___length___)+sizeof(int)))[i+srcPos];
262 int ptrtype=((int *)ptr)[0];
264 ((struct ___Object___ **)
265 (((char*) &aodst->___length___)+sizeof(int)))[i+destPos]=ptr;
270 void CALL35(___System______arraycopy____L___Object____I_L___Object____I_I,
274 struct ___Object___ * ___src___,
276 struct ___Object___ * ___dst___,
279 arraycopy(VAR(___src___), ___srcPos___, VAR(___dst___), ___destPos___,
284 void CALL11(___System______exit____I,
287 // gc_profile mode, output gc prfiling data
289 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
290 BAMBOO_PRINT(BAMBOO_GET_EXE_TIME());
291 BAMBOO_PRINT(0xbbbbbbbb);
292 CACHEADAPT_DISABLE_TIMER();
293 GC_OUTPUT_PROFILE_DATA();
296 BAMBOO_EXIT(___status___);
299 #ifdef D___Vector______removeElement_____AR_L___Object____I_I
300 void CALL23(___Vector______removeElement_____AR_L___Object____I_I,
303 struct ArrayObject * ___array___,
306 char* offset=((char *)(&VAR(___array___)->___length___))
307 +sizeof(unsigned int)+sizeof(void *)*___index___;
308 memmove(offset, offset+sizeof(void *),
309 (___size___-___index___-1)*sizeof(void *));
313 void CALL11(___System______printI____I,
316 BAMBOO_PRINT(0x1111);
317 BAMBOO_PRINT_REG(___status___);
320 long long CALL00(___System______currentTimeMillis____) {
321 //TilePro64 is 700mHz
322 return ((unsigned long long)BAMBOO_GET_EXE_TIME())/700000;
325 void CALL00(___System______setgcprofileflag____) {
328 extern volatile bool gc_profile_flag;
329 gc_profile_flag = true;
334 void CALL00(___System______resetgcprofileflag____) {
337 extern volatile bool gc_profile_flag;
338 gc_profile_flag = false;
343 void CALL01(___System______printString____L___String___,
344 struct ___String___ * ___s___) {
347 struct ArrayObject * chararray=VAR(___s___)->___value___;
349 int offset=VAR(___s___)->___offset___;
351 for(i=0; i<VAR(___s___)->___count___; i++) {
353 ((short *)(((char *)&chararray->___length___)+sizeof(int)))[i+offset];
360 /* Object allocation function */
363 void * allocate_new(void * ptr,
365 struct ___Object___ * v=
366 (struct ___Object___*)FREEMALLOC((struct garbagelist*) ptr,classsize[type]);
375 extern unsigned int gc_num_obj;
381 /* Array allocation function */
383 struct ArrayObject * allocate_newarray(void * ptr,
386 struct ArrayObject * v=(struct ArrayObject *)FREEMALLOC(
387 (struct garbagelist*)ptr,
388 sizeof(struct ArrayObject)+length*classsize[type]);
397 v->___length___=length;
400 extern unsigned int gc_num_obj;
407 void * allocate_new(int type) {
408 struct ___Object___ * v=FREEMALLOC(classsize[type]);
418 /* Array allocation function */
420 struct ArrayObject * allocate_newarray(int type,
422 struct ArrayObject * v=FREEMALLOC(
423 sizeof(struct ArrayObject)+length*classsize[type]);
429 v->___length___=length;
435 /* Converts C character arrays into Java strings */
437 __attribute__((malloc)) struct ___String___ * NewStringShort(void * ptr,
441 __attribute__((malloc)) struct ___String___ * NewStringShort(const short *str,
446 struct ArrayObject * chararray=
447 allocate_newarray((struct garbagelist *)ptr, CHARARRAYTYPE, length);
448 INTPTR ptrarray[]={1, (INTPTR) ptr, (INTPTR) chararray};
449 struct ___String___ * strobj=
450 allocate_new((struct garbagelist *) &ptrarray, STRINGTYPE);
451 chararray=(struct ArrayObject *) ptrarray[2];
453 struct ArrayObject * chararray=allocate_newarray(CHARARRAYTYPE, length);
454 struct ___String___ * strobj=allocate_new(STRINGTYPE);
456 strobj->___value___=chararray;
457 strobj->___count___=length;
458 strobj->___offset___=0;
460 for(i=0; i<length; i++) {
461 ((short *)(((char *)&chararray->___length___)+sizeof(int)))[i]=str[i];
466 /* Converts C character arrays into Java strings */
468 struct ___String___ * NewString(void * ptr,
472 struct ___String___ * NewString(const char *str,
477 struct ArrayObject * chararray=
478 allocate_newarray((struct garbagelist *)ptr, CHARARRAYTYPE, length);
479 int ptrarray[]={1, (int) ptr, (int) chararray};
480 struct ___String___ * strobj=
481 allocate_new((struct garbagelist *) &ptrarray, STRINGTYPE);
482 chararray=(struct ArrayObject *) ptrarray[2];
484 struct ArrayObject * chararray=allocate_newarray(CHARARRAYTYPE, length);
485 struct ___String___ * strobj=allocate_new(STRINGTYPE);
487 strobj->___value___=chararray;
488 strobj->___count___=length;
489 strobj->___offset___=0;
491 for(i=0; i<length; i++) {
492 ((short*)(((char*)&chararray->___length___)+sizeof(int)))[i]=(short)str[i];
497 /* Generated code calls this if we fail a bounds check */
499 void failedboundschk(int num) {
501 printf("Array out of bounds\n");
505 BAMBOO_EXIT(0xa0000000 + num);
511 printf("Array out of bounds\n");
512 longjmp(error_handler,2);
514 BAMBOO_EXIT(0xa0000000 + num);
519 /* Generated code calls this if we fail null ptr chk */
520 void failednullptr(void * ptr) {
523 //print out current stack
526 struct garbagelist * stackptr = (struct garbagelist *)ptr;
527 while(stackptr!=NULL) {
528 tprintf("Stack %d: \n\t", j);
529 for(i=0; i<stackptr->size; i++) {
530 if(stackptr->array[i] != NULL) {
531 tprintf("%x, ", stackptr->array[i]);
537 stackptr=stackptr->next;
542 printf("NULL ptr\n");
552 printf("NULL ptr\n");
553 longjmp(error_handler,2);
560 /* Abort task call */
564 printf("Aborting\n");
565 longjmp(error_handler,4);
568 printf("Aborting\n");
573 INLINE void initruntimedata() {
575 // initialize the arrays
576 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
577 // startup core to initialize corestatus[]
578 for(i = 0; i < NUMCORESACTIVE; ++i) {
581 numreceiveobjs[i] = 0;
588 self_numsendobjs = 0;
589 self_numreceiveobjs = 0;
591 for(i = 0; i < BAMBOO_MSG_BUF_LENGTH; ++i) {
596 msglength = BAMBOO_MSG_BUF_LENGTH;
598 for(i = 0; i < BAMBOO_OUT_BUF_LENGTH; ++i) {
604 isMsgHanging = false;
607 bamboo_cur_msp = NULL;
608 bamboo_smem_size = 0;
613 INITMULTICOREGCDATA();
617 bamboo_current_thread = 0;
623 INLINE void disruntimedata() {
624 DISMULTICOREGCDATA();
626 BAMBOO_LOCAL_MEM_CLOSE();
627 BAMBOO_SHARE_MEM_CLOSE();
630 INLINE void recordtotalexetime() {
632 totalexetime = BAMBOO_GET_EXE_TIME()-bamboo_start_time;
634 BAMBOO_PRINT(BAMBOO_GET_EXE_TIME()-bamboo_start_time);
636 BAMBOO_PRINT_REG(gc_num_flush_dtlb);
638 #ifndef BAMBOO_MEMPROF
639 BAMBOO_PRINT(0xbbbbbbbb);
644 INLINE void getprofiledata() {
645 //profile mode, send msgs to other cores to request pouring out progiling data
647 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
648 for(i = 1; i < NUMCORESACTIVE; ++i) {
649 // send profile request msg to core i
650 send_msg_2(i, PROFILEOUTPUT, totalexetime, false);
653 // pour profiling data on startup core
657 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
658 profilestatus[BAMBOO_NUM_OF_CORE] = 0;
659 // check the status of all cores
660 for(i = 0; i < NUMCORESACTIVE; ++i) {
661 if(profilestatus[i] != 0) {
665 if(i != NUMCORESACTIVE) {
667 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
671 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
678 INLINE void checkCoreStatus() {
679 bool allStall = false;
683 (waitconfirm && (numconfirm == 0))) {
684 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
685 corestatus[BAMBOO_NUM_OF_CORE] = 0;
686 numsendobjs[BAMBOO_NUM_OF_CORE] = self_numsendobjs;
687 numreceiveobjs[BAMBOO_NUM_OF_CORE] = self_numreceiveobjs;
688 // check the status of all cores
690 for(i = 0; i < NUMCORESACTIVE; ++i) {
691 if(corestatus[i] != 0) {
697 // check if the sum of send objs and receive obj are the same
698 // yes->check if the info is the latest; no->go on executing
700 for(i = 0; i < NUMCORESACTIVE; ++i) {
701 sumsendobj += numsendobjs[i];
703 for(i = 0; i < NUMCORESACTIVE; ++i) {
704 sumsendobj -= numreceiveobjs[i];
706 if(0 == sumsendobj) {
708 // the first time found all cores stall
709 // send out status confirm msg to all other cores
710 // reset the corestatus array too
711 corestatus[BAMBOO_NUM_OF_CORE] = 1;
713 numconfirm = NUMCORESACTIVE - 1;
714 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
715 for(i = 1; i < NUMCORESACTIVE; ++i) {
717 // send status confirm msg to core i
718 send_msg_1(i, STATUSCONFIRM, false);
719 } // for(i = 1; i < NUMCORESACTIVE; ++i)
722 // all the core status info are the latest
723 // terminate; for profiling mode, send request to all
724 // other cores to pour out profiling data
725 recordtotalexetime();
727 CACHEADAPT_DISABLE_TIMER();
728 GC_OUTPUT_PROFILE_DATA();
730 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
731 terminate(); // All done.
732 } // if(!waitconfirm)
734 // still some objects on the fly on the network
735 // reset the waitconfirm and numconfirm
738 } // if(0 == sumsendobj)
740 // not all cores are stall, keep on waiting
744 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
745 } // if((!waitconfirm) ||
748 // main function for each core
749 inline void run(int argc, char** argv) {
751 bool sendStall = false;
753 bool tocontinue = false;
755 corenum = BAMBOO_GET_NUM_OF_CORE();
757 // initialize runtime data structures
760 // other architecture related initialization
764 CACHEADAPT_ENABLE_TIMER();
766 initializeexithandler();
768 // main process of the execution module
769 if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
771 // non-executing cores, only processing communications
777 /* Create queue of active tasks */
778 activetasks= genallocatehashtable((unsigned int (*)(void *)) &hashCodetpd,
779 (int (*)(void *,void *)) &comparetpd);
781 /* Process task information */
784 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
785 /* Create startup object */
786 createstartupobject(argc, argv);
790 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
792 // run the initStaticAndGlobal method to initialize the static blocks and
794 initStaticAndGlobal();
796 // run the main method in the specified mainclass
797 mgc_main(argc, argv);
804 // check if there are new active tasks can be executed
810 while(receiveObject() != -1) {
813 // check if there are some pending objects,
814 // if yes, enqueue them and executetasks again
815 tocontinue = checkObjQueue();
817 tocontinue = trystartthread();
825 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
836 // wait for some time
842 // send StallMsg to startup core
844 send_msg_4(STARTUPCORE, TRANSTALL, BAMBOO_NUM_OF_CORE,
845 self_numsendobjs, self_numreceiveobjs, false);