diff options
Diffstat (limited to 'utils/hwstub/stub/main.c')
-rw-r--r-- | utils/hwstub/stub/main.c | 11 |
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 |