changeset 179:391299f9e541

Merge from eCos master repository on 2001-08-17-16:31:54-BST
author jlarmour
date Fri, 17 Aug 2001 16:37:36 +0000
parents aa8364213009
children 2bdd82a025e1
files packages/devs/eth/arm/edb7xxx/current/ChangeLog packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c packages/devs/eth/arm/iq80310/current/ChangeLog packages/devs/eth/arm/iq80310/current/src/if_iq80310.c packages/devs/flash/amd/am29xxxxx/current/ChangeLog packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl packages/devs/flash/intel/28fxxx/current/ChangeLog packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx.inl packages/devs/flash/intel/28fxxx/current/include/flash_28fxxx_parts.inl packages/hal/arm/at91/current/ChangeLog packages/hal/arm/at91/current/include/hal_platform_ints.h packages/hal/arm/iq80310/current/ChangeLog packages/hal/arm/iq80310/current/include/hal_iq80310.h packages/hal/arm/iq80310/current/src/diag/flash.c packages/hal/arm/sa11x0/brutus/current/ChangeLog packages/hal/arm/sa11x0/brutus/current/include/plf_mmap.h packages/hal/common/current/ChangeLog packages/hal/common/current/cdl/debugging.cdl packages/hal/common/current/cdl/hal.cdl packages/hal/common/current/include/hal_if.h packages/hal/common/current/src/hal_if.c packages/hal/mn10300/stb/current/ChangeLog packages/hal/mn10300/stb/current/src/hal_diag.c packages/hal/mn10300/stb/current/src/plf_misc.c packages/io/eth/current/ChangeLog packages/io/eth/current/cdl/eth_drivers.cdl packages/io/eth/current/src/net/eth_drv.c packages/io/eth/current/src/stand_alone/eth_drv.c packages/io/serial/current/ChangeLog packages/io/serial/current/tests/ser_test_protocol.inl packages/kernel/current/ChangeLog packages/kernel/current/include/kapi.h packages/kernel/current/src/common/kapi.cxx packages/kernel/current/src/sched/mlqueue.cxx packages/redboot/current/ChangeLog packages/redboot/current/cdl/redboot.cdl packages/redboot/current/src/flash.c packages/redboot/current/src/io.c packages/redboot/current/src/load.c packages/redboot/current/src/version.c
diffstat 40 files changed, 811 insertions(+), 274 deletions(-) [+]
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 = &eth_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 = &eth_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 = &eth_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 = &eth_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