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