summaryrefslogtreecommitdiff
path: root/utils/hwstub/stub/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/stub/main.c')
-rw-r--r--utils/hwstub/stub/main.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/utils/hwstub/stub/main.c b/utils/hwstub/stub/main.c
index ee93ad4b63..c35872f320 100644
--- a/utils/hwstub/stub/main.c
+++ b/utils/hwstub/stub/main.c
@@ -518,10 +518,17 @@ static void handle_exec(struct usb_ctrlrequest *req)
518 if(size != sizeof(struct hwstub_exec_req_t)) 518 if(size != sizeof(struct hwstub_exec_req_t))
519 return usb_drv_stall(EP_CONTROL, true, true); 519 return usb_drv_stall(EP_CONTROL, true, true);
520 uint32_t addr = exec->dAddress; 520 uint32_t addr = exec->dAddress;
521
522#if defined(CPU_ARM)
521 if(exec->bmFlags & HWSTUB_EXEC_THUMB) 523 if(exec->bmFlags & HWSTUB_EXEC_THUMB)
522 addr |= 1; 524 addr |= 1;
523 else 525 else
524 addr &= ~1; 526 addr &= ~1;
527#endif
528
529#ifdef CONFIG_FLUSH_CACHES
530 target_flush_caches();
531#endif
525 532
526 if(exec->bmFlags & HWSTUB_EXEC_CALL) 533 if(exec->bmFlags & HWSTUB_EXEC_CALL)
527 { 534 {
@@ -540,11 +547,13 @@ static void handle_exec(struct usb_ctrlrequest *req)
540 else 547 else
541 { 548 {
542 /* in case of jump, respond immediately and disconnect usb */ 549 /* in case of jump, respond immediately and disconnect usb */
550#if defined(CPU_ARM)
543 usb_drv_send(EP_CONTROL, NULL, 0); 551 usb_drv_send(EP_CONTROL, NULL, 0);
544 usb_drv_exit(); 552 usb_drv_exit();
545#if defined(CPU_ARM)
546 asm volatile("bx %0\n" : : "r" (addr) : "memory"); 553 asm volatile("bx %0\n" : : "r" (addr) : "memory");
547#elif defined(CPU_MIPS) 554#elif defined(CPU_MIPS)
555 usb_drv_send(EP_CONTROL, NULL, 0);
556 usb_drv_exit();
548 asm volatile("jr %0\nnop\n" : : "r" (addr) : "memory"); 557 asm volatile("jr %0\nnop\n" : : "r" (addr) : "memory");
549#else 558#else
550#warning jump is unsupported on this platform 559#warning jump is unsupported on this platform