Mercurial > flash_v2
comparison packages/hal/common/current/src/hal_stub.c @ 112:02ea4320376c ecos-sw-2000-07-21
Merge from eCos master repository on 2000-07-21-21:01:39-BST
| author | jlarmour |
|---|---|
| date | Fri, 21 Jul 2000 21:34:11 +0000 |
| parents | 84e4bde58b26 |
| children | 6ed91473a1cd |
comparison
equal
deleted
inserted
replaced
| 111:211b8a635ce9 | 112:02ea4320376c |
|---|---|
| 61 | 61 |
| 62 #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT | 62 #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT |
| 63 #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id | 63 #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id |
| 64 #endif | 64 #endif |
| 65 | 65 |
| 66 #ifdef USE_LONG_NAMES_FOR_ENUM_REGNAMES | |
| 67 #define PC REG_PC | |
| 68 #define SP REG_SP | |
| 69 #endif | |
| 70 | |
| 66 //----------------------------------------------------------------------------- | 71 //----------------------------------------------------------------------------- |
| 67 // Extra eCos data. | 72 // Extra eCos data. |
| 68 | 73 |
| 69 // Saved registers. | 74 // Saved registers. |
| 70 HAL_SavedRegisters *_hal_registers; | 75 HAL_SavedRegisters *_hal_registers; |
| 577 { | 582 { |
| 578 return HAL_BREAKINST; | 583 return HAL_BREAKINST; |
| 579 } | 584 } |
| 580 #endif | 585 #endif |
| 581 | 586 |
| 582 // FIXME: Add support for multiple breakpoints (libstub/bplist-dynamic.c) | |
| 583 int __set_breakpoint (target_register_t addr) { return 0; } | |
| 584 int __remove_breakpoint (target_register_t addr) { return 0; } | |
| 585 | |
| 586 //----------------------------------------------------------------------------- | 587 //----------------------------------------------------------------------------- |
| 587 // Write the 'T' packet in BUFFER. SIGVAL is the signal the program received. | 588 // Write the 'T' packet in BUFFER. SIGVAL is the signal the program received. |
| 588 void | 589 void |
| 589 __build_t_packet (int sigval, char *buf) | 590 __build_t_packet (int sigval, char *buf) |
| 590 { | 591 { |
| 591 target_register_t addr; | 592 target_register_t addr; |
| 592 char *ptr = buf; | 593 char *ptr = buf; |
| 593 target_register_t sp; | |
| 594 | |
| 595 sp = (target_register_t) get_register (SP); | |
| 596 | 594 |
| 597 *ptr++ = 'T'; | 595 *ptr++ = 'T'; |
| 598 *ptr++ = __tohex (sigval >> 4); | 596 *ptr++ = __tohex (sigval >> 4); |
| 599 *ptr++ = __tohex (sigval); | 597 *ptr++ = __tohex (sigval); |
| 600 | 598 |
| 634 | 632 |
| 635 *ptr++ = __tohex (PC >> 4); | 633 *ptr++ = __tohex (PC >> 4); |
| 636 *ptr++ = __tohex (PC); | 634 *ptr++ = __tohex (PC); |
| 637 *ptr++ = ':'; | 635 *ptr++ = ':'; |
| 638 addr = get_register (PC); | 636 addr = get_register (PC); |
| 637 #ifdef CYGARC_REGSIZE_DIFFERS_FROM_TARGET_REGISTER_T | |
| 638 ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0); | |
| 639 if (sizeof(addr) < REGSIZE(PC)) | |
| 640 { | |
| 641 // GDB is expecting REGSIZE(PC) number of bytes. | |
| 642 // We only have sizeof(addr) number. Let's fill | |
| 643 // the appropriate number of bytes intelligently. | |
| 644 target_register_t extend_val = 0; | |
| 645 #ifdef CYGARC_SIGN_EXTEND_REGISTERS | |
| 646 { | |
| 647 unsigned long bits_in_addr = (sizeof(addr) << 3); // ie Size in bytes * 8 | |
| 648 target_register_t sign_bit_mask = (1 << (bits_in_addr - 1)); | |
| 649 if ((addr & sign_bit_mask) == sign_bit_mask) | |
| 650 extend_val = ~0; | |
| 651 } | |
| 652 #endif | |
| 653 ptr = __mem2hex((char *)&extend_val, ptr, REGSIZE(PC) - sizeof(addr), 0); | |
| 654 } | |
| 655 #else | |
| 639 ptr = __mem2hex((char *)&addr, ptr, REGSIZE(PC), 0); | 656 ptr = __mem2hex((char *)&addr, ptr, REGSIZE(PC), 0); |
| 657 #endif | |
| 640 *ptr++ = ';'; | 658 *ptr++ = ';'; |
| 641 | 659 |
| 642 *ptr++ = __tohex (SP >> 4); | 660 *ptr++ = __tohex (SP >> 4); |
| 643 *ptr++ = __tohex (SP); | 661 *ptr++ = __tohex (SP); |
| 644 *ptr++ = ':'; | 662 *ptr++ = ':'; |
| 645 ptr = __mem2hex((char *)&sp, ptr, REGSIZE(SP), 0); | 663 addr = (target_register_t) get_register (SP); |
| 664 #ifdef CYGARC_REGSIZE_DIFFERS_FROM_TARGET_REGISTER_T | |
| 665 ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0); | |
| 666 if (sizeof(addr) < REGSIZE(SP)) | |
| 667 { | |
| 668 // GDB is expecting REGSIZE(SP) number of bytes. | |
| 669 // We only have sizeof(addr) number. Let's fill | |
| 670 // the appropriate number of bytes intelligently. | |
| 671 target_register_t extend_val = 0; | |
| 672 #ifdef CYGARC_SIGN_EXTEND_REGISTERS | |
| 673 { | |
| 674 unsigned long bits_in_addr = (sizeof(addr) << 3); // ie Size in bytes * 8 | |
| 675 target_register_t sign_bit_mask = (1 << (bits_in_addr - 1)); | |
| 676 if ((addr & sign_bit_mask) == sign_bit_mask) | |
| 677 extend_val = ~0; | |
| 678 } | |
| 679 #endif | |
| 680 ptr = __mem2hex((char *)&extend_val, ptr, REGSIZE(SP) - sizeof(addr), 0); | |
| 681 } | |
| 682 #else | |
| 683 ptr = __mem2hex((char *)&addr, ptr, REGSIZE(SP), 0); | |
| 684 #endif | |
| 646 *ptr++ = ';'; | 685 *ptr++ = ';'; |
| 647 | 686 |
| 648 *ptr++ = 0; | 687 *ptr++ = 0; |
| 649 } | 688 } |
| 650 | 689 |
| 714 } | 753 } |
| 715 | 754 |
| 716 //----------------------------------------------------------------------------- | 755 //----------------------------------------------------------------------------- |
| 717 // Memory accessor functions. | 756 // Memory accessor functions. |
| 718 | 757 |
| 719 void *__mem_fault_handler = (void *)0; | 758 volatile void *__mem_fault_handler = (void *)0; |
| 720 | 759 |
| 721 /* These are the "arguments" to __do_read_mem and __do_write_mem, | 760 /* These are the "arguments" to __do_read_mem and __do_write_mem, |
| 722 which are passed as globals to avoid squeezing them thru | 761 which are passed as globals to avoid squeezing them thru |
| 723 __set_mem_fault_trap. */ | 762 __set_mem_fault_trap. */ |
| 724 | 763 |
