Mercurial > nand-ecoscentric
changeset 179:391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
line wrap: on
line diff
--- a/packages/devs/eth/arm/edb7xxx/current/ChangeLog +++ b/packages/devs/eth/arm/edb7xxx/current/ChangeLog @@ -1,3 +1,8 @@ +2001-08-15 Gary Thomas <gthomas@redhat.com> + + * src/if_edb7xxx.c (cs8900_send): Only start transmitter after + a full packet has been staged. This prevents lost Tx interrupts. + 2001-06-19 Jonathan Larmour <jlarmour@redhat.com> * src/if_edb7xxx.c (edb7xxx_cs8900_init): Don't retrieve ESA if
--- a/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c +++ b/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c @@ -340,9 +340,21 @@ cs8900_send(struct eth_drv_sc *sc, struc cpd->txstart = cyg_current_time(); #endif // Start the xmit sequence -// Note: this can go back once the 'dump' is removed - CS8900_TxCMD = PP_TxCmd_TxStart_5; // Start more-or-less immediately -// CS8900_TxCMD = PP_TxCmd_TxStart_Full; // Start only when all data sent to chip + + // The hardware indicates that there are options as to when the actual + // packet transmission will start wrt moving of data into the transmit + // buffer. However, impirical results seem to indicate that if the + // packet is large and transmission is allowed to start before the + // entire packet has been pushed into the buffer, the hardware gets + // confused and the packet is lost, along with a "lost" Tx interrupt. + // This may be a case of the copy loop below being interrupted, e.g. + // a system timer interrupt, and the hardware getting unhappy that + // not all of the data was provided before the transmission should + // have completed (i.e. buffer underrun). + // For now, the solution is to not allow this overlap. +// CS8900_TxCMD = PP_TxCmd_TxStart_5; // Start more-or-less immediately + CS8900_TxCMD = PP_TxCmd_TxStart_Full; // Start only when all data sent to chip + CS8900_TxLEN = total_len; stat = get_reg(PP_BusStat); // This actually starts the xmit
--- a/packages/devs/eth/arm/iq80310/current/ChangeLog +++ b/packages/devs/eth/arm/iq80310/current/ChangeLog @@ -1,3 +1,8 @@ +2001-08-15 Mark Salter <msalter@redhat.com> + + * src/if_iq80310.c: Use 32-bit access to MDI. Problem discovered + by bruce.daly@spirentcom.com. + 2000-12-21 Mark Salter <msalter@redhat.com> * src/if_iq80310.c (i82559_start): Fix syntax error when DEBUG defined.
--- a/packages/devs/eth/arm/iq80310/current/src/if_iq80310.c +++ b/packages/devs/eth/arm/iq80310/current/src/if_iq80310.c @@ -24,7 +24,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -826,16 +826,16 @@ static cyg_uint16 readMDI (long ioaddr, mdiCtrl.bits.regAdd = regAdd & 0x1f; // start the operation - OUTW(mdiCtrl.word, mdi_addr); + OUTL(mdiCtrl.word, mdi_addr); // delay a bit udelay (1000); // poll for completion */ - mdiCtrl.word = INW(mdi_addr); + mdiCtrl.word = INL(mdi_addr); while ((mdiCtrl.bits.ready == MDI_NOT_READY) && (num_ms != 2000)) { // wait max 2secs - mdiCtrl.word = INW(mdi_addr); + mdiCtrl.word = INL(mdi_addr); udelay(1000); num_ms++; } @@ -864,16 +864,16 @@ static void writeMDI (long ioaddr, cyg_u mdiCtrl.bits.data = data & 0xffff; // start the operation - OUTW(mdiCtrl.word, mdi_addr); + OUTL(mdiCtrl.word, mdi_addr); // delay a bit udelay(1000); // poll for completion - mdiCtrl.word = INW(mdi_addr); + mdiCtrl.word = INL(mdi_addr); while ((mdiCtrl.bits.ready == MDI_NOT_READY) && (num_ms != 2000)) { - mdiCtrl.word = INW(mdi_addr); + mdiCtrl.word = INL(mdi_addr); udelay(1000); num_ms++; }
--- a/packages/devs/flash/amd/am29xxxxx/current/ChangeLog +++ b/packages/devs/flash/amd/am29xxxxx/current/ChangeLog @@ -1,3 +1,7 @@ +2001-08-16 Jonathan Larmour <jlarmour@redhat.com> + + * include/flash_am29xxxxx.inl: Double erase timeouts for faster CPUs. + 2001-08-10 Jesper Skov <jskov@redhat.com> * include/flash_am29xxxxx.inl (flash_hwr_init): Fix block number.
--- a/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl +++ b/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl @@ -309,7 +309,7 @@ flash_erase_block(void* block, unsigned *b_v = FLASH_Block_Erase; // Now poll for the completion of the sector erase timer (50us) - timeout = 5000000; // how many retries? + timeout = 10000000; // how many retries? while (true) { state = *b_v; if ((state & FLASH_Sector_Erase_Timer) == 0) break; @@ -322,7 +322,7 @@ flash_erase_block(void* block, unsigned // Then wait for erase completion. if (FLASH_ERR_OK == res) { - timeout = 5000000; + timeout = 10000000; while (true) { state = *b_v; if (FLASH_BlankValue == state) { @@ -411,7 +411,7 @@ flash_program_buf(void* addr, void* data *f_s1 = FLASH_Program; *addr_v = *data_ptr; - timeout = 5000000; + timeout = 10000000; while (true) { state = *addr_v; if (*data_ptr == state) {
--- a/packages/devs/flash/intel/28fxxx/current/ChangeLog +++ b/packages/devs/flash/intel/28fxxx/current/ChangeLog @@ -1,3 +1,12 @@ +2001-08-15 Jesper Skov <jskov@redhat.com> + [from branch] + * include/flash_28fxxx_parts.inl: Set correct bootblock sub-block + sizes. + + * include/flash_28fxxx.inl (nDEBUG): Added some debug code. + (flash_unlock_block, flash_lock_block): Iterate properly over + bootblock sub-blocks. + 2001-08-10 Jesper Skov <jskov@redhat.com> * cdl/flash_intel_28fxxx.cdl: Added options for variants.
--- a/packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx.inl +++ b/packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx.inl @@ -58,30 +58,38 @@ #define _FLASH_PRIVATE_ #include <cyg/io/flash.h> +#define nDEBUG + +#ifdef DEBUG +typedef void (*call_t)(char* str, ...); +extern void diag_printf(char* str, ...); +call_t d_print = &diag_printf; +#endif + //---------------------------------------------------------------------------- // Common device details. #define FLASH_Read_ID FLASHWORD( 0x90 ) #define FLASH_Reset FLASHWORD( 0xFF ) #define FLASH_Program FLASHWORD( 0x40 ) #define FLASH_Write_Buffer FLASHWORD( 0xe8 ) -#define FLASH_Block_Erase FLASHWORD( 0x20 ) -#define FLASH_Confirm FLASHWORD( 0xD0 ) -#define FLASH_Resume FLASHWORD( 0xD0 ) +#define FLASH_Block_Erase FLASHWORD( 0x20 ) +#define FLASH_Confirm FLASHWORD( 0xD0 ) +#define FLASH_Resume FLASHWORD( 0xD0 ) #define FLASH_Set_Lock FLASHWORD( 0x60 ) #define FLASH_Set_Lock_Confirm FLASHWORD( 0x01 ) #define FLASH_Clear_Lock FLASHWORD( 0x60 ) #define FLASH_Clear_Lock_Confirm FLASHWORD( 0xd0 ) -#define FLASH_Read_Status FLASHWORD( 0x70 ) -#define FLASH_Clear_Status FLASHWORD( 0x50 ) -#define FLASH_Status_Ready FLASHWORD( 0x80 ) +#define FLASH_Read_Status FLASHWORD( 0x70 ) +#define FLASH_Clear_Status FLASHWORD( 0x50 ) +#define FLASH_Status_Ready FLASHWORD( 0x80 ) // Status that we read back: -#define FLASH_ErrorMask FLASHWORD( 0x7E ) -#define FLASH_ErrorProgram FLASHWORD( 0x10 ) -#define FLASH_ErrorErase FLASHWORD( 0x20 ) -#define FLASH_ErrorLock FLASHWORD( 0x30 ) +#define FLASH_ErrorMask FLASHWORD( 0x7E ) +#define FLASH_ErrorProgram FLASHWORD( 0x10 ) +#define FLASH_ErrorErase FLASHWORD( 0x20 ) +#define FLASH_ErrorLock FLASHWORD( 0x30 ) #define FLASH_ErrorLowVoltage FLASHWORD( 0x08 ) #define FLASH_ErrorLocked FLASHWORD( 0x02 ) @@ -314,7 +322,6 @@ flash_program_buf(void* addr, void* data { flash_data_t stat = 0; int timeout; - int wc, i; volatile flash_data_t* ROM; volatile flash_data_t* BA; @@ -336,6 +343,7 @@ flash_program_buf(void* addr, void* data // parts yet. // FIXME: This code does not appear to work anymore if (0 && flash_dev_info->buffered_w) { + int i, wc; // Write any big chunks first while (len >= buffer_size) { wc = buffer_size; @@ -431,6 +439,10 @@ flash_lock_block(void* block) if (!flash_dev_info->locking) return res; +#ifdef DEBUG + d_print("flash_lock_block %08x\n", block); +#endif + ROM = (volatile flash_data_t*)((unsigned long)block & flash_dev_info->base_mask); // Is this the boot sector? @@ -460,6 +472,9 @@ flash_lock_block(void* block) // Restore ROM to "normal" mode ROM[0] = FLASH_Reset; + + // Go to next block + b_p += len / sizeof( flash_data_t ); len = 0; if (FLASH_ErrorLock == (state & FLASH_ErrorLock)) @@ -495,6 +510,10 @@ flash_unlock_block(void* block, int bloc ROM = (volatile flash_data_t*)((unsigned long)block & flash_dev_info->base_mask); +#ifdef DEBUG + d_print("flash_unlock_block dev %08x block %08x size %08x count %08x\n", ROM, block, block_size, blocks); +#endif + // Is this the boot sector? bootblock = (flash_dev_info->bootblock && (flash_dev_info->bootblocks[0] == ((unsigned long)block - (unsigned long)ROM))); @@ -523,6 +542,9 @@ flash_unlock_block(void* block, int bloc // Restore ROM to "normal" mode ROM[0] = FLASH_Reset; + + // Go to next block + b_p += len / sizeof( flash_data_t ); len = 0; if (FLASH_ErrorLock == (state & FLASH_ErrorLock)) @@ -603,4 +625,3 @@ flash_unlock_block(void* block, int bloc #endif // CYGHWR_IO_FLASH_BLOCK_LOCKING #endif // CYGONCE_DEVS_FLASH_INTEL_28FXXX_INL -
--- a/packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx_parts.inl +++ b/packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx_parts.inl @@ -60,14 +60,14 @@ buffered_w : false, bootblock : true, bootblocks : { 0x3e0000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, 0 }, banked : false @@ -82,14 +82,14 @@ buffered_w : false, bootblock : true, bootblocks : { 0x000000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, - 0x001000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, 0 }, banked : false
--- a/packages/hal/arm/at91/current/ChangeLog +++ b/packages/hal/arm/at91/current/ChangeLog @@ -1,3 +1,9 @@ +2001-08-17 George Hampton <george.hampton@intel.com> +2001-08-17 Gary Thomas <gthomas@redhat.com> + + * include/hal_platform_ints.h (CYGNUM_HAL_ISR_COUNT): PR 22864 + Don't adjust by "min" value if not doing translations. + 2001-07-26 Gary Thomas <gthomas@redhat.com> * src/at91_misc.c (hal_clock_initialize):
--- a/packages/hal/arm/at91/current/include/hal_platform_ints.h +++ b/packages/hal/arm/at91/current/include/hal_platform_ints.h @@ -61,7 +61,8 @@ #define CYGNUM_HAL_ISR_MIN 2 #define CYGNUM_HAL_ISR_MAX 18 -#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX - CYGNUM_HAL_ISR_MIN + 1) +// Note: extra slots (0,1) to avoid messing with vector translation +#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX + 1) // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0
--- a/packages/hal/arm/iq80310/current/ChangeLog +++ b/packages/hal/arm/iq80310/current/ChangeLog @@ -1,3 +1,10 @@ +2001-08-15 Mark Salter <msalter@redhat.com> + + * include/hal_iq80310.h: Fix size of PATUSR, SATUSR, PSR, and SSR regs. + Make all register pointers volatile. + + * src/diag/flash.c: First page of flash now remapped to 0xd0000000. + 2001-08-04 Mark Salter <msalter@redhat.com> * include/hal_platform_setup.h: Fix mapping so first MB of SDRAM has
--- a/packages/hal/arm/iq80310/current/include/hal_iq80310.h +++ b/packages/hal/arm/iq80310/current/include/hal_iq80310.h @@ -481,19 +481,19 @@ /* Reserved 0x0000183C through 0x000018FF */ -#define X6ISR_REG ((cyg_uint32 *)X6ISR_ADDR) +#define X6ISR_REG ((volatile cyg_uint32 *)X6ISR_ADDR) # define X6ISR_DIP0 0x01 # define X6ISR_DIP1 0x02 # define X6ISR_DIP2 0x04 # define X6ISR_EMIP 0x10 # define X6ISR_AAIP 0x20 -#define X7ISR_REG ((cyg_uint32 *)X7ISR_ADDR) +#define X7ISR_REG ((volatile cyg_uint32 *)X7ISR_ADDR) # define X7ISR_ISQC 0x02 # define X7ISR_INDB 0x04 # define X7ISR_BIST 0x08 -#define NISR_REG ((cyg_uint32 *)NISR_ADDR) +#define NISR_REG ((volatile cyg_uint32 *)NISR_ADDR) # define NISR_MCU 0x01 # define NISR_PATU 0x02 # define NISR_SATU 0x04 @@ -506,46 +506,45 @@ # define NISR_AAU 0x400 # define NISR_BIU 0x800 -#define PIRSR_REG ((cyg_uint32 *)PIRSR_ADDR) -#define IISR_REG ((cyg_uint32 *)IISR_ADDR) -#define IIMR_REG ((cyg_uint32 *)IIMR_ADDR) -#define OISR_REG ((cyg_uint32 *)OISR_ADDR) -#define OIMR_REG ((cyg_uint32 *)OIMR_ADDR) -#define EMISR_REG ((cyg_uint32 *)EMISR_ADDR) -#define ISR_REG ((cyg_uint32 *)ISR_ADDR) -#define GTMR_REG ((cyg_uint32 *)GTMR_ADDR) -#define ESR_REG ((cyg_uint32 *)ESR_ADDR) -#define ADCR_REG ((cyg_uint32 *)ADCR_ADDR) -#define ICR_REG ((cyg_uint32 *)ICR_ADDR) -#define ATUCR_REG ((cyg_uint32 *)ATUCR_ADDR) +#define PIRSR_REG ((volatile cyg_uint32 *)PIRSR_ADDR) +#define IISR_REG ((volatile cyg_uint32 *)IISR_ADDR) +#define IIMR_REG ((volatile cyg_uint32 *)IIMR_ADDR) +#define OISR_REG ((volatile cyg_uint32 *)OISR_ADDR) +#define OIMR_REG ((volatile cyg_uint32 *)OIMR_ADDR) +#define EMISR_REG ((volatile cyg_uint32 *)EMISR_ADDR) +#define ISR_REG ((volatile cyg_uint32 *)ISR_ADDR) +#define GTMR_REG ((volatile cyg_uint32 *)GTMR_ADDR) +#define ESR_REG ((volatile cyg_uint32 *)ESR_ADDR) +#define ADCR_REG ((volatile cyg_uint32 *)ADCR_ADDR) +#define ICR_REG ((volatile cyg_uint32 *)ICR_ADDR) +#define ATUCR_REG ((volatile cyg_uint32 *)ATUCR_ADDR) -#define DCR0_REG ((cyg_uint32 *)DCR0_ADDR) -#define DCR1_REG ((cyg_uint32 *)DCR1_ADDR) -#define DCR2_REG ((cyg_uint32 *)DCR2_ADDR) +#define DCR0_REG ((volatile cyg_uint32 *)DCR0_ADDR) +#define DCR1_REG ((volatile cyg_uint32 *)DCR1_ADDR) +#define DCR2_REG ((volatile cyg_uint32 *)DCR2_ADDR) -#define ECCR_REG ((cyg_uint32 *)ECCR_ADDR) -#define MCISR_REG ((cyg_uint32 *)MCISR_ADDR) -#define ELOG0_REG ((cyg_uint32 *)ELOG0_ADDR) -#define ELOG1_REG ((cyg_uint32 *)ELOG1_ADDR) -#define ECAR0_REG ((cyg_uint32 *)ECAR0_ADDR) -#define ECAR1_REG ((cyg_uint32 *)ECAR1_ADDR) +#define ECCR_REG ((volatile cyg_uint32 *)ECCR_ADDR) +#define MCISR_REG ((volatile cyg_uint32 *)MCISR_ADDR) +#define ELOG0_REG ((volatile cyg_uint32 *)ELOG0_ADDR) +#define ELOG1_REG ((volatile cyg_uint32 *)ELOG1_ADDR) +#define ECAR0_REG ((volatile cyg_uint32 *)ECAR0_ADDR) +#define ECAR1_REG ((volatile cyg_uint32 *)ECAR1_ADDR) -#define PATUISR_REG ((cyg_uint32 *)PATUISR_ADDR) -#define SATUISR_REG ((cyg_uint32 *)SATUISR_ADDR) -#define PBISR_REG ((cyg_uint32 *)PBISR_ADDR) -#define SBISR_REG ((cyg_uint32 *)SBISR_ADDR) -#define CSR0_REG ((cyg_uint32 *)CSR0_ADDR) -#define CSR1_REG ((cyg_uint32 *)CSR1_ADDR) -#define CSR2_REG ((cyg_uint32 *)CSR2_ADDR) -#define IISR_REG ((cyg_uint32 *)IISR_ADDR) -#define ASR_REG ((cyg_uint32 *)ASR_ADDR) -#define BIUISR_REG ((cyg_uint32 *)BIUISR_ADDR) +#define PATUISR_REG ((volatile cyg_uint32 *)PATUISR_ADDR) +#define SATUISR_REG ((volatile cyg_uint32 *)SATUISR_ADDR) +#define PBISR_REG ((volatile cyg_uint32 *)PBISR_ADDR) +#define SBISR_REG ((volatile cyg_uint32 *)SBISR_ADDR) +#define CSR0_REG ((volatile cyg_uint32 *)CSR0_ADDR) +#define CSR1_REG ((volatile cyg_uint32 *)CSR1_ADDR) +#define CSR2_REG ((volatile cyg_uint32 *)CSR2_ADDR) +#define IISR_REG ((volatile cyg_uint32 *)IISR_ADDR) +#define ASR_REG ((volatile cyg_uint32 *)ASR_ADDR) +#define BIUISR_REG ((volatile cyg_uint32 *)BIUISR_ADDR) -#define PATUSR_REG ((cyg_uint32 *)PATUSR_ADDR) -#define SATUSR_REG ((cyg_uint32 *)SATUSR_ADDR) -#define PSR_REG ((cyg_uint32 *)PSR_ADDR) -#define SSR_REG ((cyg_uint32 *)SSR_ADDR) - +#define PATUSR_REG ((volatile cyg_uint16 *)PATUSR_ADDR) +#define SATUSR_REG ((volatile cyg_uint16 *)SATUSR_ADDR) +#define PSR_REG ((volatile cyg_uint16 *)PSR_ADDR) +#define SSR_REG ((volatile cyg_uint16 *)SSR_ADDR) #define MEMBASE_DRAM 0xa0000000
--- a/packages/hal/arm/iq80310/current/src/diag/flash.c +++ b/packages/hal/arm/iq80310/current/src/diag/flash.c @@ -115,9 +115,9 @@ typedef unsigned char FLASH_TYPE; #define BLOCK_UNLOCKED 0 // First 4K page of flash at physical address zero is -// virtually mapped at address 0xa0000000. +// virtually mapped at address 0xd0000000. #define FLASH_P2V(x) ((volatile FLASH_TYPE *)(((unsigned)(x) < 0x1000) ? \ - ((unsigned)(x) | 0xa0000000) : \ + ((unsigned)(x) | 0xd0000000) : \ (unsigned)(x)))
--- a/packages/hal/arm/sa11x0/brutus/current/ChangeLog +++ b/packages/hal/arm/sa11x0/brutus/current/ChangeLog @@ -1,3 +1,10 @@ +2001-08-15 Gary Thomas <gthomas@redhat.com> + + * include/plf_mmap.h (HAL_VIRT_TO_PHYS_ADDRESS): + (HAL_PHYS_TO_VIRT_ADDRESS): + (HAL_VIRT_TO_UNCACHED_ADDRESS): Fix these macros - they didn't + handle the holes in DRAM properly. + 2001-03-08 Jesper Skov <jskov@redhat.com> * cdl/hal_arm_sa11x0_brutus.cdl: Removed
--- a/packages/hal/arm/sa11x0/brutus/current/include/plf_mmap.h +++ b/packages/hal/arm/sa11x0/brutus/current/include/plf_mmap.h @@ -77,11 +77,11 @@ CYG_MACRO_END if ( 4 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 0 from 0-4Mb */ \ _v_ += 0xc00u * SZ_1M; \ if ( 8 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 1 from 4-8Mb */ \ - _v_ += 0xc80u * SZ_1M; \ + _v_ += (0xc80u * SZ_1M) - (4 * SZ_1M); \ if ( 12 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 2 from 8-12Mb */ \ - _v_ += 0xd00u * SZ_1M; \ + _v_ += (0xd00u * SZ_1M) - (8 * SZ_1M); \ if ( 16 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 3 from 12-16M */ \ - _v_ += 0xd80u * SZ_1M; \ + _v_ += (0xd80u * SZ_1M) - (12 * SZ_1M); \ else if ( 0x400u * SZ_1M > _v_ ) /* Space between RAM and mapped ROM */\ /* no change */ ; \ else if ( 0x401u * SZ_1M > _v_ ) /* Mapped boot ROM size 1Mb */ \ @@ -107,15 +107,15 @@ CYG_MACRO_END else if ( 0xc80u * SZ_1M > _p_ ) /* Space between SDRAM banks */ \ /* no change */ ; \ else if ( 0xc84u * SZ_1M > _p_ ) /* Raw RAM bank 1, 4Mb at 0xc80 */ \ - _p_ -= 0xc80u * SZ_1M; \ + _p_ -= (0xc80u * SZ_1M) - (4 * SZ_1M); \ else if ( 0xd00u * SZ_1M > _p_ ) /* Space between SDRAM banks */ \ /* no change */ ; \ else if ( 0xd04u * SZ_1M > _p_ ) /* Raw RAM bank 2, 4Mb at 0xd00 */ \ - _p_ -= 0xd00u * SZ_1M; \ + _p_ -= (0xd00u * SZ_1M) - (8 * SZ_1M); \ else if ( 0xd80u * SZ_1M > _p_ ) /* Space between SDRAM banks */ \ /* no change */ ; \ else if ( 0xd84u * SZ_1M > _p_ ) /* Raw RAM bank 3, 4Mb at 0xd80 */ \ - _p_ -= 0xd80u * SZ_1M; \ + _p_ -= (0xd80u * SZ_1M) - (12 * SZ_1M); \ else /* Rest of it */ \ /* no change */ ; \ (vaddr) = _p_ ; \ @@ -132,11 +132,11 @@ CYG_MACRO_END if ( 4 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 0 from 0-4Mb */ \ _v_ += 0xc00u * SZ_1M; \ if ( 8 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 1 from 4-8Mb */ \ - _v_ += 0xc80u * SZ_1M; \ + _v_ += (0xc80u * SZ_1M) - (4 * SZ_1M); \ if ( 12 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 2 from 8-12Mb */ \ - _v_ += 0xd00u * SZ_1M; \ + _v_ += (0xd00u * SZ_1M) - (8 * SZ_1M); \ if ( 16 * SZ_1M > _v_ ) /* 4Mb of SDRAM Bank 3 from 12-16M */ \ - _v_ += 0xd80u * SZ_1M; \ + _v_ += (0xd80u * SZ_1M) - (12 * SZ_1M); \ else /* Everything else is already uncacheable or is ROM */ \ /* no change */ ; \ (uaddr) = _v_ ; \
--- a/packages/hal/common/current/ChangeLog +++ b/packages/hal/common/current/ChangeLog @@ -1,3 +1,34 @@ +2001-08-17 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/hal.cdl: Add CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT + interface. + +2001-08-16 Gary Thomas <gthomas@redhat.com> + + * cdl/hal.cdl: Add CDL options to control GDB protocol retries. + +2001-08-14 Gary Thomas <gthomas@redhat.com> + + * src/hal_if.c (cyg_hal_diag_mangler_gdb_putc): Use timeout + functions to allow for retries. This should improve the case + where [for whatever reason] the host GDB misses or ignores + a $O packet - it will get resent after a reasonable timeout. + +2001-08-03 Gary Thomas <gthomas@redhat.com> +2001-08-03 Jesper Skov <jskov@redhat.com> + + * include/hal_if.h: Use inline functions for calls - allowing + interrupts to be disabled while services are called + [CYGACC_COMM_IF_CONTROL is an exception since it's using variable + arguments - so it's still a macro]. + Pruned unused IF vectors: ICTRL_TABLE, EXC_TABLE, DBG_VECTOR, + CPU_DATA, BOARD_DATA, SYSINFO, SET_SERIAL_BAUD. + Note: this should fix bug CR 902745-CR. + + * cdl/hal.cdl: Removed CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL. + * src/hal_if.c (hal_if_init): Removed initialization of + ICTRL_TABLE, EXC_TABLE, CPU_DATA and BOARD_DATA entries. + 2001-08-03 Nick Garnett <nickg@redhat.com> Imported from a development branch:
--- a/packages/hal/common/current/cdl/debugging.cdl +++ b/packages/hal/common/current/cdl/debugging.cdl @@ -116,3 +116,21 @@ cdl_option CYGDBG_HAL_DEBUG_GDB_THREAD_S compile dbg-threads-syscall.c } + +cdl_option CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES { + display "Number of times to retry sending a \$O packet" + default_value 3 + description " + This option controls the number of attempts that eCos programs + will make to send a \$O packet to a host GDB process." +} + +cdl_option CYGNUM_HAL_DEBUG_GDB_PROTOCOL_TIMEOUT { + display "Timeout period for GDB packets" + default_value 500 + description " + This option controls the time (in milliseconds) that eCos programs + will wait for a response when sending packets to a host GDB process. + If this time elapses, then the packet will be resent, up to some + maximum number of times (CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES)." +}
--- a/packages/hal/common/current/cdl/hal.cdl +++ b/packages/hal/common/current/cdl/hal.cdl @@ -183,6 +183,14 @@ cdl_package CYGPKG_HAL { services." } + cdl_interface CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT { + display "Target supports baud rate control via vectors" + no_define + description " + Whether this target supports the __COMMCTL_GETBAUD + and __COMMCTL_SETBAUD virtual vector comm control operations." + } + cdl_component CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT { display "Enable use of virtual vector calling interface" active_if CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT @@ -231,7 +239,6 @@ cdl_package CYGPKG_HAL { cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE { display "Initialize whole of virtual vector table" default_value { CYG_HAL_STARTUP != "RAM" || !CYGSEM_HAL_USE_ROM_MONITOR || CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_NOT_GUARANTEED } - requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHE @@ -286,17 +293,6 @@ cdl_package CYGPKG_HAL { will be used)." } - cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL { - display "Claim ictrl/exc virtual vectors" - default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ - || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } - description " - This option will cause the ictrl/exc virtual - vectors to be claimed. These are pointers to - the HAL interrupt handlers table and the HAL VSR - table." - } - cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET { display "Claim reset virtual vectors" default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ @@ -330,8 +326,8 @@ cdl_package CYGPKG_HAL { || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } description " This option will cause the data virtual vectors - to be claimed. These are (unused at present) - pointers to CPU, board and debug information." + to be claimed. At present there is only one, used + by the RedBoot ethernet driver to share diag output." } cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS {
--- a/packages/hal/common/current/include/hal_if.h +++ b/packages/hal/common/current/include/hal_if.h @@ -58,6 +58,24 @@ // Architecture/var/platform may override the accessor macros. #include <cyg/hal/hal_arch.h> +// Special monitor locking procedures. These are necessary when the monitor +// and eCos share facilities, e.g. the network hardware. +#ifdef CYGPKG_NET +#include <cyg/hal/hal_intr.h> +#include <cyg/hal/drv_api.h> // cyg_drv_dsr_lock(), etc +#define _ENTER_MONITOR() \ + cyg_uint32 ints; \ + HAL_DISABLE_INTERRUPTS(ints); \ + cyg_drv_dsr_lock() + +#define _EXIT_MONITOR() \ + cyg_drv_dsr_unlock(); \ + HAL_RESTORE_INTERRUPTS(ints) +#else // !CYGPKG_NET +#define _ENTER_MONITOR() CYG_EMPTY_STATEMENT +#define _EXIT_MONITOR() CYG_EMPTY_STATEMENT +#endif + //-------------------------------------------------------------------------- #ifndef _BSP_HANDLER_T_DEFINED #define _BSP_HANDLER_T_DEFINED @@ -158,44 +176,146 @@ typedef int (*__comm_if_dbg_isr_t)(void CYG_ADDRWORD __data); typedef cyg_bool (*__comm_if_getc_timeout_t)(void* __ch_data, cyg_uint8* __ch); +#define __call_COMM0(_n_,_rt_,_t_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t) \ +{ \ + _rt_ res; \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidCOMM(_n_,_rt_,_t_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t) \ +{ \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + ((_t_)(t[CYGNUM_COMM_##_n_]))(dp); \ + _EXIT_MONITOR(); \ +} + +#define __call_COMM1(_n_,_rt_,_t_,_t1_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_) \ +{ \ + _rt_ res; \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidCOMM1(_n_,_rt_,_t_,_t1_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_) \ +{ \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_); \ + _EXIT_MONITOR(); \ +} + +#define __call_COMM2(_n_,_rt_,_t_,_t1_,_t2_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_) \ +{ \ + _rt_ res; \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidCOMM2(_n_,_rt_,_t_,_t1_,_t2_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_) \ +{ \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_); \ + _EXIT_MONITOR(); \ +} + +#define __call_COMM3(_n_,_rt_,_t_,_t1_,_t2_,_t3_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_, _t3_ _p3_) \ +{ \ + _rt_ res; \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + res = ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_, _p3_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidCOMM3(_n_,_rt_,_t_,_t1_,_t2_,_t3_) \ +static __inline__ _rt_ \ +__call_COMM_##_n_(hal_virtual_comm_table_t t, _t1_ _p1_, _t2_ _p2_, _t3_ _p3_) \ +{ \ + void *dp = (__comm_if_ch_data_t)t[CYGNUM_COMM_IF_CH_DATA]; \ + _ENTER_MONITOR(); \ + ((_t_)(t[CYGNUM_COMM_##_n_]))(dp, _p1_, _p2_, _p3_); \ + _EXIT_MONITOR(); \ +} + #ifndef CYGACC_COMM_IF_DEFINED + #define CYGACC_COMM_IF_CH_DATA(_t_) \ ((__comm_if_ch_data_t)((_t_)[CYGNUM_COMM_IF_CH_DATA])) #define CYGACC_COMM_IF_CH_DATA_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_CH_DATA]=(CYG_ADDRWORD)(_x_) +__call_voidCOMM2(IF_WRITE, void, __comm_if_write_t, const cyg_uint8 *, cyg_uint32) #define CYGACC_COMM_IF_WRITE(_t_, _b_, _l_) \ - ((__comm_if_write_t)((_t_)[CYGNUM_COMM_IF_WRITE]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) + __call_COMM_IF_WRITE(_t_, _b_, _l_) #define CYGACC_COMM_IF_WRITE_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_WRITE]=(CYG_ADDRWORD)(_x_) +__call_voidCOMM2(IF_READ, void, __comm_if_read_t, cyg_uint8 *, cyg_uint32) #define CYGACC_COMM_IF_READ(_t_, _b_, _l_) \ - ((__comm_if_read_t)((_t_)[CYGNUM_COMM_IF_READ]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) + __call_COMM_IF_READ(_t_, _b_, _l_) #define CYGACC_COMM_IF_READ_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_READ]=(CYG_ADDRWORD)(_x_) +__call_voidCOMM1(IF_PUTC, void, __comm_if_putc_t, cyg_uint8) #define CYGACC_COMM_IF_PUTC(_t_, _c_) \ - ((__comm_if_putc_t)((_t_)[CYGNUM_COMM_IF_PUTC]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) + __call_COMM_IF_PUTC(_t_,_c_) #define CYGACC_COMM_IF_PUTC_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_PUTC]=(CYG_ADDRWORD)(_x_) +__call_COMM0(IF_GETC, cyg_uint8, __comm_if_getc_t) #define CYGACC_COMM_IF_GETC(_t_) \ - ((__comm_if_getc_t)((_t_)[CYGNUM_COMM_IF_GETC]))(CYGACC_COMM_IF_CH_DATA(_t_)) + __call_COMM_IF_GETC(_t_) #define CYGACC_COMM_IF_GETC_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_GETC]=(CYG_ADDRWORD)(_x_) -#define CYGACC_COMM_IF_CONTROL(_t_, args...) \ - ((__comm_if_control_t)((_t_)[CYGNUM_COMM_IF_CONTROL]))(CYGACC_COMM_IF_CH_DATA(_t_), args) +// This macro has not been changed to use inline functions like the +// others, simply because it uses variable arguments, and the change +// would break binary compatibility. +#define CYGACC_COMM_IF_CONTROL(_t_, args...) \ + ({ int res; \ + _ENTER_MONITOR(); \ + res = ((__comm_if_control_t)((_t_)[CYGNUM_COMM_IF_CONTROL]))(CYGACC_COMM_IF_CH_DATA(_t_), args); \ + _EXIT_MONITOR(); \ + res;}) #define CYGACC_COMM_IF_CONTROL_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_CONTROL]=(CYG_ADDRWORD)(_x_) +__call_COMM3(IF_DBG_ISR, int, __comm_if_dbg_isr_t, int *, CYG_ADDRWORD, CYG_ADDRWORD) #define CYGACC_COMM_IF_DBG_ISR(_t_, _c_, _v_, _d_) \ - ((__comm_if_dbg_isr_t)((_t_)[CYGNUM_COMM_IF_DBG_ISR]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_), (_v_), (_d_)) + __call_COMM_IF_DBG_ISR(_t_, _c_, _v_, _d_) #define CYGACC_COMM_IF_DBG_ISR_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_DBG_ISR]=(CYG_ADDRWORD)(_x_) +__call_COMM1(IF_GETC_TIMEOUT, cyg_bool, __comm_if_getc_timeout_t, cyg_uint8 *) #define CYGACC_COMM_IF_GETC_TIMEOUT(_t_, _c_) \ - ((__comm_if_getc_timeout_t)((_t_)[CYGNUM_COMM_IF_GETC_TIMEOUT]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) + __call_COMM_IF_GETC_TIMEOUT(_t_, _c_) #define CYGACC_COMM_IF_GETC_TIMEOUT_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_GETC_TIMEOUT]=(CYG_ADDRWORD)(_x_) @@ -206,20 +326,20 @@ typedef cyg_bool (*__comm_if_getc_timeou // linker script. Both ROM and RAM startup applications will know about // the location. #define CYGNUM_CALL_IF_VERSION 0 -#define CYGNUM_CALL_IF_ICTRL_TABLE 1 -#define CYGNUM_CALL_IF_EXC_TABLE 2 -#define CYGNUM_CALL_IF_DBG_VECTOR 3 +#define CYGNUM_CALL_IF_available_1 1 +#define CYGNUM_CALL_IF_available_2 2 +#define CYGNUM_CALL_IF_available_3 3 #define CYGNUM_CALL_IF_KILL_VECTOR 4 #define CYGNUM_CALL_IF_CONSOLE_PROCS 5 #define CYGNUM_CALL_IF_DEBUG_PROCS 6 #define CYGNUM_CALL_IF_FLUSH_DCACHE 7 #define CYGNUM_CALL_IF_FLUSH_ICACHE 8 -#define CYGNUM_CALL_IF_CPU_DATA 9 -#define CYGNUM_CALL_IF_BOARD_DATA 10 -#define CYGNUM_CALL_IF_SYSINFO 11 +#define CYGNUM_CALL_IF_available_9 9 +#define CYGNUM_CALL_IF_available_10 10 +#define CYGNUM_CALL_IF_available_11 11 #define CYGNUM_CALL_IF_SET_DEBUG_COMM 12 #define CYGNUM_CALL_IF_SET_CONSOLE_COMM 13 -#define CYGNUM_CALL_IF_SET_SERIAL_BAUD 14 +#define CYGNUM_CALL_IF_available_14 14 #define CYGNUM_CALL_IF_DBG_SYSCALL 15 #define CYGNUM_CALL_IF_RESET 16 #define CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG 17 @@ -273,13 +393,8 @@ typedef hal_virtual_comm_table_t *__call typedef hal_virtual_comm_table_t *__call_if_debug_procs_t; typedef void (__call_if_flush_dcache_t)(void *__p, int __nbytes); typedef void (__call_if_flush_icache_t)(void *__p, int __nbytes); -typedef void* __call_if_cpu_data_t; -typedef void* __call_if_board_data_t; -typedef int (__call_if_sysinfo_t)(int __id, void* __ap); -//typedef int (__call_if_sysinfo_t)(enum bsp_info_id __id, va_list __ap); typedef int (__call_if_set_debug_comm_t)(int __comm_id); typedef int (__call_if_set_console_comm_t)(int __comm_id); -typedef int (__call_if_set_serial_baud_t)(int __comm_id, int __baud); typedef void* __call_if_dbg_data_t; typedef int (__call_if_dbg_syscall_t) (enum dbg_syscall_ids id, union dbg_thread_syscall_parms *p ); @@ -292,41 +407,119 @@ typedef cyg_bool (__call_if_flash_cfg_op #ifndef CYGACC_CALL_IF_DEFINED +#define __data_VV(_n_,_tt_) \ +static __inline__ _tt_ \ +__call_vv_##_n_(void) \ +{ \ + return ((_tt_)hal_virtual_vector_table[_n_]); \ +} + +#define __call_VV0(_n_,_tt_,_rt_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(void) \ +{ \ + _rt_ res; \ + _ENTER_MONITOR(); \ + res = ((_tt_ *)hal_virtual_vector_table[_n_])(); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidVV0(_n_,_tt_,_rt_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(void) \ +{ \ + _ENTER_MONITOR(); \ + ((_tt_ *)hal_virtual_vector_table[_n_])(); \ + _EXIT_MONITOR(); \ +} + +#define __call_VV1(_n_,_tt_,_rt_,_t1_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_) \ +{ \ + _rt_ res; \ + _ENTER_MONITOR(); \ + res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidVV1(_n_,_tt_,_rt_,_t1_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_) \ +{ \ + _ENTER_MONITOR(); \ + ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_); \ + _EXIT_MONITOR(); \ +} + +#define __call_VV2(_n_,_tt_,_rt_,_t1_,_t2_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_) \ +{ \ + _rt_ res; \ + _ENTER_MONITOR(); \ + res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidVV2(_n_,_tt_,_rt_,_t1_,_t2_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_) \ +{ \ + _ENTER_MONITOR(); \ + ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_); \ + _EXIT_MONITOR(); \ +} + +#define __call_VV4(_n_,_tt_,_rt_,_t1_,_t2_,_t3_,_t4_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_, _t3_ _p3_, _t4_ _p4_) \ +{ \ + _rt_ res; \ + _ENTER_MONITOR(); \ + res = ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_,_p3_,_p4_); \ + _EXIT_MONITOR(); \ + return res; \ +} + +#define __call_voidVV4(_n_,_tt_,_rt_,_t1_,_t2_,_t3_,_t4_) \ +static __inline__ _rt_ \ +__call_vv_##_n_(_t1_ _p1_, _t2_ _p2_, _t3_ _p3_, _t4_ _p4_) \ +{ \ + _ENTER_MONITOR(); \ + ((_tt_ *)hal_virtual_vector_table[_n_])(_p1_,_p2_,_p3_,_p4_); \ + _EXIT_MONITOR(); \ +} + + +#define CYGACC_DATA_VV(t,e) __call_vv_##e() +#define CYGACC_CALL_VV0(t,e) __call_vv_##e +#define CYGACC_CALL_VV1(t,e,p1) __call_vv_##e((p1)) +#define CYGACC_CALL_VV2(t,e,p1,p2) __call_vv_##e((p1),(p2)) +#define CYGACC_CALL_VV3(t,e,p1,p2,p3) __call_vv_##e((p1),(p2),(p3)) +#define CYGACC_CALL_VV4(t,e,p1,p2,p3,p4) __call_vv_##e((p1),(p2),(p3),(p4)) + #define CYGACC_CALL_IF_VERSION() \ - ((__call_if_version_t)hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]) + CYGACC_DATA_VV(__call_if_version_t, CYGNUM_CALL_IF_VERSION) +__data_VV(CYGNUM_CALL_IF_VERSION, __call_if_version_t) #define CYGACC_CALL_IF_VERSION_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]=(CYG_ADDRWORD)(_x_) -#define CYGACC_CALL_IF_ICTRL_TABLE() \ - ((__call_if_ictrl_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE]) -#define CYGACC_CALL_IF_ICTRL_TABLE_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE]=(CYG_ADDRWORD)(_x_) - -#define CYGACC_CALL_IF_EXC_TABLE() \ - ((__call_if_exc_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE]) -#define CYGACC_CALL_IF_EXC_TABLE_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE]=(CYG_ADDRWORD)(_x_) - -#define CYGACC_CALL_IF_DBG_VECTOR() \ - ((__call_if_dbg_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR]) -#define CYGACC_CALL_IF_DBG_VECTOR_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR]=(CYG_ADDRWORD)(_x_) - #define CYGACC_CALL_IF_KILL_VECTOR() \ - ((__call_if_kill_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]) + CYGACC_DATA_VV(__call_if_kill_vector_t, CYGNUM_CALL_IF_KILL_VECTOR) +__data_VV(CYGNUM_CALL_IF_KILL_VECTOR, __call_if_kill_vector_t) #define CYGACC_CALL_IF_KILL_VECTOR_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_CONSOLE_PROCS() \ - ((__call_if_console_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]) + CYGACC_DATA_VV(__call_if_console_procs_t, CYGNUM_CALL_IF_CONSOLE_PROCS) +__data_VV(CYGNUM_CALL_IF_CONSOLE_PROCS, __call_if_console_procs_t) #define CYGACC_CALL_IF_CONSOLE_PROCS_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]=(CYG_ADDRWORD)(_x_) -#define CYGACC_CALL_IF_DEBUG_PROCS() \ - ((__call_if_debug_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]) -#define CYGACC_CALL_IF_DEBUG_PROCS_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]=(CYG_ADDRWORD)(_x_) - #define CYGACC_CALL_IF_FLUSH_DCACHE(_p_, _n_) \ ((__call_if_flush_dcache_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE])((_p_), (_n_)) #define CYGACC_CALL_IF_FLUSH_DCACHE_SET(_x_) \ @@ -337,70 +530,64 @@ typedef cyg_bool (__call_if_flash_cfg_op #define CYGACC_CALL_IF_FLUSH_ICACHE_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE]=(CYG_ADDRWORD)(_x_) -#define CYGACC_CALL_IF_CPU_DATA() \ - ((__call_if_cpu_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA]) -#define CYGACC_CALL_IF_CPU_DATA_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA]=(CYG_ADDRWORD)(_x_) - -#define CYGACC_CALL_IF_BOARD_DATA() \ - ((__call_if_board_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA]) -#define CYGACC_CALL_IF_BOARD_DATA_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA]=(CYG_ADDRWORD)(_x_) - -#define CYGACC_CALL_IF_SYSINFO(_i_, _a_) \ - ((__call_if_sysinfo_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO])((_i_), (_a_)) -#define CYGACC_CALL_IF_SYSINFO_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO]=(CYG_ADDRWORD)(_x_) +#define CYGACC_CALL_IF_DEBUG_PROCS() \ + CYGACC_DATA_VV(__call_if_debug_procs_t, CYGNUM_CALL_IF_DEBUG_PROCS) +__data_VV(CYGNUM_CALL_IF_DEBUG_PROCS, __call_if_debug_procs_t) +#define CYGACC_CALL_IF_DEBUG_PROCS_SET(_x_) \ + hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_SET_DEBUG_COMM(_i_) \ - ((__call_if_set_debug_comm_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM])((_i_)) + CYGACC_CALL_VV1(__call_if_set_debug_comm_t*, CYGNUM_CALL_IF_SET_DEBUG_COMM, (_i_)) +__call_VV1(CYGNUM_CALL_IF_SET_DEBUG_COMM, __call_if_set_debug_comm_t, int, int) #define CYGACC_CALL_IF_SET_DEBUG_COMM_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_SET_CONSOLE_COMM(_i_) \ - ((__call_if_set_console_comm_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM])((_i_)) + CYGACC_CALL_VV1(__call_if_set_console_comm_t*, CYGNUM_CALL_IF_SET_CONSOLE_COMM, (_i_)) +__call_VV1(CYGNUM_CALL_IF_SET_CONSOLE_COMM, __call_if_set_console_comm_t, int, int) #define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRWORD)(_x_) -#define CYGACC_CALL_IF_SET_SERIAL_BAUD(_i_, _b_) \ - ((__call_if_set_serial_baud_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD])((_i_), (_b_)) -#define CYGACC_CALL_IF_SET_SERIAL_BAUD_SET(_x_) \ - hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD]=(CYG_ADDRWORD)(_x_) - #define CYGACC_CALL_IF_DBG_DATA() \ - ((__call_if_dbg_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]) + CYGACC_DATA_VV(__call_if_dbg_data_t, CYGNUM_CALL_IF_DBG_DATA) +__data_VV(CYGNUM_CALL_IF_DBG_DATA, __call_if_dbg_data_t) #define CYGACC_CALL_IF_DBG_DATA_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_DBG_SYSCALL() \ - ((__call_if_dbg_syscall_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]) + CYGACC_CALL_VV2(__call_if_dbg_syscall_t, CYGNUM_CALL_IF_DBG_SYSCALL) #define CYGACC_CALL_IF_DBG_SYSCALL_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_RESET() \ - ((__call_if_reset_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET])() + CYGACC_CALL_VV0(__call_if_reset_t*, CYGNUM_CALL_IF_RESET)() +__call_voidVV0(CYGNUM_CALL_IF_RESET, __call_if_reset_t, void) #define CYGACC_CALL_IF_RESET_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_RESET_GET() \ ((__call_if_reset_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]) #define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG() \ - ((__call_if_console_interrupt_flag_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]) + CYGACC_DATA_VV(__call_if_console_interrupt_flag_t, CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG) +__data_VV(CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG, __call_if_console_interrupt_flag_t) #define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_DELAY_US(_u_) \ - ((__call_if_delay_us_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_DELAY_US])((_u_)) + CYGACC_CALL_VV1(__call_if_delay_us_t*, CYGNUM_CALL_IF_DELAY_US, (_u_)) +__call_voidVV1(CYGNUM_CALL_IF_DELAY_US, __call_if_delay_us_t, void, cyg_int32) #define CYGACC_CALL_IF_DELAY_US_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DELAY_US]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_INSTALL_BPT_FN(_e_) \ - ((__call_if_install_bpt_fn_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN])((_e_)) + CYGACC_CALL_VV1(__call_if_install_bpt_fn_t*, CYGNUM_CALL_IF_INSTALL_BPT_FN, (_e_)) +__call_voidVV1(CYGNUM_CALL_IF_INSTALL_BPT_FN, __call_if_install_bpt_fn_t, void, void *) #define CYGACC_CALL_IF_INSTALL_BPT_FN_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN]=(CYG_ADDRWORD)(_x_) #define CYGACC_CALL_IF_FLASH_CFG_OP(_o_,_k_,_d_,_t_) \ - ((__call_if_flash_cfg_op_fn_t*)hal_virtual_vector_table[CYGNUM_CALL_IF_FLASH_CFG_OP])((_o_),(_k_),(_d_),(_t_)) + CYGACC_CALL_VV4(__call_if_flash_cfg_op_fn_t*, CYGNUM_CALL_IF_FLASH_CFG_OP, (_o_),(_k_),(_d_),(_t_)) +__call_VV4(CYGNUM_CALL_IF_FLASH_CFG_OP, __call_if_flash_cfg_op_fn_t, cyg_bool, int, char *, void *, int) #define CYGACC_CALL_IF_FLASH_CFG_OP_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_FLASH_CFG_OP]=(CYG_ADDRWORD)(_x_) #define CYGNUM_CALL_IF_FLASH_CFG_GET (0)
--- a/packages/hal/common/current/src/hal_if.c +++ b/packages/hal/common/current/src/hal_if.c @@ -386,12 +386,12 @@ cyg_hal_diag_mangler_gdb_getc(void* __ch return __ch; } - static void cyg_hal_diag_mangler_gdb_putc(void* __ch_data, cyg_uint8 c) { static char line[100]; static int pos = 0; + int tries = CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES; // No need to send CRs if( c == '\r' ) return; @@ -416,6 +416,9 @@ cyg_hal_diag_mangler_gdb_putc(void* __ch CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old); #endif + // Only wait 500ms for data to arrive - avoid "stuck" connections + CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_SET_TIMEOUT, CYGNUM_HAL_DEBUG_GDB_PROTOCOL_TIMEOUT); + while(1) { static const char hex[] = "0123456789ABCDEF"; @@ -440,7 +443,10 @@ cyg_hal_diag_mangler_gdb_putc(void* __ch CYGACC_COMM_IF_PUTC(*__chan, hex[csum&0xF]); nak: - c1 = CYGACC_COMM_IF_GETC(*__chan); + if (CYGACC_COMM_IF_GETC_TIMEOUT(*__chan, &c1) == 0) { + c1 = '-'; + if (--tries == 0) c1 = '+'; + } if( c1 == '+' ) break; @@ -653,7 +659,7 @@ void hal_if_diag_write_char(char c) { hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS(); - + if (__chan) CYGACC_COMM_IF_PUTC(*__chan, c); else { @@ -827,13 +833,6 @@ hal_if_init(void) } #endif -#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL - // ICTRL and EXC tables - I assume these to be the equivalents of - // ISR and VSR tables. - CYGACC_CALL_IF_ICTRL_TABLE_SET(hal_interrupt_handlers); - CYGACC_CALL_IF_EXC_TABLE_SET(hal_vsr_table); -#endif - // Miscellaneous services with wrappers in this file. #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET CYGACC_CALL_IF_RESET_SET(reset); @@ -855,8 +854,6 @@ hal_if_init(void) // Data entries not currently supported in eCos #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA - CYGACC_CALL_IF_CPU_DATA_SET(0); - CYGACC_CALL_IF_BOARD_DATA_SET(0); CYGACC_CALL_IF_DBG_DATA_SET(0); #endif
--- a/packages/hal/mn10300/stb/current/ChangeLog +++ b/packages/hal/mn10300/stb/current/ChangeLog @@ -1,3 +1,9 @@ +2001-08-15 David Howells <dhowells@redhat.com> + + * src/hal_diag.c: included hal_misc.h. + * src/plf_misc.c: included hal_misc.h and stopped declaring + hal_virtual_vector_table directly. + 2001-08-03 David Howells <dhowells@redhat.com> * cdl/hal_mn10300_am33_stb.cdl: added vector support and made to
--- a/packages/hal/mn10300/stb/current/src/hal_diag.c +++ b/packages/hal/mn10300/stb/current/src/hal_diag.c @@ -49,6 +49,7 @@ #include <cyg/hal/hal_diag.h> #include <cyg/hal/hal_intr.h> +#include <cyg/hal/hal_misc.h> /*---------------------------------------------------------------------------*/ /* Select default diag channel to use */
--- a/packages/hal/mn10300/stb/current/src/plf_misc.c +++ b/packages/hal/mn10300/stb/current/src/plf_misc.c @@ -55,6 +55,7 @@ #include <cyg/hal/hal_cache.h> // Cache handling #include <cyg/hal/hal_if.h> +#include <cyg/hal/hal_misc.h> #include <cyg/hal/plf_io.h> @@ -112,7 +113,6 @@ void hal_platform_init(void) defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && \ defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) { - extern CYG_ADDRESS hal_virtual_vector_table[32]; extern void patch_dbg_syscalls(void * vector); patch_dbg_syscalls( (void *)(&hal_virtual_vector_table[0]) ); }
--- a/packages/io/eth/current/ChangeLog +++ b/packages/io/eth/current/ChangeLog @@ -1,3 +1,27 @@ +2001-08-17 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/eth_drivers.cdl (CYGSEM_IO_ETH_DRIVERS_DEBUG): Now booldata. + * src/stand_along/eth_drv.c (eth_drv_tx_done): Use different + value of CYGSEM_IO_ETH_DRIVERS_DEBUG for verbosity. + +2001-08-14 Gary Thomas <gthomas@redhat.com> + + * src/stand_alone/eth_drv.c (eth_drv_write): + (eth_drv_tx_done): + (eth_drv_read): Better handling of stacking (layering) of drivers. + RedBoot (stand alone code) is designed to call into the eCos + stack and these changes make sure that this is done properly + nested/stacked. These changes also affect the behaviour positively + for CR 902745-CR. + + * src/net/eth_drv.c (eth_drv_send): Add locking of driver while + actual hardware routines are involved. Since the same driver + can be shared by both eCos and RedBoot, it is imperative that + additional locking (in the form of locking the scheduler) be + employed during this window to make sure that the hardware is + handled in complete, consistent steps. This helps with known + bug CR 902745-CR. + 2001-08-09 Hugo Tyson <hmt@redhat.com> * src/net/eth_drv.c (eth_drv_recv): Add a pair of
--- a/packages/io/eth/current/cdl/eth_drivers.cdl +++ b/packages/io/eth/current/cdl/eth_drivers.cdl @@ -155,8 +155,8 @@ cdl_package CYGPKG_IO_ETH_DRIVERS { cdl_option CYGSEM_IO_ETH_DRIVERS_DEBUG { display "Print driver debug information" - flavor bool - default_value { 0 != CYGPKG_REDBOOT } + flavor booldata + default_value { 0 != CYGPKG_REDBOOT ? 1 : 0} description " Selecting this option will enable the stand-alone driver to print lots of information. Useful only when getting a low-level hardware
--- a/packages/io/eth/current/src/net/eth_drv.c +++ b/packages/io/eth/current/src/net/eth_drv.c @@ -471,6 +471,27 @@ eth_drv_ioctl(struct ifnet *ifp, u_long } // +// Control whether any special locking needs to take place if we intend to +// cooperate with a ROM monitor (e.g. RedBoot) using this hardware. +// +#if defined(CYGSEM_HAL_USE_ROM_MONITOR) && \ + defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) && \ + !defined(CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS) + +// Indicate that special locking precautions are warranted. +#define _LOCK_WITH_ROM_MONITOR + +// This defines the [well known] channel that RedBoot will use when it is +// using the network hardware for the debug channel. +#define RedBoot_TCP_CHANNEL CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS + +// Define this if you ever need to call 'diag_printf()' from interrupt level +// code (ISR) and the debug channel might be using the network hardware. If +// this is not the case, then disabling interrupts here is over-kill. +//#define _LOCK_USING_INTERRUPTS +#endif + +// // This routine is called to start transmitting if there is data // available. // @@ -483,6 +504,13 @@ eth_drv_send(struct ifnet *ifp) struct mbuf *m0, *m; int len, total_len; unsigned char *data; +#ifdef _LOCK_WITH_ROM_MONITOR +#ifdef _LOCK_USING_INTERRUPTS + cyg_uint32 ints; +#endif + bool need_lock = false; + int debug_chan; +#endif // _LOCK_WITH_ROM_MONITOR // This is now only called from network threads, so no guarding is // required; locking is in place via the splfoo() mechanism already. @@ -540,10 +568,46 @@ eth_drv_send(struct ifnet *ifp) } } +#ifdef _LOCK_WITH_ROM_MONITOR + // Firm lock on this portion of the driver. Since we are about to + // start messing with the actual hardware, it is imperative that the + // current thread not loose control of the CPU at this time. Otherwise, + // the hardware could be left in an unusable state. This caution is + // only warranted if there is a possibility of some other thread trying + // to use the hardware simultaneously. The network stack would prevent + // this implicitly since all accesses are controlled by the "splX()" + // locks, but if there is a ROM monitor, such as RedBoot, also using + // the hardware, all bets are off. + + // Note: these operations can be avoided if it were well known that + // RedBoot was not using the network hardware for diagnostic I/O. This + // can be inferred by checking which I/O channel RedBoot is currently + // hooked to. + debug_chan = CYGACC_CALL_IF_SET_DEBUG_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + if (debug_chan == RedBoot_TCP_CHANNEL) { + need_lock = true; +#ifdef _LOCK_USING_INTERRUPTS + HAL_DISABLE_INTERRUPTS(ints); +#endif + cyg_drv_dsr_lock(); + } +#endif // _LOCK_WITH_ROM_MONITOR + // Tell hardware to send this packet if ( sg_len ) (sc->funs->send)(sc, sg_list, sg_len, total_len, (unsigned long)m0); + +#ifdef _LOCK_WITH_ROM_MONITOR + // Unlock the driver & hardware. It can once again be safely shared. + if (need_lock) { + cyg_drv_dsr_unlock(); +#ifdef _LOCK_USING_INTERRUPTS + HAL_RESTORE_INTERRUPTS(ints); +#endif + } } +#endif // _LOCK_WITH_ROM_MONITOR +#undef _LOCK_WITH_ROM_MONITOR } //
--- a/packages/io/eth/current/src/stand_alone/eth_drv.c +++ b/packages/io/eth/current/src/stand_alone/eth_drv.c @@ -212,16 +212,20 @@ eth_drv_write(char *eth_hdr, char *buf, void *dbg = CYGACC_CALL_IF_DBG_DATA(); int old_state; int wait_time = 5; // Timeout before giving up + void *eth_drv_old = 0; if (dbg) { sc = (struct eth_drv_sc *)dbg; // Use control from installed driver - sc->funs->eth_drv_old = sc->funs->eth_drv; - sc->funs->eth_drv = ð_drv_funs; // Substitute stand-alone driver - old_state = sc->state; - if (!old_state & ETH_DRV_STATE_ACTIVE) { - // This interface not fully initialized, do it now - (sc->funs->start)(sc, (unsigned char *)&__local_enet_addr, 0); - sc->state |= ETH_DRV_STATE_ACTIVE; + eth_drv_old = sc->funs->eth_drv_old; + if (eth_drv_old == 0) { + sc->funs->eth_drv_old = sc->funs->eth_drv; + sc->funs->eth_drv = ð_drv_funs; // Substitute stand-alone driver + old_state = sc->state; + if (!old_state & ETH_DRV_STATE_ACTIVE) { + // This interface not fully initialized, do it now + (sc->funs->start)(sc, (unsigned char *)&__local_enet_addr, 0); + sc->state |= ETH_DRV_STATE_ACTIVE; + } } } @@ -248,6 +252,7 @@ eth_drv_write(char *eth_hdr, char *buf, end_console(old_console); } #endif + (sc->funs->send)(sc, sg_list, sg_len, len+14, (CYG_ADDRWORD)&packet_sent); wait_time = 500; @@ -267,8 +272,10 @@ eth_drv_write(char *eth_hdr, char *buf, // // This interface was not fully initialized, shut it back down // (sc->funs->stop)(sc); // } - sc->funs->eth_drv = sc->funs->eth_drv_old; - sc->funs->eth_drv_old = (struct eth_drv_funs *)0; + if (eth_drv_old == 0) { + sc->funs->eth_drv = sc->funs->eth_drv_old; + sc->funs->eth_drv_old = (struct eth_drv_funs *)0; + } } } @@ -285,7 +292,8 @@ eth_drv_tx_done(struct eth_drv_sc *sc, C } else { // It's possible that this acknowledgement is for a different // [logical] driver. Try and pass it on. -#ifdef CYGSEM_IO_ETH_DRIVERS_DEBUG +#if defined(CYGSEM_IO_ETH_DRIVERS_DEBUG) && (CYGSEM_IO_ETH_DRIVERS_DEBUG>=2) + // Note: not normally enabled - too verbose if (net_debug) { int old_console; old_console = start_console(); @@ -293,7 +301,11 @@ eth_drv_tx_done(struct eth_drv_sc *sc, C end_console(old_console); } #endif - (sc->funs->eth_drv_old->tx_done)(sc, key, status); + if (sc->funs->eth_drv_old) { + (sc->funs->eth_drv_old->tx_done)(sc, key, status); + } else { + (sc->funs->eth_drv->tx_done)(sc, key, status); + } } CYGARC_HAL_RESTORE_GP(); } @@ -309,16 +321,20 @@ eth_drv_read(char *eth_hdr, char *buf, i int res; void *dbg = CYGACC_CALL_IF_DBG_DATA(); int old_state; + void *eth_drv_old = 0; if (dbg) { sc = (struct eth_drv_sc *)dbg; // Use control from installed driver - sc->funs->eth_drv_old = sc->funs->eth_drv; - sc->funs->eth_drv = ð_drv_funs; // Substitute stand-alone driver - old_state = sc->state; - if (!old_state & ETH_DRV_STATE_ACTIVE) { - // This interface not fully initialized, do it now - (sc->funs->start)(sc, (unsigned char *)&__local_enet_addr, 0); - sc->state |= ETH_DRV_STATE_ACTIVE; + eth_drv_old = sc->funs->eth_drv_old; + if (eth_drv_old == 0) { + sc->funs->eth_drv_old = sc->funs->eth_drv; + sc->funs->eth_drv = ð_drv_funs; // Substitute stand-alone driver + old_state = sc->state; + if (!old_state & ETH_DRV_STATE_ACTIVE) { + // This interface not fully initialized, do it now + (sc->funs->start)(sc, (unsigned char *)&__local_enet_addr, 0); + sc->state |= ETH_DRV_STATE_ACTIVE; + } } } (sc->funs->poll)(sc); // Give the driver a chance to fetch packets @@ -333,8 +349,10 @@ eth_drv_read(char *eth_hdr, char *buf, i } if (dbg) { - sc->funs->eth_drv = sc->funs->eth_drv_old; - sc->funs->eth_drv_old = (struct eth_drv_funs *)0; + if (eth_drv_old == 0) { + sc->funs->eth_drv = sc->funs->eth_drv_old; + sc->funs->eth_drv_old = (struct eth_drv_funs *)0; + } // if (!old_state & ETH_DRV_STATE_ACTIVE) { // // This interface was not fully initialized, shut it back down // (sc->funs->stop)(sc);
--- a/packages/io/serial/current/ChangeLog +++ b/packages/io/serial/current/ChangeLog @@ -1,3 +1,8 @@ +2001-08-15 Gary Thomas <gthomas@redhat.com> + + * tests/ser_test_protocol.inl: Change NONE in 'cyg_verbosity_level_t' + to be _NONE [unused] to avoid name clash with <kernel/kapi.h>. + 2000-12-08 Jonathan Larmour <jlarmour@redhat.com> * src/common/serial.c: Fix CYGOPT_IO_SERIAL_FLOW_CONTROL_HW ->
--- a/packages/io/serial/current/tests/ser_test_protocol.inl +++ b/packages/io/serial/current/tests/ser_test_protocol.inl @@ -210,7 +210,7 @@ typedef enum { } cyg_option_t; typedef enum { - NONE = 0, + _NONE = 0, PROTOCOL_PROGRESS, PROTOCOL_DATA, } cyg_verbosity_level_t;
--- a/packages/kernel/current/ChangeLog +++ b/packages/kernel/current/ChangeLog @@ -1,3 +1,21 @@ +2001-08-17 Nick Garnett <nickg@redhat.com> + + * src/sched/mlqueue.cxx (timeslice): Fix timeslice_count comparison. + +2001-08-16 Hugo Tyson <hmt@redhat.com> + + * include/kapi.h (cyg_mutex_protocol): Tidy up names of mutex + protocol type and values. These polluted rather in 'C'. + + * src/common/kapi.cxx (cyg_mutex_set_protocol): ditto. + +2001-08-15 Hugo Tyson <hmt@redhat.com> +2001-08-15 Andrew Lunn <andrew.lunn@ascom.ch> + + * src/common/kapi.c (cyg_thread_get_current_priority): Export + this function into the C api. + * include/kapi.h: Declaration of new function. + 2001-08-14 Jonathan Larmour <jlarmour@redhat.com> * src/common/kapi.cxx (cyg_spinlock_spin_intsave): Cast to istate
--- a/packages/kernel/current/include/kapi.h +++ b/packages/kernel/current/include/kapi.h @@ -174,6 +174,7 @@ cyg_handle_t cyg_thread_idle_thread(void void cyg_thread_set_priority(cyg_handle_t thread, cyg_priority_t priority ); cyg_priority_t cyg_thread_get_priority(cyg_handle_t thread); +cyg_priority_t cyg_thread_get_current_priority(cyg_handle_t thread); /* Deadline scheduling control (optional) */ @@ -521,11 +522,11 @@ cyg_bool_t cyg_flag_waiting( cyg_flag_t /* Mutex */ #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC -enum cyg_protcol +enum cyg_mutex_protocol { - NONE = 0, // no inversion protocol - INHERIT, // priority inheritance protocol - CEILING // priority ceiling protocol + CYG_MUTEX_NONE = 0, // no inversion protocol + CYG_MUTEX_INHERIT, // priority inheritance protocol + CYG_MUTEX_CEILING // priority ceiling protocol }; #endif @@ -548,7 +549,7 @@ void cyg_mutex_set_ceiling( cyg_mutex_t #endif #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC -void cyg_mutex_set_protocol ( cyg_mutex_t *mutex, enum cyg_protcol protocol ); +void cyg_mutex_set_protocol ( cyg_mutex_t *mutex, enum cyg_mutex_protocol protocol ); #endif /*---------------------------------------------------------------------------*/
--- a/packages/kernel/current/src/common/kapi.cxx +++ b/packages/kernel/current/src/common/kapi.cxx @@ -241,6 +241,9 @@ externC void cyg_thread_set_priority( #endif } + +/* Get the normal priority, ie without any applied mutex inheritance or + * ceiling protocol. */ externC cyg_priority_t cyg_thread_get_priority(cyg_handle_t thread) { #ifdef CYGIMP_THREAD_PRIORITY @@ -250,6 +253,18 @@ externC cyg_priority_t cyg_thread_get_pr #endif } + +/* Get the current priority, ie any applied mutex inheritance or + * ceiling protocol. */ +externC cyg_priority_t cyg_thread_get_current_priority(cyg_handle_t thread) +{ +#ifdef CYGIMP_THREAD_PRIORITY + return ((Cyg_Thread *)thread)->get_current_priority(); +#else + return 0; +#endif +} + /* Deadline scheduling control (optional) */ externC void cyg_thread_deadline_wait( @@ -910,7 +925,7 @@ externC void cyg_mutex_set_ceiling( #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC externC void cyg_mutex_set_protocol( cyg_mutex_t *mutex, - enum cyg_protcol protocol ) + enum cyg_mutex_protocol protocol ) { ((Cyg_Mutex *)mutex)->set_protocol((Cyg_Mutex::cyg_protcol)protocol); }
--- a/packages/kernel/current/src/sched/mlqueue.cxx +++ b/packages/kernel/current/src/sched/mlqueue.cxx @@ -490,7 +490,7 @@ Cyg_Scheduler_Implementation::timeslice( #else - if( --timeslice_count[CYG_KERNEL_CPU_THIS()] ) + if( --timeslice_count[CYG_KERNEL_CPU_THIS()] == 0 ) timeslice_cpu(); #endif
--- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,33 @@ +2001-08-17 Gary Thomas <gthomas@redhat.com> + + * src/version.c: Augment version information with startup mode. + + * src/flash.c (fis_find_free): Fix error in size comparisons. + (load_flash_config): Fix 'fconfig' alignment now that it's + size is no longer fixed. + +2001-08-16 Jesper Skov <jskov@redhat.com> + [from branch] + * cdl/redboot.cdl: Also behave as ROM monitor in ROMRAM + configurations. + + * src/load.c (do_load): Fix handling of conditional options. + + * src/flash.c (fis_load): Fix handling of conditional options. + (fis_delete): Fix behavior on failure. + + * src/flash.c (fis_write): Fix output. + (fis_create): Only update directory when programming succeeded. + +2001-08-17 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/redboot.cdl (CYGSEM_REDBOOT_VARIABLE_BAUD_RATE): Default + on, but only if platform supports it. + +2001-08-15 Mark Salter <msalter@redhat.com> + + * src/io.c: Add support for "{...}" notation in boot scripts. + 2001-08-14 Jonathan Larmour <jlarmour@redhat.com> * src/io.c (gets): Allow $'s and +'s to be escaped.
--- a/packages/redboot/current/cdl/redboot.cdl +++ b/packages/redboot/current/cdl/redboot.cdl @@ -175,7 +175,8 @@ cdl_package CYGPKG_REDBOOT { cdl_option CYGSEM_REDBOOT_VARIABLE_BAUD_RATE { display "Allow RedBoot to adjust the baud rate on the serial console." flavor bool - default_value 0 + default_value 1 + active_if CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT description " If this option is enabled then RedBoot will support commands to set and query the baud rate on the selected console." @@ -525,7 +526,7 @@ cdl_package CYGPKG_REDBOOT { cdl_option CYGPRI_REDBOOT_ROM_MONITOR { display "Behave like a ROM monitor" - active_if { CYG_HAL_STARTUP == "ROM" } + active_if { CYG_HAL_STARTUP == "ROM" || CYG_HAL_STARTUP == "ROMRAM" } requires CYGSEM_HAL_ROM_MONITOR calculated 1 no_define
--- a/packages/redboot/current/src/flash.c +++ b/packages/redboot/current/src/flash.c @@ -418,7 +418,7 @@ fis_find_free(unsigned long *addr, unsig if (*fis_ptr != (unsigned long)0xFFFFFFFF) { if (area_start != fis_ptr) { // Assume that this is something - if ((fis_ptr-area_start) >= length) { + if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) { *addr = (unsigned long)area_start; return true; } @@ -437,7 +437,7 @@ fis_find_free(unsigned long *addr, unsig } } if (area_start != fis_ptr) { - if ((fis_ptr-area_start) >= length) { + if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) { *addr = (unsigned long)area_start; return true; } @@ -462,7 +462,7 @@ fis_create(int argc, char *argv[]) struct fis_image_desc *img; bool slot_found, defaults_assumed; struct option_info opts[7]; - bool prog_ok; + bool prog_ok = false; init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, (void **)&mem_addr, (bool *)&mem_addr_set, "memory base address"); @@ -553,7 +553,7 @@ fis_create(int argc, char *argv[]) printf(" valid range is %p-%p\n", (void *)ram_start, (void *)ram_end); } if (!flash_addr_set && !fis_find_free(&flash_addr, length)) { - printf("Can't locate %ld bytes free in FLASH\n", length); + printf("Can't locate %lx(%ld) bytes free in FLASH\n", length, length); return; } } @@ -620,34 +620,36 @@ fis_create(int argc, char *argv[]) } } } - // Update directory - memset(img, 0, sizeof(*img)); - strcpy(img->name, name); - img->flash_base = flash_addr; - img->mem_base = exec_addr_set ? exec_addr : (flash_addr_set ? flash_addr : mem_addr); - img->entry_point = entry_addr_set ? entry_addr : (unsigned long)entry_address; // Hope it's been set - img->size = length; - img->data_length = img_size; + if (prog_ok) { + // Update directory + memset(img, 0, sizeof(*img)); + strcpy(img->name, name); + img->flash_base = flash_addr; + img->mem_base = exec_addr_set ? exec_addr : (flash_addr_set ? flash_addr : mem_addr); + img->entry_point = entry_addr_set ? entry_addr : (unsigned long)entry_address; // Hope it's been set + img->size = length; + img->data_length = img_size; #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK - img->file_cksum = crc32((unsigned char *)flash_addr, img_size); + img->file_cksum = crc32((unsigned char *)flash_addr, img_size); #endif #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is unlocked before trying to update - flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); + // Insure [quietly] that the directory is unlocked before trying to update + flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); #endif - if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { - printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - // Don't try to program if the erase failed - } else { - // Now program it - if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { - printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { + printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); + // Don't try to program if the erase failed + } else { + // Now program it + if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { + printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + } } +#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL + // Insure [quietly] that the directory is locked after the update + flash_lock((void *)fis_addr, block_size, (void **)&err_addr); +#endif } -#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is locked after the update - flash_lock((void *)fis_addr, block_size, (void **)&err_addr); -#endif } static void @@ -707,26 +709,27 @@ fis_delete(int argc, char *argv[]) // Erase Data blocks (free space) if ((stat = flash_erase((void *)img->flash_base, img->size, (void **)&err_addr)) != 0) { printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - } + } else { #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is unlocked before trying to update - flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); + // Insure [quietly] that the directory is unlocked before trying to update + flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); #endif - // Update directory - memset(img, 0xFF, sizeof(*img)); - if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { - printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - // Don't try to program if the erase failed - } else { - // Now program it - if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { - printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + // Update directory + memset(img, 0xFF, sizeof(*img)); + if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { + printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); + // Don't try to program if the erase failed + } else { + // Now program it + if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { + printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + } } +#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL + // Insure [quietly] that the directory is locked after the update + flash_lock((void *)fis_addr, block_size, (void **)&err_addr); +#endif } -#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is locked after the update - flash_lock((void *)fis_addr, block_size, (void **)&err_addr); -#endif } static void @@ -752,7 +755,7 @@ fis_load(int argc, char *argv[]) (void **)&show_cksum, (bool *)0, "display checksum"); num_options = 2; #ifdef CYGPKG_COMPRESS_ZLIB - init_opts(&opts[2], 'd', false, OPTION_ARG_TYPE_FLG, + init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, (void **)&decompress, 0, "decompress"); num_options++; #endif @@ -877,7 +880,7 @@ fis_write(int argc, char *argv[]) printf("Can't program this region - contains code in use!\n"); return; } - if (!verify_action("* CAUTION * about to program FLASH at %p..%p from %p", + if (!verify_action("* CAUTION * about to program FLASH\n at %p..%p from %p", (void *)flash_addr, (void *)(flash_addr+length-1), (void *)mem_addr)) { return; // The guy gave up @@ -1851,7 +1854,7 @@ load_flash_config(void) #define _roundup(n,s) ((((n)+(s-1))/s)*s) cfg_size = (block_size > sizeof(config)) ? sizeof(config) : _roundup(sizeof(config), block_size); - cfg_base = (void *)((unsigned long)flash_end - (cfg_size+fisdir_size)); + cfg_base = (void *)((unsigned long)flash_end - _roundup(cfg_size+fisdir_size, block_size)); memcpy(&config, cfg_base, sizeof(config)); if ((crc32((unsigned char *)&config, sizeof(config)-sizeof(config.cksum)) != config.cksum) || (config.key1 != CONFIG_KEY1)|| (config.key2 != CONFIG_KEY2)) {
--- a/packages/redboot/current/src/io.c +++ b/packages/redboot/current/src/io.c @@ -228,6 +228,52 @@ mon_set_read_char_timeout(int ms) } } +#ifdef CYGFUN_REDBOOT_BOOT_SCRIPT +#define __STRINGIFY(x) #x +#define _STRINGIFY(x) __STRINGIFY(x) +#define _STARTUP_STR _STRINGIFY(CYG_HAL_STARTUP) "}" + +// +// Read a character from script. +// Return true if script character found, false if not. +// +static int +getc_script(char *cp) +{ + static bool newline = true; + bool skip; + + while (script && *script) { + if (newline && *script == '{') { + skip = false; + ++script; + + // skip if it isn't for this startup type + if (strncmp(script, _STARTUP_STR, strlen(_STARTUP_STR))) + skip = true; + + // skip past "{...}" + while (*script && *script++ != '}') + ; + + // skip script line if neccessary + if (skip) { + while (*script && *script++ != '\n') + ; + } else + newline = false; + + } else { + *cp = *script++; + if (*cp == '\n') + newline = true; + return true; + } + } + return false; +} +#endif + // // Read a line of input from the user // Return: @@ -246,10 +292,9 @@ gets(char *buf, int buflen, int timeout) while (true) { #ifdef CYGFUN_REDBOOT_BOOT_SCRIPT - if (script && *script) { - c = *script++; + if (getc_script(&c)) do_idle(false); - } else + else #endif if ((timeout > 0) && (ptr == buf)) { mon_set_read_char_timeout(timeout);
--- a/packages/redboot/current/src/load.c +++ b/packages/redboot/current/src/load.c @@ -309,12 +309,12 @@ do_load(int argc, char *argv[]) (void **)&mode_str, (bool *)&mode_str_set, "download mode (TFTP, xyzMODEM, or disk)"); num_options = 4; #ifdef CYGPKG_REDBOOT_NETWORKING - init_opts(&opts[4], 'h', true, OPTION_ARG_TYPE_STR, + init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR, (void **)&hostname, (bool *)&hostname_set, "host name (IP address)"); num_options++; #endif #ifdef CYGPKG_COMPRESS_ZLIB - init_opts(&opts[5], 'd', false, OPTION_ARG_TYPE_FLG, + init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, (void **)&decompress, 0, "decompress"); num_options++; #endif
--- a/packages/redboot/current/src/version.c +++ b/packages/redboot/current/src/version.c @@ -75,8 +75,9 @@ #define _s(x) __s(x) char RedBoot_version[] CYGBLD_ATTRIB_WEAK = - "\nRedBoot(tm) bootstrap and debug environment, version " - _s(_REDBOOT_VERSION) " - built " __TIME__ ", " __DATE__ "\n\n"; + "\nRedBoot(tm) bootstrap and debug environment [" _s(CYG_HAL_STARTUP) "]" + "\n version " _s(_REDBOOT_VERSION) + " - built " __TIME__ ", " __DATE__ "\n\n"; // Override default GDB stubs 'info' // Note: this can still be a "weak" symbol since it will occur in the .o
