Index: emcore/trunk/arm/contextswitch.S |
— | — | @@ -151,11 +151,13 @@ |
152 | 152 | .global execfirmware
|
153 | 153 | .type execfirmware, %function
|
154 | 154 | execfirmware:
|
155 | | - str r0, [sp,#-4]!
|
| 155 | + stmfd sp!, {r0-r2}
|
156 | 156 | bl interrupt_shutdown
|
| 157 | + msr cpsr_c, #0xd3
|
| 158 | + ldmfd sp, {r0-r2}
|
| 159 | + bl memmove
|
157 | 160 | bl clean_dcache
|
158 | | - ldr r1, [sp], #4
|
159 | | - msr cpsr_c, #0xd3
|
| 161 | + ldr r1, [sp]
|
160 | 162 | mrc p15, 0, r0,c1,c0
|
161 | 163 | bic r0, r0, #5
|
162 | 164 | mcr p15, 0, r0,c1,c0
|
Index: emcore/trunk/usb/usb.c |
— | — | @@ -81,7 +81,12 @@ |
82 | 82 | DBGACTION_HWKEYAES,
|
83 | 83 | DBGACTION_HMACSHA1,
|
84 | 84 | DBGACTION_TARGETSPECIFIC,
|
85 | | - DBGACTION_STORAGE
|
| 85 | + DBGACTION_STORAGE,
|
| 86 | + DBGACTION_MALLOC,
|
| 87 | + DBGACTION_MEMALIGN,
|
| 88 | + DBGACTION_REALLOC,
|
| 89 | + DBGACTION_REOWNALLOC,
|
| 90 | + DBGACTION_FREE
|
86 | 91 | };
|
87 | 92 |
|
88 | 93 | static struct scheduler_thread dbgthread_handle IBSS_ATTR;
|
— | — | @@ -107,8 +112,8 @@ |
108 | 113 |
|
109 | 114 | static const char dbgconoverflowstr[] = "\n\n[overflowed]\n\n";
|
110 | 115 |
|
111 | | -extern int _initstart; // These aren't ints at all, but gcc complains about void types being
|
112 | | -extern int _sdramstart; // used here, and we only need the address, so just make it happy...
|
| 116 | +extern int _poolstart; // These aren't ints at all, but gcc complains about void types being
|
| 117 | +extern int _poolend; // used here, and we only need the address, so just make it happy...
|
113 | 118 |
|
114 | 119 |
|
115 | 120 | static struct usb_device_descriptor CACHEALIGN_ATTR device_descriptor =
|
— | — | @@ -373,8 +378,8 @@ |
374 | 379 | dbgsendbuf[3] = usb_drv_get_max_in_size();
|
375 | 380 | break;
|
376 | 381 | case 2: // GET USER MEMORY INFO
|
377 | | - dbgsendbuf[1] = (uint32_t)&_initstart;
|
378 | | - dbgsendbuf[2] = (uint32_t)&_sdramstart;
|
| 382 | + dbgsendbuf[1] = (uint32_t)&_poolstart;
|
| 383 | + dbgsendbuf[2] = (uint32_t)&_poolend;
|
379 | 384 | break;
|
380 | 385 | default:
|
381 | 386 | dbgsendbuf[0] = 2;
|
— | — | @@ -537,7 +542,7 @@ |
538 | 543 | dbgsendbuf[0] = 1;
|
539 | 544 | size = 16;
|
540 | 545 | break;
|
541 | | - case 19: // KILL THREAD
|
| 546 | + case 19: // CREATE THREAD
|
542 | 547 | dbgsendbuf[0] = 1;
|
543 | 548 | dbgsendbuf[1] = (uint32_t)thread_create(NULL, (const char*)(dbgsendbuf[1]),
|
544 | 549 | (const void*)(dbgsendbuf[2]),
|
— | — | @@ -573,6 +578,8 @@ |
574 | 579 | case 24: // EXECFIRMWARE
|
575 | 580 | if (set_dbgaction(DBGACTION_EXECFIRMWARE, 0)) break;
|
576 | 581 | dbgactionaddr = dbgrecvbuf[1];
|
| 582 | + dbgactionoffset = dbgrecvbuf[2];
|
| 583 | + dbgactionlength = dbgrecvbuf[3];
|
577 | 584 | break;
|
578 | 585 | #ifdef HAVE_HWKEYAES
|
579 | 586 | case 25: // HWKEYAES
|
— | — | @@ -623,6 +630,29 @@ |
624 | 631 | memcpy(dbgasyncsendbuf, dbgrecvbuf, sizeof(dbgasyncsendbuf));
|
625 | 632 | break;
|
626 | 633 | #endif
|
| 634 | + case 52: // MALLOC
|
| 635 | + if (set_dbgaction(DBGACTION_MALLOC, 0)) break;
|
| 636 | + dbgactionlength = dbgrecvbuf[1];
|
| 637 | + break;
|
| 638 | + case 53: // MEMALIGN
|
| 639 | + if (set_dbgaction(DBGACTION_MEMALIGN, 0)) break;
|
| 640 | + dbgactionoffset = dbgrecvbuf[1];
|
| 641 | + dbgactionlength = dbgrecvbuf[2];
|
| 642 | + break;
|
| 643 | + case 54: // REALLOC
|
| 644 | + if (set_dbgaction(DBGACTION_REALLOC, 0)) break;
|
| 645 | + dbgactionaddr = dbgrecvbuf[1];
|
| 646 | + dbgactionlength = dbgrecvbuf[2];
|
| 647 | + break;
|
| 648 | + case 55: // REOWNALLOC
|
| 649 | + if (set_dbgaction(DBGACTION_REOWNALLOC, 0)) break;
|
| 650 | + dbgactionaddr = dbgrecvbuf[1];
|
| 651 | + dbgactionoffset = dbgrecvbuf[2];
|
| 652 | + break;
|
| 653 | + case 56: // FREE
|
| 654 | + if (set_dbgaction(DBGACTION_FREE, 0)) break;
|
| 655 | + dbgactionaddr = dbgrecvbuf[1];
|
| 656 | + break;
|
627 | 657 | default:
|
628 | 658 | dbgsendbuf[0] = 2;
|
629 | 659 | size = 16;
|
— | — | @@ -712,7 +742,8 @@ |
713 | 743 | shutdown(false);
|
714 | 744 | dbgasyncsendbuf[0] = 1;
|
715 | 745 | usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
716 | | - execfirmware((void*)dbgactionaddr);
|
| 746 | + execfirmware((void*)dbgactionaddr, (void*)dbgactionoffset,
|
| 747 | + (size_t)dbgactionlength);
|
717 | 748 | #ifdef HAVE_BOOTFLASH
|
718 | 749 | case DBGACTION_READBOOTFLASH:
|
719 | 750 | bootflash_readraw((void*)dbgactionaddr, dbgactionoffset, dbgactionlength);
|
— | — | @@ -912,6 +943,33 @@ |
913 | 944 | }
|
914 | 945 | break;
|
915 | 946 | #endif
|
| 947 | + case DBGACTION_MALLOC:
|
| 948 | + dbgasyncsendbuf[0] = 1;
|
| 949 | + dbgasyncsendbuf[1] = (uint32_t)malloc((size_t)dbgactionlength);
|
| 950 | + usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
| 951 | + break;
|
| 952 | + case DBGACTION_MEMALIGN:
|
| 953 | + dbgasyncsendbuf[0] = 1;
|
| 954 | + dbgasyncsendbuf[1] = (uint32_t)memalign((size_t)dbgactionoffset,
|
| 955 | + (size_t)dbgactionlength);
|
| 956 | + usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
| 957 | + break;
|
| 958 | + case DBGACTION_REALLOC:
|
| 959 | + dbgasyncsendbuf[0] = 1;
|
| 960 | + dbgasyncsendbuf[1] = (uint32_t)realloc((void*)dbgactionaddr,
|
| 961 | + (size_t)dbgactionlength);
|
| 962 | + usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
| 963 | + break;
|
| 964 | + case DBGACTION_REOWNALLOC:
|
| 965 | + dbgasyncsendbuf[0] = 1;
|
| 966 | + reownalloc((void*)dbgactionaddr, (void*)dbgactionoffset);
|
| 967 | + usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
| 968 | + break;
|
| 969 | + case DBGACTION_FREE:
|
| 970 | + dbgasyncsendbuf[0] = 1;
|
| 971 | + free((void*)dbgactionaddr);
|
| 972 | + usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
|
| 973 | + break;
|
916 | 974 | }
|
917 | 975 | dbgaction = DBGACTION_IDLE;
|
918 | 976 | }
|
Index: emcore/trunk/contextswitch.h |
— | — | @@ -33,7 +33,7 @@ |
34 | 34 | void resume_thread(void) __attribute__((noreturn)) ICODE_ATTR;
|
35 | 35 | uint32_t enter_critical_section(void) ICODE_ATTR;
|
36 | 36 | void leave_critical_section(uint32_t mode) ICODE_ATTR;
|
37 | | -void execfirmware(void* addr) ICODE_ATTR;
|
| 37 | +void execfirmware(void* dest, void* src, size_t size) ICODE_ATTR;
|
38 | 38 |
|
39 | 39 |
|
40 | 40 | #endif
|